ANTLR运算符优先级

时间:2009-09-20 18:57:51

标签: compiler-construction antlr xtext

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

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

编辑:

我做了sepp2k建议的内容,运算符优先级现在可以正常工作,但是像3 + *这样的东西现在也可以工作了。操作员基本上“摔倒”了树。

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

任何人都知道这是什么问题?

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

AndOp:
  'and'? ComparisonOp;

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

ConcatOp:
  '..'? AddSubOp;

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

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

ExpOp:
  '^'? expr=Expression;

2 个答案:

答案 0 :(得分:11)

使用ANTLR,您可以编码语法规则中的优先级。像:

expr:  mult ('+' mult)* ;
mult:  atom ('*' atom)* ;
atom:  INT | '(' expr ')' ;

这会将“1 + 2 * 3 +(4 * 5 + 6)”解析为“(1 +(2 * 3))+((4 * 5)+ 6)”

答案 1 :(得分:3)

由于你使用Xtext,我建议使用Xtext的动作概念。 也就是说,简单的表达式语法通常看起来与此类似:

Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;

请查看docs了解详情。