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

时间:2018-06-11 15:28:58

标签: 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 ;
[...]
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这样的联合规则,或者这不是手工编写的解析器中的错误希望?

1 个答案:

答案 0 :(得分:2)

您只需在id规则中列出允许作为标识符的关键字:

id: IDSTRING | CORE | ... ;