Antlr 如何在一个规则中指定多个lexer规则?
我有以下解析器规则:Antlr 如何在一个规则中指定多个lexer规则?,antlr,antlr4,language-recognition,Antlr,Antlr4,Language Recognition,我有以下解析器规则: declaration : (KW_VARIABLE DT_IDENTIFIER) | (KW_VARIABLE DT_IDENTIFIER OP_ASSIGNMENT DT_DATA_TYPES) OP_SEMICOLON; 以及以下lexer规则: KW_VARIABLE : 'var'; OP_ASSIGNMENT : '='; OP_SEMICOLON : ';'; DT_IDENTIFIER
declaration : (KW_VARIABLE DT_IDENTIFIER) |
(KW_VARIABLE DT_IDENTIFIER OP_ASSIGNMENT DT_DATA_TYPES) OP_SEMICOLON;
以及以下lexer规则:
KW_VARIABLE : 'var';
OP_ASSIGNMENT : '=';
OP_SEMICOLON : ';';
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;
DT_DATA_TYPES : (DT_IDENTIFIER | DT_INTEGER);
根据上述规则,我希望能够编写以下代码:
var a = 10;
var b = 40;
var c = 50;
var d = c;
退出声明的侦听器代码如下所示:
public override void ExitDeclaration([NotNull] PyroParser.DeclarationContext context)
{
bool isAssigned = context.OP_ASSIGNMENT() != null;
if (!isAssigned)
{
return;
}
Console.WriteLine(context.DT_DATA_TYPES().GetText());
base.ExitDeclaration(context);
}
当我运行时,第一行出现一个错误,我说:
第1行:8不匹配的输入“10”应为DT_数据类型
我只想能够在一条规则中引用所有数据类型,我如何才能做到这一点?这是不正确的:
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;
DT_DATA_TYPES : (DT_IDENTIFIER | DT_INTEGER);
一旦匹配了DT\u标识符
或DT\u整数
,它将永远不会成为DT\u数据类型
。lexer自上而下地匹配规则,一旦找到匹配项,它就不会放弃。简单地改变规则的顺序:
DT_DATA_TYPES : (DT_IDENTIFIER | DT_INTEGER);
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;
也不起作用:这样,lexer将永远不会产生dtu标识符
和dtu整数
令牌
您可以这样做:
dt_data_types : (DT_IDENTIFIER | DT_INTEGER);
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;
这是不正确的:
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;
DT_DATA_TYPES : (DT_IDENTIFIER | DT_INTEGER);
一旦匹配了DT\u标识符
或DT\u整数
,它将永远不会成为DT\u数据类型
。lexer自上而下地匹配规则,一旦找到匹配项,它就不会放弃。简单地改变规则的顺序:
DT_DATA_TYPES : (DT_IDENTIFIER | DT_INTEGER);
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;
也不起作用:这样,lexer将永远不会产生dtu标识符
和dtu整数
令牌
您可以这样做:
dt_data_types : (DT_IDENTIFIER | DT_INTEGER);
DT_IDENTIFIER : [a-z]+;
DT_INTEGER : [0-9]+;