2017-01-30 6 views
0

Ich versuche, die folgende Zeichenfolge zu analysieren:ANTLR4 Verschachtelte Modi?

<<! variable, my_variable, A description of my variable !>> 

Aus der Lektüre hat mich hier getan, ich glaube, ich brauche Modi zu verwenden, um zwischen der Lexer für die Zeichenkette ‚Variable‘ zu unterscheiden, die Variablenname (my_variable) und die Beschreibung der Variablen.

Das Problem, das ich habe, ist, dass ich nicht sicher bin, wie man das strukturiert. Ist es möglich, Modi zu verschachteln? Gibt es eine bessere/intelligentere Möglichkeit, meine Lexer-Regeln zu organisieren?

lexer grammar VariableLexer; 

variableMarkdown : DELIMITER_OPEN SPACE VARIABLE COMMA SPACE variable_name COMMA SPACE description SPACE DELIMITER_CLOSE; 

description : WORDS ; 

variable_name : ID ; 

DELIMITER_OPEN : '<<!' ; 
DELIMITER_CLOSE : '!>>'; 

COMMA : ',' ; 
SPACE : ' ' ; 

VARIABLE : 'variable' -> pushMode(VariableName); 

mode VariableName; 
ID : LOWERCASE (LOWERCASE | NUMBER | UNDERSCORE)* -> pushMode(VariableDescription) ; 

mode VariableDescription; 
WORDS : (UPPERCASE | LOWERCASE | NUMBER | SPACE)+ -> popMode; 


fragment LOWERCASE : 'a'..'z' ; 
fragment UPPERCASE : 'A'..'Z' ; 
fragment UNDERSCORE : '_' ; 
fragment NUMBER : '0'..'9' ; 

Antwort

0

Erste - Sie können nicht Parser Regeln in Lexer Grammatik - Parser Regeln beginnen mit kleinen Buchstaben, Lexer diejenigen mit Kapital.

Ich würde es tun, wie so (nicht korrekte Syntax sein kann, aber Sie bekommen die Idee):

//default mode is implicitly defined by (or in) ANTLR4 
VARIABLE : 'variable' (' ')* ',' -> mode(mode_VariableName); 
... 
mode mode_VariableName; 
//define token with anything ending with comma, many ways to do this... 
fragment varNameFrag: [a-zA-Z_0-9]; 
VARIABLE_NAME: varNameFrag varNameFrag* (' ')* ',' -> mode(mode_varDesc); 
mode mode_varDesc; 
//similar again for variable description 
VAR_DESC: //I'll write just a comment here but should more or less match anything except 
END_VAR: '!>>' -> mode(DEFAULT_MODE) 

Grundsätzlich auf diese Weise springen Sie Sie statt Schieben und Knallen Modi benötigen.