如何避免在Antlr4中创建寄生lexer规则?

如何避免在Antlr4中创建寄生lexer规则?,antlr,antlr4,Antlr,Antlr4,下面的语法不正确 语法如下: program: (keyword | string | WS)*; keyword: 'print'; string: QUOTE (CH | WS)*? QUOTE; QUOTE: '\''; WS : [ \t\r\n]+; CH: .; 目标是让langauge同时具有字符串文本和关键字 解析的字符串如下所示: print 'printed' 它应该被解析为关键字,然后是空格,然后是字符串文字 而是以这种方式进行分析:

下面的语法不正确

语法如下:

program:
    (keyword |
    string |
    WS)*;

keyword: 'print';

string: QUOTE (CH | WS)*? QUOTE;

QUOTE: '\'';

WS  : [ \t\r\n]+;

CH: .;
目标是让langauge同时具有字符串文本和关键字

解析的字符串如下所示:

print 'printed'
它应该被解析为关键字,然后是空格,然后是字符串文字

而是以这种方式进行分析:

显然,它在字符串文本中看到关键字
print
。这是因为它隐式地为“打印”创建了寄生规则

如何避免/克服这种情况

我不想指定字符串文字可以包含关键字,因为它在逻辑上是不正确的

另外,我不能指定点lexer元运算符,因为我不希望允许引号中包含的每个标记(我不希望引号出现在那里)


那么,该怎么办呢?

如果您将组合语法分离为单独的
词法语法
语法分析器
,ANTLR将不允许您通过语法分析器规则中的文本隐式定义词法规则。如果希望
print
成为关键字,则需要包含此lexer规则(否则解析器规则中不允许
'print'
):

下一步是将
string
从解析器规则转换为lexer规则,如下所示:

STRING : QUOTE ~'\''* QUOTE;

谢谢但是否可以在这里添加转义sequencs,以允许字符串包含引号?
STRING : QUOTE ~'\''* QUOTE;