如何运算符优先级在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;
有帮助吗?

解决方案

使用ANTLR你编码的优先级中的语法规则。像:

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

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

其他提示

由于您使用的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;

请看看在文档了解详情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top