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