我在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
有没有一种方法可以让用户使用某些关键字作为标识符,通过改变我的语法,就像将“标记”转换为IDSTRING
这样的联合规则,或者这不是手工编写的解析器中的错误希望?
答案 0 :(得分:2)
您只需在id
规则中列出允许作为标识符的关键字:
id: IDSTRING | CORE | ... ;