ParseKit汇编器回调未调用:我做错了什么?
-
10-12-2019 - |
题
已经掌握了一些ParseKit语法语法(在演示应用程序中玩),我现在试图让我自己的迷你演示工作,但到目前为止没有太大的成功。汇编器回调没有被调用。
以下是 有关 密码。何时 testParse
运行解析器似乎可以做到这一点,并正确匹配我的字符串到我的 anything
生产(这也适用于演示),但didMatchAnything:只是没接到电话。
#import <Foundation/Foundation.h>
@class PKParser;
@interface FileParserThing : NSObject {
PKParser* _parser;
}
- (void)testParse;
@end
#import <ParseKit/ParseKit.h>
#import "FileParserThing.h"
@interface FileParserThing ()
@property (nonatomic, retain)PKParser* parser;
- (void)didMatchAnything:(PKAssembly *)a;
@end
@implementation FileParserThing
@synthesize parser = _parser;
-(id)init
{
if (!(self = [super init])) return nil;
NSString *g = @"@start = anything; anything = Any+;";
self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
return self;
}
- (void)testParse
{
NSString *s = @"Foo Bar";
NSLog(@"test parse with: %@", s);
[self.parser parse:s];
}
- (void)didMatchAnything:(PKAssembly *)a
{
NSLog(@"Hooray!");
}
@end
在ParseKit代码中挖掘,我可以看到PKParser的第129行
[assembler performSelector:assemblerSelector withObject:self withObject:a];
没有被处决,因为 assembler
是零。这反过来又把我带到解析器工厂;我对正在发生的事情的理解开始失败。
免责声明;我知道,我可能需要阅读 这本书, ,但一次一件事。我想得到一个小的概念证明工作,分叉出30只老鼠一本书之前,我可能永远不会再读,如果我的项目是一个非启动:)
解决方案
这里是ParseKit的开发者。
前一阵子我改变了汇编回调的签名接受 二 争论:
- 该 解析器 与当前令牌匹配。
- 该 大会 包含输入解析的当前状态。
以前,只有 一个 论点:的组装。
我不确定文档是否完全更新以反映这一点。
所以我怀疑如果你简单地将你的汇编器回调方法更改为this,它会起作用:
- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}
如果没有,让我知道,我会帮助进一步调试。
背景资料:我做了这个改变,因为我遇到了一个情况,我的汇编器回调真的需要检查刚刚进行当前匹配的解析器。
它还更密切地协调了强有力的可可公约。 代表 回调总是有 委派人 对象作为他们的第一个参数。事后看来,我有点希望我重新命名了整个概念 装配工 在ParseKit到 代表们.因为在Cocoa的说法中,这基本上就是汇编程序。
不隶属于 StackOverflow