在Antlr3中,我有以下语法:
ruleA:
(ruleBStart) => ruleB
| ruleC
;
ruleBStart:
(LPAREN)* SELECT
;
@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
;
所以我想问问社区是否有一个正确的Antlr4的方法来达到同样的结果。
不需要使用ANTLR4的语义谓词。如果需要,ALL(*)算法将进行无限的前瞻,因此不需要语义谓词或任何类似的黑客攻击。
所以,只要移除这个谓词,一切就可以正常工作了。
下面的lexer语法片段应该根据类中定义的谓词来标记“自定义名称”: CUSTOM_NAME的正确匹配总是尽可能长的匹配。现在,如果lexer遇到一个自定义名称,比如,那么我希望它对整个字符串,然后用'some:cname'作为参数调用一次谓词。 编辑:这种行为的有趣之处在于,只要将部分匹配传递给谓词,谓词的结果似乎完全被lexer忽略了。这似乎效率很低。
关于antlr4的几个问题使用了书中没有提到的lexer谓词,例如28730446使用了head(String),42058127使用了getCharPositionInLine(),23465358使用了_input.la(1)等。是否有可用的lexer谓词列表及其文档?
是如下所示吗。
我有一个非常简单的语法,如下所示: (我需要使用语义谓词,因为我需要解析关键字可以用作标识符的语言)。 参考:https://github.com/antlr/antlr4/blob/master/doc/predicates.md