11

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;
4

2 回答 2

15

使用 Xtext / ANTLR 3,您可以像这样对语法规则中的优先级进行编码:

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

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

于 2009-09-20T19:18:37.637 回答
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;

请查看文档以获取详细信息。

于 2011-04-26T20:13:37.730 回答