所以我的原则是令牌空当匹配语法规则,虽然符合
/* Addition and subtraction have the lowest precedence. */
additionExp returns [double value]
: m1=multiplyExp {$value = $m1.value;}
(op=AddOp m2=multiplyExp)* {
if($op != null){ // test if matched
if($op.text == "+"){
$value += $m2.value;
}else{
$value -= $m2.value;
}
}
}
;
AddOp : '+' | '-' ;
我的测试IST 3 + 4
但op.text总是返回NULL,从来没有一个字符。
有谁知道我如何测试AddOp的价值?
在从ANTLR4 Actions and Attributes的例子它应该工作:
stat: ID '=' INT ';'
{
if (!$block::symbols.contains($ID.text)) {
System.err.println("undefined variable: "+$ID.text);
}
}
| block
;
有相当多的事情不正确,据我所知。 ANTLR工具是否接受你的语法?我认为它应该会产生'additionExp'工具的错误,因为actions/embedded-code必须放在替代的末尾。另外,'$ op!= null'也会触发一个错误,不是?最后,你使用'=='比较字符串('$ op.text ==“+”'),这是不正确的(参见:http://stackoverflow.com/questions/767372/java-string-equals-与)。 –
@BartKiers它可以正常工作,你可以从发布的例子中看到。但是你在字符串比较上是正确的。我需要'.equals'而不是'=='。 – RedX
你会惊讶有多少人发布一些不反映他们实际代码的代码片段。 B.t.w.,我只是注意到你把嵌入式代码放在'(...)*'之外。这应该在里面。 –