2016-03-31 3 views
1

So bin ich ziemlich neu 4. bis antlr Ich habe die Grammatik so viel wie ich kann abgespeckte das Problem zeigen:Warum zerbricht nicht der anlr 4 meine Tokens wie erwartet?

grammar DumbGrammar; 

equation 
    : expression (AND expression)* 
    ; 

expression 
    : ID 
    ; 


ID : LETTER(LETTER|DIGIT)* ; 

AND: 'and'; 

LETTER: [a-zA-Z_]; 
DIGIT : [0-9]; 
WS : [ \r\n\t] + -> channel (HIDDEN); 

Wenn die Verwendung dieser Grammatik und den Beispieltext verwenden: abc and d ich eine seltsame bekommen Baum mit unerwarteten Struktur wie unten (unter Verwendung von IntelliJ und ANTLR4 stecken) gezeigt:

enter image description here

Wenn ich einfach das Terminal Regel AND: 'and';AND: '&&'; und dann abc && d als Eingabe ich den folgenden Baum erhalten, als ex vorlegen lesen ändern teten:

enter image description here

ich kann nicht herausfinden, warum es nicht "and" richtig Parsen, aber '&&' richtig funktioniert analysieren.

Antwort

3

Der Eingang "and" wird als Token ID Token. Da sowohl ID als auch AND mit dem Eingang "and" übereinstimmen, muss ANTLR entscheiden, welches Token gewählt werden soll. Es dauert ID seit es vor definiert wurde.

Die Lösung: define AND vor ID:

AND: 'and'; 

ID : LETTER(LETTER|DIGIT)* ; 
+0

Wow! Schmerzhaft offensichtlich! Vielen Dank!! :) – shuri17

+0

Kein Problem shuri. –

+0

überprüfen, ob ID == 'andy' wird funktionieren, ich denke nicht. Sie müssen 'und' Token in die ID-Regel einfügen, damit IDs, die 'und' Teilstrings enthalten, auch funktionieren. – Divisadero

Verwandte Themen