2017-01-30 5 views
0

Я пытаюсь разобрать следующую строку:ANTLR4 Вложенные режимы?

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

От чтения я делал здесь, я считаю, что нужно использовать режимы различать лексер для символьной строки «переменных», то имя переменной (my_variable) и описание переменной.

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как структурировать это. Можно ли встраивать режимы? Есть ли лучший/более умный способ организовать мои правила lexer?

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' ; 

ответ

0

Во-первых - вы не можете иметь правила синтаксического анализа в лексического анализатора грамматики - правила синтаксического анализа начинаются с маленькой буквы, лексический из них с капиталом.

Я хотел бы сделать это как так (может быть не правильный синтаксис, но вы получите идею):

//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) 

В принципе, таким образом, вы прыгаете моды вам нужно вместо проталкивания и хлопков.

Смежные вопросы