2013-05-10 3 views
7

Ich habe folgende Grammatik für ANTLR 4:ANTLR 4 Lexer-Tokens innerhalb anderer Token

grammar Pattern; 

//parser rules 
parse : string LBRACK CHAR DASH CHAR RBRACK ; 
string : (CHAR | DASH)+ ; 

//lexer rules 
DASH : '-' ; 
LBRACK : '[' ; 
RBRACK : ']' ; 
CHAR : [A-Za-z0-9] ; 

Und ich versuche, die folgende Zeichenfolge

ab-cd[0-9] 

Der Code analysiert, um die ab-cd zu analysieren auf die linke Seite, die in meiner Anwendung als eine literale Zeichenfolge behandelt wird. Es analysiert dann [0-9] als einen Zeichensatz, der in diesem Fall in eine beliebige Ziffer übersetzt wird. Meine Grammatik funktioniert für mich, außer dass ich nicht gerne (CHAR | DASH)+ als Parser-Regel habe, wenn sie einfach als Token behandelt wird. Ich würde eher schaffen die Lexer ein STRING Token und geben Sie mir die folgenden Token:

"ab-cd" "[" "0" "-" "9" "]" 

anstelle dieser

"ab" "-" "cd" "[" "0" "-" "9" "]" 

ich an anderen Beispielen ausgesehen haben, haben aber nicht in der Lage gewesen, es herauszufinden . In der Regel weisen andere Beispiele Anführungszeichen für solche Zeichenfolgenliterale auf oder sie enthalten Leerzeichen, um die Eingabe zu begrenzen. Ich möchte beides vermeiden. Kann dies mit Lexer-Regeln erreicht werden oder muss ich weiter damit in den Parser-Regeln umgehen, wie ich es tue?

Antwort

7

In ANTLR 4 können Sie Lexer-Modi dafür verwenden.

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

Nach einem [ Zeichen Parsen wird die lexer in CharSet Modus arbeiten, bis ein ] Zeichen erreicht ist und der popMode Befehl ausgeführt wird.

+0

Danke für diese Einsicht. Das Einrichten von Unter-Tokenern klingt wie die perfekte Lösung. Ich bekomme einen Fehler obwohl "lexikalische Modi sind nur in Lexer-Grammatiken erlaubt". Ich kann meine Grammatik als 'lexer grammatik IdPattern;' deklarieren, aber dann kann ich keine Parser-Regeln verwenden. Was vermisse ich? – Charles

+1

Sie müssen eine Lexer-Grammatik für Ihren Lexer und eine separate Parser-Grammatik für Ihren Parser verwenden (in einer separaten Datei). –

+0

Hier ist ein Link, der anderen helfen kann: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle