2016-06-05 4 views
0

Ich habe gerade ein Projekt aktualisiert, das die Alpha-Version von ANTLR4 verwendet und das Anpassen eines leeren Satzes funktionierte gut. Alles, was passieren würde, war, dass ANTLR4 eine Warnung aussprechen würde, die sagte, dass es passender und leerer Satz war.Antlr4 - Leerer Satz im Lexer

Jetzt mit ANTLR Sprachunterstützung 1.2.1 und Parser-Generator 4.3.0 nun den Fehler wirft: „Error 1‚->‘als völlig überraschend zu mir kam, während eine Lexer Regel übereinstimmen“ in beiden Orten Ich benötige es, um einen leeren Satz zu finden.

es einen Teil des Codes bricht auf:

mode FILE_MODE; 
    ASCII: FASCII   -> mode(PATH_MODE); 
    UTF8: FUTF8    -> mode(PATH_MODE); 
    UTF16: FUTF16   -> mode(PATH_MODE); 
    EMPTY_FILE_TYPE:  -> skip, mode(PATH_MODE); // Throws the error on this line 

Wie kann man nun eine leere Regel übereinstimmen?

Terry

Antwort

0

Man tut nicht.

Die Warnung davor zeigt an, dass Antlr wahrscheinlich keinen Funktionscode für diese Zeile generiert hat. Wenn die Grammatik früher funktionierte, lag das wahrscheinlich an undefinierten Verhaltensweisen in dieser bestimmten Antlr-Version.

Jetzt entfernen Sie einfach die Linie. Was immer festgestellt wurde, dass ein Moduswechsel auf FILE_MODE erforderlich ist, sollte dies nur dann tun, wenn ein bestimmter Dateimodusinhalt vorhanden ist. Wenn nicht, dann gehen Sie weiter, um zu überlegen, ob es einen Pfadmodus-Inhalt gibt.

Das Bestimmen der besten Modusplan/Schutzbedingungen ist schwierig. Manchmal ist die einzige Lösung ein Prädikat, das Lookaheads verwendet. Um weiter zu helfen, wird eine exemplarische Quelle und der vollständige relevante Regelsatz benötigt.

+0

Ich denke, ich habe den leeren Satz für das gezeigte Beispiel gelöst, aber im Moment kann ich nicht kompilieren, weil ein anderer, viel komplizierterer Modus auch einen leeren Satz zum Auflösen benötigt. Ich könnte den Modus in eine Reihe von Fragmenten zerlegen und dann die Fragmente wieder zusammenfügen als ein viel größeres Fragment und dann das '?' Operator. Dies erfordert jedoch, dass ein Fragment den Typ so ändern kann. ** Fragment MODIFIER_ID: FIDENT -> Typ (IDENT); **. Der Compiler akzeptiert die Syntax, aber ich habe sie nie irgendwo dokumentiert gesehen. Also, bevor ich mit dem Modifizieren beginne, ist die Syntax legal? – Terry151151

+0

Sehen Sie sich den generierten Code an. Ziemlich gut lesbar. – GRosenberg