ANTLR:具有相似文本的不匹配TokenException

ANTLR:具有相似文本的不匹配TokenException,exception,antlr,lexer,Exception,Antlr,Lexer,我有以下几点 rule : A B; A : 'a_e' | 'a'; B : '_b'; 输入: a_b //dont work a_e_b //works 为什么lexer在匹配上有问题?当ANTLR匹配“a_b”中的“a_”时,它不应该回溯或使用前瞻或其他方法来查看它不能匹配令牌a,然后决定将令牌a匹配为“a”,然后将令牌b匹配为“a” 我想我对antlr工作原理的一些非常基本的理解有误。我试着在ANTLR文档和谷歌上读到它。但是我对词法分析器和语法分析器没有什么经验 非常感

我有以下几点

rule : A B;

A : 'a_e' | 'a';
B : '_b';
输入:

a_b    //dont work
a_e_b  //works
为什么lexer在匹配上有问题?当ANTLR匹配“a_b”中的“a_”时,它不应该回溯或使用前瞻或其他方法来查看它不能匹配令牌a,然后决定将令牌a匹配为“a”,然后将令牌b匹配为“a”

我想我对antlr工作原理的一些非常基本的理解有误。我试着在ANTLR文档和谷歌上读到它。但是我对词法分析器和语法分析器没有什么经验


非常感谢您的帮助。

您需要使用一个语法谓词来区分“a”、“u”、“e”和“b”

以下工作将起作用:

grammar T;

rule : A B;

B : '_b';
A :     ('a_e')=>'a_e'
    | 'a'  ;
这将按照您的预期解析“a_e_b”和“a_b”


建议查看最终ANTLR参考的第13章。

您需要使用语法谓词来区分“a”、“e”、“b”

以下工作将起作用:

grammar T;

rule : A B;

B : '_b';
A :     ('a_e')=>'a_e'
    | 'a'  ;
这将按照您的预期解析“a_e_b”和“a_b”


建议查看最终ANTLR参考的第13章。

您是否需要将规则作为lexer规则?是否可以使用解析器规则(稍微更改语法)来解决此问题?是否需要将规则转换为lexer规则?是否可以使用解析器规则(稍微更改语法)来解决此问题?