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;
War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top