ANTLR:具有相似文字的 MismatchedTokenException

发布于 2024-09-13 18:50:20 字数 360 浏览 4 评论 0原文

我有以下

rule : A B;

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

输入:

a_b    //dont work
a_e_b  //works

为什么词法分析器无法匹配此输入?当 ANTLR 匹配“a_b”中的“a_”时,它不应该回溯或使用前瞻或其他方式来查看它无法匹配令牌 A,然后决定将令牌 A 匹配为“a”,然后继续将令牌 B 匹配为“_b”?

我认为我误解了有关 antlr 工作原理的一些非常基本的内容。我尝试在 ANTLR 文档和谷歌中阅读它。但我对词法分析器和解析器的工作经验很少。

非常感谢您的帮助。

I have the following

rule : A B;

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

Input:

a_b    //dont work
a_e_b  //works

Why is the lexer having trouble matching this? When ANTLR matches the 'a_' in 'a_b' shouldnt it backtrack or use lookahead or something to see it cant match a token A and then decide to match token A as 'a' and then procede to match token B as '_b'?

I think ive missunderstood something very basic about how antlr works. Ive tried to read up on it in the ANTLR doc and google. But i have little experience wokring with lexers and parsers.

Thank you very much for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

妳是的陽光 2024-09-20 18:50:20

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

以下内容将起作用:

grammar T;

rule : A B;

B : '_b';
A :     ('a_e')=>'a_e'
    | 'a'  ;

这将按照您的预期解析“a_e_b”和“a_b”。

建议查看 The Definitive ANTLR Reference 的第 13 章。

You need to use a syntactic predicate to distinguish the 'a', '_', 'e' and 'b'.

The following will work:

grammar T;

rule : A B;

B : '_b';
A :     ('a_e')=>'a_e'
    | 'a'  ;

This parses 'a_e_b' and 'a_b' as you expect.

Recommend checking chapter 13 of The Definitive ANTLR Reference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文