我正在尝试解析以下字符串:
<<! variable, my_variable, A description of my variable !>>根据我在这里所做的阅读,我认为我需要使用模式来区分文字字符串' variable‘、变量名称(my_variable)和变量描述的词法分析器。
我遇到的问题是,我不确定如何构建它。可以嵌套模式吗?有没有更好/更聪明的方式来组织我的词法分析器规则?
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' ;发布于 2017-01-31 05:14:08
首先,在lexer语法中不能有解析器规则-解析器规则以小写字母开头,lexer规则以大写字母开头。
我会这样做(语法可能不正确,但你会明白的):
//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) 基本上,通过这种方式,您可以跳转到所需的模式,而不是推送和弹出。
https://stackoverflow.com/questions/41945018
复制相似问题