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]+;