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

Parsing 具有不同解释的令牌(即关键字和标识符),parsing,antlr,antlr4,tokenize,Parsing,Antlr,Antlr4,Tokenize,我正在用ANTLR4编写一个包含大量不区分大小写的关键字的语法。我收集了一些用于该格式的示例文件,我尝试对其进行测试分析,其中一些使用了与其他地方的标识符作为关键字存在的相同标记。例如,有一个CORE关键字,它在其他地方用作用户输入结构的ID。下面是我语法的一些部分: fragment A : [aA]; // match either an 'a' or 'A' fragment B : [bB]; fragment C : [cC]; [...] CORE: C O R E ;

我正在用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 ;
然后抛出的错误是
行7982:8不匹配的输入'core'应为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 | ... ;