2017-03-20 4 views
2

Ich entschuldige mich im Voraus, wenn diese Frage bereits gestellt wurde, kann nicht scheinen, es zu finden.Antlr Eclipse IDE White Space wird nicht übersprungen

Ich fange gerade mit Antlr an und benutze das antlr4IDE für Eclipse, um einen Parser für eine kleine Teilmenge von Java zu erstellen. Aus irgendeinem Grund wird der Parser einen Fehler ausgeben, wenn ich nicht explizit das Vorhandensein eines Leerzeichens in meiner Regex anzeige.

Meine Grammatik:

grammar Hello; 


r : 
    (Statement ';')+ 
    ;   


Statement: 
    DECL | INIT 
    ; 

DECL: 
    'int' ID 
    ; 

INIT: 
    DECL '=' NUMEXPR 
    ; 

NUMEXPR : 
    Number OP Number | Number 
    ; 

OP : 
     '+' 
    | '-' 
    | '/' 
    | '*' 
    ; 

WS : 
    [ \t\r\n\u000C]+ -> skip 
    ; 

Number: 
    [0-9]+ 
    ; 

ID : 
    [a-zA-Z]+ 
    ; 

Beim Versuch, zu analysieren

int hello = 76; 

ich die Fehlermeldung: die Token WS in die Regeln

Hello::r:1:0: mismatched input 'int' expecting Statement 
Hello::r:1:10: token recognition error at: '=' 

Allerdings, wenn ich manuell hinzufügen, Ich erhalte keinen Fehler.

Irgendwelche Ideen, wo ich falsch liege? Ich bin neu in Antlr, also mache ich wahrscheinlich einen dummen Fehler. Danke im Voraus.

EDIT: Hier ist mein Parse-Baum und Fehlerprotokoll:

Parse Tree

Fehlerprotokoll:

Error Log

Antwort

1

Ändern Sie die Syntax wie folgt.

grammar Hello; 
r   : (statement ';')+ ;   
statement : decl | init ; 
decl  : 'int' ID ; 
init  : decl '=' numexpr ; 
numexpr : Number op Number | Number ; 
op  : '+' | '-' | '/' | '*' ; 
WS  : [ \t\r\n\u000C]+ -> skip ; 
Number : [0-9]+ ; 
ID  : [a-zA-Z]+ ; 

enter image description here

+0

Ich habe immer noch den gleichen Fehler, auch nach dem Kopieren genau, was Sie geschrieben haben. Ich habe den Parse Baum im ursprünglichen Beitrag – Slavvio

+0

geschrieben Nevermind, es hat funktioniert, danke! Follow-up-Frage: Wissen Sie, warum die Großschreibung der Symbole einen Unterschied machte? – Slavvio

+0

Siehe [Grammatik-Lexikon] (https://github.com/antlr/antlr4/blob/4.6/doc/lexicon.md). Tokennamen beginnen immer mit einem Großbuchstaben. Parser-Regelnamen beginnen immer mit einem Kleinbuchstaben. – saka1029

0

bei the documentation on antlr4 Nach einem Blick, wie es scheint, Sie haben müssen eine Spezifikation für alle Zeichenkombinationen, die Sie in Ihrer Datei erwarten, von Anfang bis Ende - nicht nur die, die Sie haben nicht zu handhaben.

In daß Grüßen, es ist zu erwarten, dass man sich ausdrücklich Leerzeichen angeben, mit so etwas wie haben würde:

WS : [ \t\r\n]+ -> skip; 

Deshalb ist der skip Befehl existiert:

A 'skip' command tells the lexer to get another token and throw out the current text. 

Obwohl zu beachten, dass manchmal diese kann ein kleines Problem wie in this post verursachen.

+0

Die OP hat seine Grammatik geschrieben und er das Leerzeichen springt. –

Verwandte Themen