如何在ANTLR中实现运算符优先级?

我目前正在使用XText/Antlr包。

编辑:

我做了sepp2k的建议,并且运算符优先级现在可以使用,但是3 + *之类的东西现在也可以使用。运算符(operator)基本上是在“跌倒”这棵树。

另外,我在ANTLR的网站上尝试了C语法,在ANTLRworks中也发生了同样的事情。

有人知道这是什么问题吗?

BinaryExpression:
  'or'? AndOp; //or op

AndOp:
  'and'? ComparisonOp;

ComparisonOp:
  ('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;

ConcatOp:
  '..'? AddSubOp;

AddSubOp:
  ('+' | '-')? MultDivOp;

MultDivOp:
  ('*' | '/')? ExpOp;

ExpOp:
  '^'? expr=Expression;

最佳答案

使用Xtext/ANTLR 3,您可以在语法规则中对优先级进行编码,如下所示:

Expr:  mult ('+' mult)* ;
Mult:  atom ('*' atom)* ;
Atom:  INT | '(' expr ')' ;
这会将“1 + 2 * 3 +(4 * 5 + 6)”解析为“(1 +(2 * 3))+((4 * 5)+ 6)”

关于compiler-construction - ANTLR运算符优先级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1451728/

10-12 13:03
查看更多