C# ANTLR4嵌套模式?
我正在尝试分析以下字符串:C# ANTLR4嵌套模式?,c#,antlr4,C#,Antlr4,我正在尝试分析以下字符串: <<! variable, my_variable, A description of my variable !>> 从我在这里所做的阅读来看,我相信我需要使用模式来区分文本字符串“variable”的lexer、变量名(my_variable)和变量描述 我遇到的问题是,我不确定如何构建这个。可以嵌套模式吗?有没有更好/更聪明的方法来组织我的lexer规则 lexer grammar VariableLexer; variableM
<<! variable, my_variable, A description of my variable !>>
从我在这里所做的阅读来看,我相信我需要使用模式来区分文本字符串“variable”的lexer、变量名(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' ;
lexer语法变量lexer;
变量标记:分隔符\开放空间变量逗号空间变量\名称逗号空间描述空间分隔符\关闭;
描述:文字;
变量名称:ID;
分隔符_打开:“”;
逗号:',';
空间:'';
变量:“变量”->pushMode(VariableName);
模式变量名;
ID:小写(小写|数字|下划线)*->pushMode(VariableDescription);
模式变量描述;
单词:(大写|小写|数字|空格)+->popMode;
片段小写:'a'..'z';
片段大写:'A'..'Z';
片段下划线:'";
片段编号:“0”…'9';
首先-在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)