针对问题和由@BartKiers建议的语法(谢谢!),我添加了options
块以指定输出内容
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
请问您能帮我理解为什么这个代码编译失败吗?
添加了Pastebin:http://pastebin.com/u1Bv3L0A
$
。 - name_masked$
符号,但在ANTLR 3.4(也许3.3也是)中,它现在是必需的。请注意,在我提供的教程中使用的是ANTLR 3.2,它与教程中发布的所有代码都兼容,所以我不打算做太多改动:我可能会意外地破坏一些东西。当然很高兴听到你解决了问题。 - Bart Kierscondition1
这样的输入,其中condition1
可能是NAME = "BATMAN"
,我会得到返回值,但是对于多个条件,例如NAME = "BATMAN" AND SSN = 0000
,返回值仅为第一个条件而不是第二个条件。你能帮我吗? - name_masked