ANTLR:规则令牌具有非LL(*)决策,因为递归规则调用可以从alts 1,2到达

Hou*_*ell 2 antlr

grammar AdifyMapReducePredicate;

PREDICATE 
    :   PREDICATE_BRANCH
    |   EXPRESSION
    ;

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

EXPRESSION 
    :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;
Run Code Online (Sandbox Code Playgroud)

试图在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...
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

Gun*_*her 5

根据ANTLR的约定,解析器规则名称以小写字母开头,而词法分析器规则以大写字母开头.所以语法就像你写的一样,有三个词法规则,定义了令牌.这可能不是你想要的.

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

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

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