Antlr 如何创建/指定AST输入,以便使用AntlWorks测试树语法?
背景:我创建了一个ANTLR语法。我能够用ANTLRWorks测试和调试它,并且已经验证了解析器创建了我心目中的AST。现在,我想为AST编写一个树语法,解析树并用ANTLRWorks调试树语法 问题:我想用ANTLRWorks测试和调试树语法。因此,我想解析由解析器创建的AST。使用AntlWorks测试树语法时,如何将AST指定为输入? 附言。 我已经研究了这个问题/答案,但它没有回答我的问题。虽然OP接受了他的意见,但他也发表了类似的评论 在使用ANTLRWorks测试树语法时,如何将AST指定为输入 您不需要自己提供AST,只需要生成AST的解析器 给定以下生成AST的语法:Antlr 如何创建/指定AST输入,以便使用AntlWorks测试树语法?,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,背景:我创建了一个ANTLR语法。我能够用ANTLRWorks测试和调试它,并且已经验证了解析器创建了我心目中的AST。现在,我想为AST编写一个树语法,解析树并用ANTLRWorks调试树语法 问题:我想用ANTLRWorks测试和调试树语法。因此,我想解析由解析器创建的AST。使用AntlWorks测试树语法时,如何将AST指定为输入? 附言。 我已经研究了这个问题/答案,但它没有回答我的问题。虽然OP接受了他的意见,但他也发表了类似的评论 在使用ANTLRWorks测试树语法时,如何将AS
grammar ASTDemo;
options {
output=AST;
}
tokens {
ROOT;
U_MIN;
}
parse
: expression EOF -> ^(ROOT expression)
;
expression
: addition
;
addition
: multiplication (('+' | '-')^ multiplication)*
;
multiplication
: unary (('*' | '/')^ unary)*
;
unary
: '-' atom -> ^(U_MIN atom)
| atom
;
atom
: ID
| NUMBER
| '(' expression ')' -> expression
;
ID : ('a'..'z' | 'A'..'Z')+;
NUMBER : '0'..'9'+ ('.' '0'..'9'*)?;
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();};
下面是由上述语法生成的AST的树语法:
tree grammar ASTDemoWalker;
options {
output=AST;
tokenVocab=ASTDemo;
ASTLabelType=CommonTree;
}
parse
: ^(ROOT expression)
;
expression
: ^('+' expression expression)
| ^('-' expression expression)
| ^('*' expression expression)
| ^('/' expression expression)
| ^(U_MIN expression)
| atom
;
atom
: ID
| NUMBER
;
确保将ASTDemo.g
和astdemowerker.g
放在同一个文件夹中。在ANTLRWorks中打开这两个语法,首先按CTRL+SHIFT+g从ASTDemo.g
生成词法分析器和语法分析器,然后通过打开astdemovarker.g
并按CTRL+SHIFT+g生成树漫游器
现在,在astdemovarker.g
编辑器面板中,按CTRL+D启动调试器,并将以下源粘贴到文本区域:
42 * ((a + 3) / -3.14)
然后按OK
现在可以逐步完成调试过程,最后可以看到解析器生成的内容:
树行者是如何走过来的,他说:
如果您现在在树语法中犯了一个“意外”错误,比如说,您定义的不是^('*'表达式)
,而是^('*'表达式)
。如果再次调试树语法,您将看到它在通过42
节点后失败:
在AST中,在42
节点之后还有另一个节点,而树遍历器只希望在*
根节点之后有一个单个节点(42
)
当然,这是一个简单的语法,但即使您熟悉ANTLR,有时追踪树语法中的错误也是一件痛苦的事!:) 再次感谢您的宝贵帮助@Bart Kiers,我现在有了在ANTLRWorks中同时使用语法和树语法的想法。-说真的,如果你还没有开始,你应该写一本关于ANTLR的书。谢谢@ndroock1,当然欢迎你。不,我还没有从一本书开始:),我想我会坚持偶尔写一次博客,然后回答问题。