ANTLR运算符优先级
-
12-09-2019 - |
题
如何运算符优先级在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;
请看看在文档了解详情。
不隶属于 StackOverflow