gpt4 book ai didi

ANTLR:由于可从 alts 1,2 访问递归规则调用,因此规则 token 具有非 LL(*) 决策

转载 作者:行者123 更新时间:2023-12-02 08:58:16 28 4
gpt4 key购买 nike

grammar AdifyMapReducePredicate;

PREDICATE
: PREDICATE_BRANCH
| EXPRESSION
;

PREDICATE_BRANCH
: '(' PREDICATE (('&&' PREDICATE)+ | ('||' PREDICATE)+) ')'
;

EXPRESSION
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;

尝试在 ANTLRWorks 1.4 中解释这一点并收到以下错误:

[12:18:21] error(211): <notsaved>:1:8: [fatal] rule Tokens has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2.  Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
[12:18:21] Interpreting...

当我解释时,我试图解释 PREDICATE,我的测试用例是 (A||B)

我错过了什么?

最佳答案

根据 ANTLR 的约定,解析器规则名称以小写字母开头,而词法分析器规则以大写字母开头。因此,正如您所编写的,语法具有三个词法分析器规则,用于定义标记。这可能不是您想要的。

错误消息的原因显然是这些标记之间的歧义:您的输入模式与 PREDICATE 和 PREDICATE_BRANCH 的定义匹配。

只需使用以小写字母开头的名称,而不是 PREDICATE 和 PREDICATE_BRANCH。您可能还需要为目标符号添加一条不直接参与递归的额外规则。

顺便说一句,这个语法是递归的,但不是左递归的,当使用解析器规则时,它肯定是LL(1)。

关于ANTLR:由于可从 alts 1,2 访问递归规则调用,因此规则 token 具有非 LL(*) 决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3249685/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com