ANTLR运算符优先级

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;

Expression 的调用应该放在 '(' 和 ')' 之间。此外,您的运算符似乎都缺少左操作数。 - sepp2k
我通过使用我评论中找到的方法进行了修复。此外,将左操作数移动到第一个表达式以防止左递归。 - jameszhao00
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)”


也许我可以做像AndOp这样的东西:('and' Expression)| ComparisonOp - jameszhao00
为了澄清,语法规则越详细匹配的优先级就越高。在上面的例子中,“expr->multi->atom”比加号路径更详细。因此,“”路径具有优先权。 - Th 00 mÄ s

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;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接