2009-09-20 8 views
5

Wie wird die Operatorpriorität in ANTLR implementiert?ANTLR Operator Precedence

Ich benutze das XText/Antlr-Paket im Moment.

Edit:

Ich tat, was sepp2k vorgeschlagen und Operatorpräzedenz funktioniert jetzt, aber Sachen wie 3 + * auch jetzt funktionieren. Die Operatoren "fallen" grundsätzlich durch den Baum.

Auch ich habe versucht, die C-Grammatik auf ANTLR's Website und das gleiche passiert in ANTLRworks.

Wer weiß, was das Problem ist?

+0

Der Aufruf von Expression sollte wahrscheinlich zwischen '(' und ')' liegen. Auch Ihre Operatoren scheinen alle einen linken Operanden zu verpassen. – sepp2k

+0

Ich habe es mit der Methode in meinem Kommentar behoben. Außerdem wurde der linke Operand in den ersten Ausdruck verschoben, um eine Linksrekursion zu verhindern. – jameszhao00

Antwort

9

Mit ANTLR kodieren Sie den Vorrang 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)"

+0

Bitte lesen Sie mein Update :) – jameszhao00

+0

Vielleicht könnte ich Sachen wie AndOp tun: ('und' Expression) | ComparisonOp – jameszhao00

+0

Um zu verdeutlichen, dass eine Grammatikregel umso detaillierter ist, je größer ihre Priorität ist. Im obigen Beispiel ist "expr -> multi -> atom *" detaillierter als der Pfad zum Pluszeichen. Daher hat der * Pfad Vorrang. –

2

Da Sie Xtext verwenden, würde ich empfehlen, das Aktionskonzept von Xtext zu verwenden. Das heißt, ein einfacher Ausdruck Grammatik aussehen würde typischerweise ähnlich 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; 

haben Sie einen Blick auf die Dokumentation für weitere Einzelheiten.