在Antlr3中,我有以下语法:
ruleA:
(ruleBStart) => ruleB
| ruleC
;
为简单起见,我们假设ruleB是SQL中SELECT语句的语法,但可以嵌套在任意数量的LPAREN中。通过简单地说:
,这很容易用旧语法表示ruleBStart:
(LPAREN)* SELECT
;
在Antlr4中,如果我想做同样的事情,我会编写一个语义谓词isRuleBStart()
,它可能看起来像这样(伪代码):
@parser::members{
public boolean isRuleBStart(int tokenNum)
{
int token = _input.LA(tokenNum);
if (token == EOF) return false; // handling EOF probably needs more work
if (token == SELECT) return true;
if (token == LPAREN) return isRuleBStart(tokenNum++);
return false;
}
}
然后在我的语法中,我会这样做:
ruleA:
{isRuleBStart(1)}? ruleB
| ruleC
;
这对我来说似乎有问题:
ruleBStart
会变得复杂得多所以我想问一下社区是否有正确的Antlr4方法来实现相同的结果。
答案 0 :(得分:0)
不需要ANTLR4的语义谓词。如果需要,ALL(*)算法将做无限的预测,因此不需要语义谓词或任何可比较的黑客。
所以,只需删除该谓词,一切都应该正常工作。