ANTLR Opérateur Préséance
-
12-09-2019 - |
Question
Comment est la priorité des opérateurs mis en œuvre ANTLR?
J'utilise le paquet XText / Antlr pour le moment.
Edit:
Je l'ai fait ce que sepp2k a suggéré, et la priorité des opérateurs fonctionne maintenant, mais des choses comme 3 + * travaille aussi maintenant. Les opérateurs sont essentiellement « tomber dans » l'arbre.
En outre, j'ai essayé la grammaire C sur le site Web de ANTLR et la même chose est arrivé à ANTLRworks.
Quelqu'un sait ce que la question est?
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' | '-')? MultDivOp;
MultDivOp:
('*' | '/')? ExpOp;
ExpOp:
'^'? expr=Expression;
La solution
Avec ANTLR vous encodez la priorité dans les règles de grammaire. Comme:
expr: mult ('+' mult)* ;
mult: atom ('*' atom)* ;
atom: INT | '(' expr ')' ;
Cela analyser "1 + 2 * 3 + (4 * 5 + 6)" comme "(1 + (2 * 3)) + ((4 * 5) + 6)"
Autres conseils
Puisque vous utilisez Xtext, je vous recommande d'utiliser le concept d'action de Xtext. Autrement dit, une grammaire simple expression ressemblerait généralement semblable à celui-ci:
Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;
S'il vous plaît consulter le docs pour plus de détails.