Antlr Prioridad de los operadores
-
12-09-2019 - |
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;
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.