我正在尝试编写一个语法来评估一个方程式,该方程式可能会也可能不会被括号括起来。前 -
在我的规则中,我有
clause
: expression EOF
;
expression
:
LPAREN expression RPAREN #parenExpression
| isNumeric #isNumericExpression
| leftSide IS NOT? NULL #nullExpression
| compare #comparatorExpression
| NOT #notExpression
;
compare : NOT? LPAREN? NOT? leftSide op=comparator rightSide RPAREN? ;
现在,这有几个问题。
任何有关如何为这些规则编写语法的帮助都会非常有用。
提前致谢!
答案 0 :(得分:3)
从概念上讲,表达式(通常)是复杂的,即,递归或简单:
expression
: LPAREN expression RPAREN #parenExpression
| NOT expression #notExpression
| simpleExpression
;
simpleExpression
: isNumeric #isNumericExpression
| leftSide IS NOT? NULL #nullExpression
| leftSide op rightSide #comparatorExpression
;
第一个复合alt允许表达式周围的任何级别的平衡括号。第二个允许一个或多个NOT
s在任何表达式之前。
简单的alts代表表达式的最基本形式。
因此,(NOT (str1 matches 'hello'))
将与
parenExpression
- > notExpression
- > parenExpression
- > comparatorExpression
。
当然,这两条规则可以合二为一。