Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ANTLR4嵌套模式?_C#_Antlr4 - Fatal编程技术网

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)