Pergunta

Como é a precedência de operador implementado em ANTLR?

Eu estou usando o pacote xtext / Antlr no momento.

Editar:

Eu fiz o que sepp2k sugeriu, e precedência de operadores funciona agora, mas coisas como 3 + * também funcionar agora. Os operadores são, basicamente, "caindo" da árvore.

Além disso, eu tentei a gramática C no site da ANTLR ea mesma coisa aconteceu em ANTLRworks.

Alguém sabe qual é o problema?

BinaryExpression:
  'or'? AndOp; //or op

AndOp:
  'and'? ComparisonOp;

ComparisonOp:
  ('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;

ConcatOp:
  '..'? AddSubOp;

AddSubOp:
  ('+' | '-')? MultDivOp;

MultDivOp:
  ('*' | '/')? ExpOp;

ExpOp:
  '^'? expr=Expression;
Foi útil?

Solução

Com ANTLR você codificar a precedência nas regras gramaticais. Como:

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

Isto iria analisar "1 + 2 * 3 + (4 * 5 + 6)", tal como "(1 + (2 * 3)) + ((4 * 5) + 6)"

Outras dicas

Uma vez que você usa Xtext, eu recomendo usar o conceito de Xtext ação. Ou seja, uma gramática simples expressão normalmente semelhante a esta:

Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;

Por favor, dê uma olhada na docs para mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top