从ANTLR语法生成AST

从ANTLR语法生成AST,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,对于@BartKiers(谢谢!)建议的语法和语法,我添加了选项块来指定要执行的输出 options{ language=Java; output=AST; ASTLabelType=CommonTree; } 但是,我无法确定如何访问输出,即AST。我需要遍历树并处理输入中指定的每个操作 使用您的示例,我尝试实现返回值的规则。但是,我遇到了以下错误: relational returns [String val] : STRIN

对于@BartKiers(谢谢!)建议的语法和语法,我添加了
选项
块来指定要执行的输出

options{
language=Java;
output=AST;
ASTLabelType=CommonTree;
}
但是,我无法确定如何访问输出,即
AST
。我需要遍历树并处理输入中指定的每个操作


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

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
你能帮我理解为什么这个编译器不能运行吗



通过简单地将
output=AST
添加到
options
部分,添加了pastebin:

,您不创建AST,而是创建一个简单的一维标记列表。要将某些标记标记为根(或子标记),您需要做一些工作

Checkout,它解释了如何创建一个适当的AST并访问解析器随后生成的树(我提到的答案的
main
方法中的
CommonTree


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

太棒了!为@BartKiers干杯!!(&那押韵:))你能帮我回答上面的问题吗?我已经更新了问题。巴特,找到了解决办法。也许您必须更新您的示例,使其包含规则中定义的所有变量的
$
。@darkie15,是的,在早期版本的ANTLR 3中,您可以安全地省略
$
,这在ANTLR 3.4中是强制性的(可能还有3.3)。请注意,在本教程中,我提供了ANTLR 3.2,它适用于本教程中发布的所有代码,因此我认为我不会做太多更改:我可能会意外地破坏某些东西。当然,很高兴听到你解决了你的问题。我再次陷入困境:(.我在帖子中附加了pastebin链接。基本上,我试图在解析器验证输入后将该条件作为返回值。因此,对于像
condition1
这样的输入,
condition1
可能是
NAME=“BATMAN”
,我会得到返回值,但对于多个条件,如
NAME=“BATMAN”和SSN=0000
,返回值只是第一个条件,而不是第二个条件。您能帮我一下吗