如何使用ANTLRWorks创建/指定用于测试树语法的AST输入?

时间:2012-01-19 21:45:23

标签: antlr antlr3 antlrworks

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

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

P.S。 我在Does anyone know of a way to debug tree grammars in ANTLRWorks研究了问题/答案,但它没有回答我的问题。尽管被OP接受,他也发表了类似的评论。

1 个答案:

答案 0 :(得分:3)

  

在使用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.gASTDemoWalker.g放在同一个文件夹中。在ANTLRWorks中打开两个语法并生成词法分析器&首先通过按 CTRL + SHIFT + G ASTDemo.g解析,然后打开ASTDemoWalker.g并生成树助行器按 CTRL + SHIFT + G

现在,在ASTDemoWalker.g编辑器面板中,按 CTRL + D 启动调试器,并将以下源粘贴到文本区域中:

42 * ((a + 3) / -3.14)

然后按确定

您现在可以逐步完成调试过程,最后,您可以看到解析器生成的AST:

enter image description here

以及树步行者如何走过AST说:

enter image description here

如果您现在在树语法中出现“意外”错误,请说明^('*' expression expression)而不是^('*' expression)42。如果再次调试树语法,则在传递42节点后会看到它失败:

enter image description here

在AST中,在42节点之后还有另一个节点,而树步行器在*根节点之后只需要1个单节点({{1}})。

当然,这是一个简单的语法,但即使你熟悉ANTLR,它有时也是@ $& amp;跟踪树语法中的错误! :)