2012-12-08 4 views
5

Ich schrieb eine Grammatik für eine kleine Sprache, die C-style einzeilige Kommentare versteht, z.Parsing single-line C-style Kommentare mit Antlr

// this is a comment 

Hier ist ein Fragment der Grammatik I für diese Sprache schrieb, ist dieser ziemlich viel Art von Arbeiten antlr v3.0.1

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

    WS  :  (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}; 

, mit der Ausnahme, dass, wenn der Kommentar im Skript zuletzt ist und kein NL/CR ist beendet, ich habe eine ärgerliche Nachricht von antlr (zur Laufzeit):

line 1:20 required (...)+ loop did not match anything at character '<EOF>' 

Wie kann ich diese Nachricht loswerden? Ich habe versucht, EOF Token der (..)+ Ausdruck hinzufügen, aber das funktioniert nicht.

+0

Ich bin mir nicht sicher, aber was passiert, wenn Sie die neue Zeile optional machen, d. H. Sie ändern das '+' in ein '?'? oder vielleicht ein '*'? – nijoakim

+0

Wie wäre es mit dem Auslassen der gierigen Optionen (sie scheinen nur für das +), und ändern Sie das Plus zu einem Fragezeichen. –

Antwort

4

Sie brauchen nicht die greedy=... Option: Sie benötigen es normalerweise, wenn Sie .* oder .+ in Ihrer Regel haben. Und da Sie bereits Zeilenumbruch Zeichen auf dem verborgenen Kanal in Ihrer WS Regel setzen, können Sie es von Ihrem SINGLELINE_COMMENT entfernen:

SINGLELINE_COMMENT 
: '//' ~('\r' | '\n')* {$channel=HIDDEN;} 
; 

WS 
: (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;} 
; 
+0

Funktioniert gut, danke! – insitu

2

Im Allgemeinen würde bedeuten, die „keine Abschluss NL“ -Ausgabe zu lösen viele gewundene Grammatik ändert sich, um diese Randbedingung zu berücksichtigen. Es ist immer einfacher, nur ein NL am Ende des Eingabestreams hinzuzufügen, was bedeutet, dass Sie dann garantiert eine abschließende NL haben und sich in Ihrer Grammatik nicht darum kümmern müssen. UNIX ist in dieser Hinsicht korrekt und Windows nicht.

Nicht die Lösung für Ihr spezifisches Problem, aber die Art, wie Sie die Regel ursprünglich codiert haben, macht dieses Problem verfügbar.