gpt4 book ai didi

objective-c - parekit 对选择器进行意外调用

转载 作者:搜寻专家 更新时间:2023-10-30 20:22:42 24 4
gpt4 key购买 nike

我有以下非常简单(测试)的语法文件

@start = expression+;
expression = keyword | otherWord;
otherWord = Word;
keyword = a | the;
a = 'a';
the = 'the';

然后我运行以下代码:

// Grammar contains the contents of the above grammar file.
PKParser *parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self];
NSString *s = @"The parrot";
[parser parse:s];
PKReleaseSubparserTree(parser);

以及以下方法:

- (void)didMatchA:(PKAssembly *)a{
[self log:a type:@"didMatchA "];
}
- (void)didMatchThe:(PKAssembly *)a{
[self log:a type:@"didMatchThe "];
}
- (void)didMatchKeyword:(PKAssembly *)a{
[self log:a type:@"didMatchKeyword "];
}
- (void)didMatchExpression:(PKAssembly *)a{
[self log:a type:@"didMatchExpression "];
}
- (void)didMatchOtherWord:(PKAssembly *)a{
[self log:a type:@"didMatchOtherWord "];
}

-(void) log:(PKAssembly *) assembly type:(NSString *) type{
PKToken * token = [assembly top];
NSLog(@"Method: [%@], token: %@, assembly: %@", type, token, assembly);
}

最后我在日志中得到了这些消息:

[1] Method: [didMatchThe        ], token: The, assembly: [The]The^parrot
[2] Method: [didMatchKeyword ], token: The, assembly: [The]The^parrot
[3] Method: [didMatchOtherWord ], token: The, assembly: [The]The^parrot
[4] Method: [didMatchExpression ], token: The, assembly: [The]The^parrot
[5] Method: [didMatchExpression ], token: The, assembly: [The]The^parrot
[6] Method: [didMatchOtherWord ], token: parrot, assembly: [The, parrot]The/parrot^
[7] Method: [didMatchExpression ], token: parrot, assembly: [The, parrot]The/parrot^

这有点道理,但我不明白为什么会出现 %5。我真的很想能够删除双重匹配,以便诸如“The”之类的关键字仅触发 didMatchThe 而不是 didMatchKeyword

不幸的是,parekit 上的 doco 在语法语法以及它如何决定触发方法方面似乎不存在。是的,我也翻阅过源代码:-)

有没有人有使用 parekit 的经验并且可以对此有所了解?

最佳答案

我是 ParseKit 的开发者,这实际上是正确的行为。这里有一些项目可以帮助解决这个问题:

  1. 了解 ParseKit 工作原理的最佳方式是购买 "Building Parsers with Java"史蒂文·约翰·梅茨克 (Steven John Metsker) 着。 ParseKit 几乎完全基于此处列出的设计。

  2. ParseKit 的解析器组件非常动态,并且具有无限前瞻性。这使其成为快速开发或轻松解析小输入的理想选择,但这也意味着 ParseKit 在解析大型文档时表现出极差的性能。

  3. 由于 ParseKit 的无限前瞻性,您实现的汇编器方法将被多次调用。实际上,正如您上面所描述的那样,它们似乎会被调用太多次。这是正常的。 ParseKit 随时都在探索它可用的每条可能的解析路径,所以你会得到“太多”的回调。

  4. 答案是永远不要在汇编器回调方法中使用 ivar。在您的汇编程序方法中,您应该始终在当前 PKAssemblytarget ivar 中保持您正在处理的状态。

    a.目标

当前的 PKAssembly 是传递给您的回调方法的那个。

希望对您有所帮助。

关于objective-c - parekit 对选择器进行意外调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237171/

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