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?
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
Sie müssen eine Lexer-Grammatik für Ihren Lexer und eine separate Parser-Grammatik für Ihren Parser verwenden (in einer separaten Datei). –
Hier ist ein Link, der anderen helfen kann: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle