从ANTLR语法生成AST

时间:2012-03-02 16:52:23

标签: antlr antlr3 antlrworks

对于question和@BartKiers建议的语法(谢谢!),我添加了options块来指定输出

options{
language=Java;
output=AST;
ASTLabelType=CommonTree;
}

但是,我无法弄清楚如何访问输出,即AST。我需要遍历树并处理输入中指定的每个操作。


使用您的示例here,我正在尝试实现返回值的规则。但是,我遇到了以下错误:

relational    returns [String val]                   
        :  STRINGVALUE ((operator)^ term)?
            {val = $STRINGVALUE.text + $operator.text + $term.text; }
                                    ;

term returns [String rhsOperand]                    
        :  QUOTEDSTRINGVALUE  {rhsOperand = $QUOTEDSTRINGVALUE.text;}
                                    |  NUMBERVALUE               {rhsOperand = $NUMBERVALUE.text; }
                                    | '(' condition ')'
                                     ;

编译错误:

Checking Grammar RuleGrammarParser.g...
\output\RuleGrammarParser.java:495: cannot find symbol
symbol  : variable val
location: class RuleGrammarParser
            val = (STRINGVALUE7!=null?STRINGVALUE7.getText():null) + (operator8!=null?input.toString(operator8.start,operator8.stop):null) + (term9!=null?input.toString(term9.start,term9.stop):null); 
            ^
\output\RuleGrammarParser.java:612: cannot find symbol
symbol  : variable rhsOperand
location: class RuleGrammarParser
                    rhsOperand = (QUOTEDSTRINGVALUE10!=null?QUOTEDSTRINGVALUE10.getText():null);
                    ^
\output\RuleGrammarParser.java:632: cannot find symbol
symbol  : variable rhsOperand
location: class RuleGrammarParser
                    rhsOperand = (NUMBERVALUE11!=null?NUMBERVALUE11.getText():null); 
                    ^
3 errors

你能帮我理解为什么这不能编译吗?


添加了pastebin:http://pastebin.com/u1Bv3L0A

1 个答案:

答案 0 :(得分:4)

只需将output=AST添加到options部分,就不会创建AST,而是创建一个平面的1维标记列表。要将某些令牌标记为root(或子),您需要做一些工作。

Checkout this answer,解释了如何创建正确的AST 来访问解析器随后生成的树(CommonTree tree方法中的main我提到的答案。)

请注意,您可以安全地删除language=Java;:默认情况下,目标语言是Java(尽管将其留在那里没有坏处。)