我正在尝试使用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
。
答案 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;