我想编写一个解析器生成器用于教育目的,并想知道是否有一些很好的在线资源或教程解释如何编写一个.杰克·克伦肖(Jack Crenshaw)的"让我们编写一个编译器".
我想为LR(1)语法编写解析器生成器.
我对生成动作和goto表背后的理论有了不错的理解,但是想要一些能帮助我实现它的资源.
首选语言是C/C++,Java,即使其他语言也可以.
谢谢.
我已经使用了antlr和javacc/freecc一段时间了.现在我需要使用antlr语法编写一堆解析器,但是这样的解析器需要用ruby lang编写.
我用谷歌搜索但没有找到.是否有任何ruby解析器生成器采用antlr语法并创建解析器?如果有很多,你认为哪一个最好?
TIA保罗
我正在寻找一个解析器生成器工具,它提供C#输出并且相当快.我的目标是像文本一样解析JSON并从中创建CLR对象.我使用了GOLD Parser引擎,但事实证明它对我的需求很慢.任何人都可以建议我一个好的和快速的解析器生成器工具,它发出C#代码?我听说过Irony和ANTLR,但没有经验.它们生成相当快的解析器还是有更好的选择?
如何将一个aditional参数(不是类型的标记辅助YYSTYPE)传递给yypush_parse()函数?
解析器确实是可重入的,但是这个aditional变量对于我需要集成解析器的应用程序的线程安全性至关重要(它是PHP扩展,所以我们讨论的是TSRM).
我不能只是摆脱那个参数,因为在动作代码中我将调用函数,这些函数将以用户可访问的形式生成AST.
我试图破解YYPUSH_DECLS它并且就声明函数而言它起作用,但是几千个LOC下来实现了yypush_parse,我看不到任何方法来覆盖函数签名的实现yypush_parse开始.
YYPARSE_PARAM 仅在解析器不是推送器时使用(据我所知),但在我的情况下,我需要它是因为我必须在处理循环中执行的操作,在lexing之后和添加新的之前令牌到解析堆栈.
所以我想知道是否有%directive可能有所帮助的东西.
另一方面YYPARSE_PARAM,无论它是什么类型的解析器,我都认为应该根据它的定义使用它.遗憾的是,它不是.
我正在阅读文档中的这个页面,并注意到它说
这是完整的Python语法,因为它由解析器生成器读取并用于解析Python源文件
但是,我很难找到CPython使用的解析器生成器.那么CPython使用什么解析器生成器呢?是否有其他解析器生成器可以在该页面上进行语法而不进行任何修改?
这更像是一个"原则上"问题,而不是一个实际问题.是Yacc减少产生的顺序,并从定义的词法分析器中读取新的标记.也就是说,如果我有以下一组令牌:
INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE
Run Code Online (Sandbox Code Playgroud)
Yacc可以在其语义中读取LESS_THAN词法分析器中的令牌,然后将其缩减INTEGER BEGIN INTEGER_VALUE为单个内容,给出一组产生,例如:
expr : expr LESS_THAN expr
| integer
integer : INTEGER_BEGIN INTEGER_VALUE
Run Code Online (Sandbox Code Playgroud)
如果使用语义操作定义了这些更改的规则吗?
我想创建一个解析器/词法分析器来编译我的模板引擎.我正在使用PHP_ParserGenerator和PHP_LexerGenerator.正如他们的文档中所解释的那样,我创建了一个词法分析器并且正在运行.但是当我尝试编写解析器时,我还没有理解他们的文档.我阅读了Lemon解析器文档,但我的代码仍无效.:(
我发现这个例子包含lexer/parser的"Hello world",我读了XenForo,vBulletin,Smarty的解析器/词法分析器.在"Hello world"示例中它很简单,但是当我尝试将语法规则分组时,就像在Xenforo中完成一样,TAG_OPEN tag_attributes TAG_SELF_CLOSE我的解析器无法正常工作.
/* 0 */ "start ::= in",
/* 1 */ "in ::= in PLAIN_TEXT",
/* 2 */ "in ::= in curly",
/* 3 */ "in ::= in tag",
/* 4 */ "in ::= in TAG_COMMENT",
/* 5 */ "in ::= in TAG_CLOSE",
/* 6 */ "in ::=",
/* 7 */ "tag ::= TAG_OPEN tag_attributes TAG_SELF_CLOSE",
/* 8 */ "tag ::= TAG_OPEN tag_attributes TAG_END",
/* 9 */ "tag_attributes …Run Code Online (Sandbox Code Playgroud) 我有一个编写简单解析器生成器的任务,所以我编写了类似ANTLR的语法并试图解析像"foo:bar;"这样的简单文件,但得到了以下输出:
[@0,0:2='foo',<1>,1:0]
[@1,3:3=':',<16>,1:3]
[@2,4:6='bar',<1>,1:4]
[@3,7:7=';',<18>,1:7]
[@4,8:7='<EOF>',<-1>,1:8]
line 1:0 no viable alternative at input 'foo'
(rule foo : bar ;)
Run Code Online (Sandbox Code Playgroud)
我的语法看起来像
grammar parsGen;
gram : rule SEMICOLON (NEWLINE+ rule SEMICOLON)* ;
rule : lRule | pRule ;
lRule : LRULEID COLON lRule1 ;
lRule1 : (((LRULEID | STRING | SET) | LBRACE lRule1 PIPE lRule1 RBRACE) modificator? SPACE+)+ ;
pRule : PRULEID COLON pRule1 ;
pRule1 : (((LRULEID | PRULEID) | LBRACE lRule1 PIPE lRule1 RBRACE) modificator? SPACE+)+ ;
modificator : …Run Code Online (Sandbox Code Playgroud) 我理解LL递归下降解析器如何处理这种形式的规则:
A = B*;
Run Code Online (Sandbox Code Playgroud)
根据前瞻标记是否与第一组B中的终端匹配,使用一个简单的循环检查是否继续循环.但是,我对基于表的LL解析器感到好奇:这种形式的规则如何在那里工作?据我所知,在一个中处理重复的唯一方法是通过右递归,但是在不需要右关联解析树的情况下会混淆相关性.
我想知道,因为我正在尝试编写一个LL(1)基于表的解析器生成器,我不知道如何在不改变预期的解析树形状的情况下处理这样的情况.