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

时间:2016-12-19 14:52:23

标签: antlr antlr4

下面的语法工作不正确。

语法如下:

program:
    (keyword |
    string |
    WS)*;

keyword: 'print';

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

QUOTE: '\'';

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

CH: .;

目标是使用字符串文字和关键字。

解析后的字符串如下:

print 'printed'

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

它以这种方式解析:

enter image description here

显然,它在字符串文字中看到关键字print。这是因为它隐含地为" print"。

创建了寄生规则

如何避免/克服这个?

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

此外,我无法指定DOT lexer元运算符,因为我不希望允许包含在引号内的每个标记(我不希望在那里出现引号)。

那么,该怎么办?

1 个答案:

答案 0 :(得分:2)

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

PRINT : 'print';

下一步是将string从解析器规则转换为词法分析器规则,例如:

STRING : QUOTE ~'\''* QUOTE;