Antlr lexer规则中的冲突

Antlr lexer规则中的冲突,antlr,antlr4,Antlr,Antlr4,我试图使用ANTLR4解析一个文件,其中的元素可以是字符b或简单的文本,当文本只是一个带有b的字符时,就会出现问题 这是一个简化的语法 Lexer文件: B : 'b' ; LETTER : [a-z] ; LETTERS : LETTER+ ; Parser file: pointer : B '.' LETTERS ; b、 f工作,但b.b不工作,我得到第1:2行不匹配的输入'b'期望字母。如何避免两个词汇规则之间的

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

这是一个简化的语法

Lexer文件:

B
    : 'b'
    ;

LETTER
    : [a-z]
    ;

LETTERS
    : LETTER+
    ;

Parser file:

pointer
    : B '.' LETTERS
    ;

b、 f工作,但b.b不工作,我得到第1:2行不匹配的输入'b'期望字母。如何避免两个词汇规则之间的冲突而不将字母放在B上面,问题只会变为B。

首先请注意,问题不仅会发生在B上,而且会发生在任何单个字母上。b以外的字母将简单地由字母规则匹配,该规则仍然与字母不同。因为你从来没有真正使用过字母,你可以通过简单地从语法中删除字母来解决这部分问题

就B而言,这就是所谓的上下文关键字:在本例中,与标识符或字母规则相匹配的内容在某些位置应被特别处理,但在其他位置仍允许作为标识符。实现上下文关键字的常用方法是为标识符定义一个非终端,该标识符既可以匹配实际标识符,也可以匹配语言的任何上下文关键字。因此,在您的情况下,您可以这样做:

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

为什么它希望第0列有字母?为什么它只写大写字母L?你确定你运行的语法与你在这里发布的相同吗?嗨,我在用另一个语法测试,这是简化版。我刚刚测试了这个问题并修改了这个问题。请注意,当文字仅为一个带b的字符时,出现问题的那一行。有没有办法在lexer文件中保留字母| b?@moe No。根据您试图完成的任务,您可以使用模式和/或谓词来表示b只能在行的开头匹配,或b不能在点后匹配,但是没有办法说在lexer中需要字母标记的地方也应该接受B标记。