gpt4 book ai didi

ios - PegKit:以不同方式处理相同工作的语法语法

转载 作者:行者123 更新时间:2023-11-29 12:19:09 26 4
gpt4 key购买 nike

我正在编写一些使用 PegKit 的代码我遇到了一些我不确定如何弄清楚的事情。我的语法看起来像这样(简化):

expr = runtimeExpr | objectExpr;
runtimeExpr = is? runtimeObject;
objectExpr = runtimeObject keyPath;
runtimeObject = '[' string ']';
is = 'is';
keyPath = string;

我正在寻找以下结果:

[abc] -> runtime expr.
is [abc] -> runtime expr.
[abc].def -> object expr.

然而,生成的解析器代码看起来像这样:

if ([self predicts:STLOGEXPRESSIONPARSER_TOKEN_KIND_IS, 0]) {
[self runtimeExpr_];
} else if ([self predicts:STLOGEXPRESSIONPARSER_TOKEN_KIND_OPEN_BRACKET, 0]) {
[self objectExpr_];
}

effective 表示为了解析运行时表达式,它必须以“is”开头。这意味着 [abc] 将作为对象 expr 传递。

所以我需要帮助的是理解如何在语法语法中表达这个逻辑:

  1. 如果字符串以“is”开头,后跟一个 runtimeObject,或者只是一个 runtimeObject,则将其作为 runtimeExpr 处理。

  2. 否则将其作为 objectExpr 处理。

最佳答案

PEGKit 的创建者在这里。

我相信这里的问题是领先的可选 is?。任何以这样的可选前缀开头,然后匹配与另一条规则(在本例中为 runtimeObject)相似或相同的内容的规则都可能导致问题。

但解决方案很简单。稍微重新排序一下。 PEGKit 是确定性的,这意味着它将按照您在语法中指定的顺序尝试OR 替代方案。所以在这种情况下,只需将更长替代规则(objectExpr)放在第一(在中的runtimeExpr之前) expr 规则)。

试试这个,我相信一切都会成功的:

expr = objectExpr | runtimeExpr;
objectExpr = runtimeObject keyPath;
runtimeExpr = is runtimeObject | runtimeObject;
runtimeObject = '[' string ']';
is = 'is';
keyPath = string;

请注意我对 exprruntimeExpr 规则所做的更改。我怀疑只需更改 expr 即可解决此问题,但更改 runtimeExpr 是无害的。实验应该会告诉您是否确实需要更改 runtimeExpr

关于ios - PegKit:以不同方式处理相同工作的语法语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31152067/

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