我写了以下内容来处理算术中的基本二进制运算:
grammar Calc;
expression
: OPERAND (BIN_OP expression)*
;
// 12 or .12 or 2. or 2.38
OPERAND
: [0-9]+ ('.' [0-9]*)?
| '.' [0-9]+
;
BIN_OP
: [-+/*]
;
现在我可以做这样的事情:
0.9+2.4*3.6
然而,通常如何使用antlr处理操作顺序和括号?例如:
- 如果我想写
(0.9+2.4)*3.6
怎么办 - 或者,如果我想写
((0.9+2.4)*3.6)
呢 - 最后,要捕获不匹配的parens的无效情况,
(((((0.9+2.4)*3.6))
在antlr中通常是如何处理的?
ANTLR4带来的一个非常好的东西是能够通过对规则中的备选方案进行排序来轻松地表示优先级。
试试类似的东西:
grammar Calc;
expression
: '(' expression ')' # parenExpr
: expression (MUL_OP | DIV_OP) expression # mulDivExpr
: expression (ADD_OP | SUB_OP) expressions # addSubExpr
: OPERAND # operandExpr
;
// 12 or .12 or 2. or 2.38
OPERAND
: [0-9]+ ('.' [0-9]*)?
| '.' [0-9]+
;
SUB_OP: '-';
ADD_OP: '+';
DIV_OP: '/';
MUL_OP: '*';
;