2013-02-08 11 views
28

Ich brauche Hilfe mit meiner ANTLR 4-Grammatik, nachdem ich mich entschieden habe, von v3 auf v4 zu wechseln. Ich bin sehr nicht mit ANTLR erlebt so bin ich wirklich leid, wenn meine Frage ist dumm;)

In v3 ich den folgenden Code verwendet Java-Stil Kommentare zu erkennen:

COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    | '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

In v4 gibt es keine Regel, -spezifische Optionen. Die Aktionen (Verschieben in den versteckten Kanal) sind ebenfalls ungültig.

Könnte mir jemand bitte einen Tipp geben, wie man es in ANTLR v4 macht?

Antwort

33

Das v4 Äquivalent würde wie folgt aussehen:

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/' 
     ) -> channel(HIDDEN) 
    ; 

die alle ein- und mehrzeiliger Kommentar auf dem HIDDEN Kanal setzen. Allerdings, wenn Sie sind nicht alles, was mit diesen HIDDEN -tokens tun, könnten Sie auch skip diese Token, die wie folgt aussehen:

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/' 
     ) -> skip 
    ; 

Beachten Sie, dass die Lexer oder Parser sagen ungreedy übereinstimmen, Sie don‘ t verwenden Sie options {greedy=false;} nicht mehr, sondern fügen Sie eine ?, ähnlich wie bei vielen Regex-Implementierungen.

+0

Vielen Dank! – user2055330

+0

Ich benutze jetzt Ihren vorgeschlagenen Code (erste Variante mit Kanal), die einen Fehler auslöst: '-> Befehl in der Lexer-Regel 'COMMENT' muss das letzte Element der einzelnen äußersten alt sein 'Was ist das Problem? – user2055330

+0

@ user2055330, versuche meine bearbeitete Version. –