【发布时间】:2011-03-01 12:39:48
【问题描述】:
我正在尝试为个人项目创建布尔表达式语言/语法。用户将能够以类似 Java 的语法编写字符串,并提供变量,这些变量将在稍后初始化变量时进行评估。 雨 例如,用户可能输入字符串
@FOO+7 > 4*(5+@BAR);
稍后,当变量 FOO 被初始化并等于 6 并且 BAR 等于 1 时,表达式的计算结果为 13>24,因此返回 false。
我正在使用 ANTLRworks 生成语法,虽然它看起来不错,但它不能正确解释负号。 ANTLRworks 中的输入(由于某种原因)已更改:“(8-3)> 6”被读取为“(8> 6”(由于缺少右括号而无法运行)。我还没有实现变量查找还没有,但这里是目前仅适用于整数的语法:
grammar BooleanCalculator;
@header {
package test;
}
prog : rule+
;
rule : boolean_expr ';' NEWLINE {System.out.println($boolean_expr.b);}
| NEWLINE
;
boolean_expr returns [boolean b]
: v1=num_statement
('<' v2=num_statement {$b = $v1.d < $v2.d;}
|'<=' v2=num_statement {$b = $v1.d <= $v2.d;}
|'=' v2=num_statement {$b = $v1.d == $v2.d;}
|'!=' v2=num_statement {$b = !($v1.d == $v2.d);}
|'>=' v2=num_statement {$b = $v1.d >= $v2.d;}
|'>' v2=num_statement {$b = $v1.d > $v2.d;})
;
num_statement returns [double d]
: v1=mult_statement {$d = $v1.d;}
('+' v2=mult_statement {$d += $v2.d;}
|'-' v2=mult_statement {$d -= $v2.d;})* //HERE IS THE OFFENDING LINE
;
mult_statement returns [double d]
: v1=var {$d = $v1.d;}
('*' v2=var {$d *= $v2.d;}
|'/' v2=var {$d /= $v2.d;}
|'%' v2=var {$d = $d/100*$v2.d;})*
;
var returns [double d]
: NUMBER {$d = Double.parseDouble($NUMBER.text);}
| '(' v1=num_statement ')' {$d = $v1.d;}
;
NUMBER : '0'..'9'+
;
除“-”符号外,它对所有内容都正常工作。有谁知道解决这个问题的方法吗?
另外(我对 ANTLR 很陌生):我的评估是否正确?或者我应该让语法定义结构并使用另一种方法来确定语句是真还是假?
【问题讨论】:
标签: java antlr grammar lex antlrworks