ANTLR Operator Präzedenz
-
12-09-2019 - |
Frage
Wie wird Operator Vorrang in ANTLR umgesetzt?
Ich bin mit dem XText / Antlr Paket im Moment.
Edit:
Ich tat, was sepp2k vorgeschlagen und Operatorpräzedenz funktioniert jetzt, aber Sachen wie 3 + * auch jetzt funktionieren. Die Betreiber sind grundsätzlich „fallen durch“ den Baum.
Auch habe ich versucht, die C-Grammatik auf ANTLR Webseite und das gleiche passierte in ANTLRWorks.
Wer weiß, was das Problem ist?
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' | '-')? MultDivOp;
MultDivOp:
('*' | '/')? ExpOp;
ExpOp:
'^'? expr=Expression;
Lösung
Mit ANTLR kodieren Sie den Vortritt in den Grammatikregeln. Wie:
expr: mult ('+' mult)* ;
mult: atom ('*' atom)* ;
atom: INT | '(' expr ')' ;
Dies würde parsen "1 + 2 + 3 * (4 * 5 + 6)" als "(1 + (2 * 3)) + ((4 * 5) + 6)"
Andere Tipps
Da Sie Xtext benutzen, würde ich empfehlen, das Handlungskonzept von Xtext zu verwenden. Das heißt, eine einfache Ausdruck Grammatik der Regel ähnlich aussehen wie diese:
Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;
Weitere Informationen finden sie auf der Seite docs .