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)
我错过了什么?
根据ANTLR的约定,解析器规则名称以小写字母开头,而词法分析器规则以大写字母开头.所以语法就像你写的一样,有三个词法规则,定义了令牌.这可能不是你想要的.
错误消息的原因显然是这些令牌之间的歧义:您的输入模式与PREDICATE和PREDICATE_BRANCH的定义相匹配.
只需使用以小写字母开头的名称,而不是PREDICATE和PREDICATE_BRANCH.您可能还必须为目标符号添加一个额外的规则,该规则不直接参与递归.
顺便说一句,这个语法是递归的,但不是左递归的,当使用解析器规则时,它肯定是LL(1).