Приоритет оператора ANTLR - PullRequest
       7

Приоритет оператора ANTLR

8 голосов
/ 20 сентября 2009

Как реализуется приоритет оператора в 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;

Ответы [ 2 ]

12 голосов
/ 20 сентября 2009

С помощью ANTLR вы кодируете приоритет в правилах грамматики. Как:

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

Это будет обрабатывать "1 + 2 * 3 + (4 * 5 + 6)" как "(1 + (2 * 3)) + ((4 * 5) + 6)"

3 голосов
/ 27 апреля 2011

Поскольку вы используете 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;

Пожалуйста, ознакомьтесь с документами для подробностей.

...