gpt4 book ai didi

java - Antlr4 - 表示检查任意数量的标记的句法谓词

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:44 26 4
gpt4 key购买 nike

在 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
;

这对我来说似乎有问题,因为:

  1. 它涉及结构中的递归,传言会降低性能
  2. ruleBStart 如果 ruleBStart 规则有一组任意的不同标记要检查而不是仅仅重复 LPAREN
  3. ,则可能会变得更加复杂
  4. 它将我的代码绑定(bind)到目标语言。所以如果我想用 Java 和 C++ 发布一个解析器,我将不得不在两者中重新实现这个语义谓词。 (我知道可以仔细编写语义谓词,使相同的代码在 Java 和 C++ 中工作,但这不是重点)。

所以我想问问社区是否有正确的 Antlr4 方法来达到相同的结果。

最佳答案

ANTLR4 不需要语义谓词。如果需要,ALL(*) 算法将进行无限前瞻,因此不需要语义谓词或任何类似的 hack。

因此,只需删除该谓词,一切都应该正常工作。

关于java - Antlr4 - 表示检查任意数量的标记的句法谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202286/

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