Pregunta

¿Cómo se implementa en la precedencia de operadores antlr?

Estoy usando el paquete xtext / Antlr en este momento.

Editar:

Hice lo sepp2k sugirió, y precedencia de los operadores funciona ahora, pero cosas como 3 + * También trabajo ahora. Los operadores son, básicamente, "cayendo a través" del árbol.

Además, me trataron de la gramática C en el sitio web de antlr y lo mismo sucedió en ANTLRworks.

Alguien sabe cuál es el problema?

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

AndOp:
  'and'? ComparisonOp;

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

ConcatOp:
  '..'? AddSubOp;

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

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

ExpOp:
  '^'? expr=Expression;
¿Fue útil?

Solución

Con antlr que codifican la precedencia en las reglas gramaticales. Como:

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

Esto analizar "1 + 2 * 3 + (4 * 5 + 6)" como "(1 + (2 * 3)) + ((4 * 5) + 6)"

Otros consejos

Desde utiliza xtext, me gustaría recomendar el uso del concepto de acción xtext. Es decir, una gramática de expresión simple sería típicamente un aspecto similar a este:

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, eche un vistazo a la docs para más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top