Приоритет оператора ANTLR
-
12-09-2019 - |
Вопрос
Как в ANTLR реализован приоритет операторов?
Сейчас я использую пакет XText/Antlr.
Редактировать:
Я сделал то, что предложил sepp2k, и приоритет операторов теперь работает, но теперь также работают такие вещи, как 3 +*.Операторы по сути «проваливаются» сквозь дерево.
Кроме того, я попробовал грамматику C на сайте ANTLR, и то же самое произошло в 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;
Пожалуйста, взгляните на документы для получения подробной информации.