具有不同解释的令牌(即关键字和标识符)

Token with different interpretations (i.e. keyword and identifier)

我正在用 ANTLR4 中的许多不区分大小写的关键字编写语法。我收集了一些格式的示例文件,我尝试测试解析和一些使用相同的标记,这些标记作为关键字存在于其他地方作为标识符。例如,有一个 CORE 关键字,它在其他地方用作来自用户输入的结构的 ID。这是我的语法的一些部分:

fragment A : [aA]; // match either an 'a' or 'A'
fragment B : [bB];
fragment C : [cC];
[...]
CORE:        C O R E ;
[...]
IDSTRING:    [a-zA-Z_] [a-zA-Z0-9_]*;
id:          IDSTRING ;

然后抛出的错误是 line 7982:8 mismatched input 'core' expecting IDSTRING,因为用户输入的目的是 IDSTRING,但总是被关键字规则吃掉。在输入中,它既作为关键字又作为 id 存在,如下所示:

MACRO oa12f01
    CLASS CORE ; #here it is a KEYWORD
[...]
SITE core ; #here it is a ID

有没有一种方法可以让用户使用某些关键字作为标识符,方法是通过某种方式更改我的语法,例如 "casting" 将令牌更改为 IDSTRING 来获得这样的联合规则,或者这是一个错误的希望不是手写解析器?

您可以简单地列出允许作为标识符的关键字作为 id 规则中的替代关键字:

id: IDSTRING | CORE | ... ;