【发布时间】:2011-05-04 19:24:11
【问题描述】:
我正在使用 ANTLRWorks 1.4.2 创建一个简单的语法,用于将用户提供的表达式评估为布尔结果。这最终将成为更大语法的一部分,但我对当前的片段有一些疑问。我希望用户能够使用以下表达式:
2 > 12 > 1 and 3 < 1(2 > 1 or 1 < 3) and 4 > 1(2 > 1 or 1 < 3) and (4 > 1 or (2 < 1 and 3 > 1))
前两个表达式在我的语法中是合法的,但后两个不是,我不知道为什么。此外,ANTLRworks 似乎暗示 ((((1 > 2) 等括号不匹配的输入是合法的,我不知道为什么。所以,我似乎错过了一些关于在语法中处理括号分组的正确方法的见解。
如何更改语法以正确处理括号?
我的语法如下:
grammar conditional_test;
boolean
: boolean_value_expression
EOF
;
boolean_value_expression
: boolean_term (OR boolean_term)*
EOF
;
boolean_term
: boolean_factor (AND boolean_factor)*
;
boolean_factor
: (NOT)? boolean_test
;
boolean_test
: predicate
;
predicate
: expression relational_operator expression
| LPAREN boolean_value_expression RPAREN
;
relational_operator
: EQ
| LT
| GT
;
expression
: NUMBER
;
LPAREN : '(';
RPAREN : ')';
NUMBER : '0'..'9'+;
EQ : '=';
GT : '>';
LT : '<';
AND : 'and';
OR : 'or' ;
NOT : 'not';
【问题讨论】: