词法分析器规则冲突

时间:2019-07-23 11:39:14

标签: antlr antlr4

我正在尝试使用ANTLR4来解析文件,其中的元素可以是字符"b"或简单的文字,当Literal只是一个带有"b"的字符时,就会出现问题。

这是一个简化的语法

Lexer文件:

B
    : 'b'
    ;

LETTER
    : [a-z]
    ;

LETTERS
    : LETTER+
    ;

Parser file:

pointer
    : B '.' LETTERS
    ;

b.f有效,但b.b不起作用,我得到"line 1:2 mismatched input 'b' expecting LETTERS"。如何在不将Letter放在B上方的情况下避免两个词汇规则之间的冲突,在B上问题将变为B

1 个答案:

答案 0 :(得分:0)

首先请注意,问题不仅发生在b上,而且还会出现任何单个字母。 b以外的其他字母将简单地由LETTER规则匹配,该规则仍与LETTERS不同。由于您从未真正使用过LETTER,因此只需从语法中完全删除LETTER,就可以解决那部分问题。

B而言,这就是上下文关键字:与标识符规则(在这种情况下为LETTERS)匹配的内容应在某些情况下特别对待职位,但仍然可以用作其他职位的标识符。实现上下文关键字的常见方法是为标识符定义一个非终结符,该标识符可以与实际标识符或任何语言的上下文关键字匹配。因此,就您而言,您可以这样做:

letters: LETTERS | B; // You can add "| LETTER" if you want to keep LETTER
pointer: B '.' letters;