Antlr 如何创建/指定AST输入,以便使用AntlWorks测试树语法?

Antlr 如何创建/指定AST输入,以便使用AntlWorks测试树语法?,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,背景:我创建了一个ANTLR语法。我能够用ANTLRWorks测试和调试它,并且已经验证了解析器创建了我心目中的AST。现在,我想为AST编写一个树语法,解析树并用ANTLRWorks调试树语法 问题:我想用ANTLRWorks测试和调试树语法。因此,我想解析由解析器创建的AST。使用AntlWorks测试树语法时,如何将AST指定为输入? 附言。 我已经研究了这个问题/答案,但它没有回答我的问题。虽然OP接受了他的意见,但他也发表了类似的评论 在使用ANTLRWorks测试树语法时,如何将AS

背景:我创建了一个ANTLR语法。我能够用ANTLRWorks测试和调试它,并且已经验证了解析器创建了我心目中的AST。现在,我想为AST编写一个树语法,解析树并用ANTLRWorks调试树语法

问题:我想用ANTLRWorks测试和调试树语法。因此,我想解析由解析器创建的AST。使用AntlWorks测试树语法时,如何将AST指定为输入?

附言。 我已经研究了这个问题/答案,但它没有回答我的问题。虽然OP接受了他的意见,但他也发表了类似的评论

在使用ANTLRWorks测试树语法时,如何将AST指定为输入

您不需要自己提供AST,只需要生成AST的解析器

给定以下生成AST的语法:

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,当然欢迎你。不,我还没有从一本书开始:),我想我会坚持偶尔写一次博客,然后回答问题。