2009-07-18 9 views
2

Ich habe folgende Antlr Grammar:Antlr verborgenen Kanal Leerzeichen Problem

grammar MyGrammar; 

doc : intro planet; 
intro : 'hi'; 
planet : 'world'; 
MLCOMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' { $channel = HIDDEN; }; 
WHITESPACE : ( 
    (' ' | '\t' | '\f')+ 
    | 
    // handle newlines 
    ('\r\n' // DOS/Windows 
     | '\r' // Macintosh 
     | '\n' // Unix 
    ) 
    ) 
{ $channel = HIDDEN; }; 

Im ANTLRWorks 1.2.3 Interpreter, wobei die Eingänge hi world, hi/**/worldhi /*A*/ world und Arbeit, wie erwartet.

Aber der Eingang hiworld, der sollte nicht funktionieren, wird auch akzeptiert. Wie mache ich hiworld scheitern? Wie zwinge ich mindestens einen Whitespace (oder Kommentar) zwischen "hi" und "world"?

Beachten Sie, dass ich in diesem Beispiel nur MLCOMMENT und WHITESPACE zur Vereinfachung verwendet habe, aber andere Arten von Kommentaren werden unterstützt.

+0

Nun, ich weiß nicht, Antlr, aber würde nicht "Doc: Intro WHITESPACE Planet" oder so etwas am offensichtlichsten sein? – schnaader

+0

Da der Kanal WHITESPACE ausgeblendet ist, verursacht dies eine MismatchedTokenException. – luiscubal

+0

Kannst du nicht eine andere Whitespace-Grammatik erstellen, die nicht versteckt ist und sie verwenden? – schnaader

Antwort

6

Sie benötigen eine allgemeine ID-Token zu erstellen. Da der Lexer das längste Token erstellt, das er kann, würde er die Eingabe "hiworld" als einzelnes Wort sehen, da es selbst länger als "hi" oder "world" ist. Eine solche Regel aussehen könnte:

ID : ('a'..'z' | 'A'..'Z')+; 

Als ein Beispiel, das genau ist, wie Parser für Programmiersprachen trennen die „do“ Stichwort von „double“ (Stichwort Typ, beginnt mit ‚do‘) oder „done“ (Variablennamen).

+0

Diese Antwort hat so viele Dinge gemacht, klicken Sie in meinem Kopf. Vielen Dank –

0

Eine Möglichkeit, die Zeichenfolge hiworld scheitern zu machen, ist eine Validierung semantische Prädikat zu verwenden, die zum Scheitern verurteilt ist garantiert, wie folgt:

doc:  intro planet; 
failure : 'hiworld' { false }?; 
intro : 'hi'; 
planet : 'world'; 
// rest of grammar omitted 
+0

Sehr interessant, aber wenn ich jeden einzelnen möglichen Fehlerfall zu komplexeren Grammatiken hinzufügen würde, würde die Anzahl der Fehlersituationen exponentiell wachsen. – luiscubal