我必须掌握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
为零。反过来,这导致我进入解析器工厂;我对正在发生的事情的理解开始失败。
声明;我知道,我可能需要阅读 The Book ,但有一件事情。我希望获得一个小概念证明工作,然后在分配30本老鼠的书之前,如果我的项目不是首发,我可能永远不会再读一遍:)
答案 0 :(得分:5)
ParseKit的开发人员。
前段时间我更改了Assembler回调的签名以接受两个参数:
以前,只有一个参数:大会。
我不确定文档是否已完全更新以反映这一点。
所以我怀疑如果您只是将Assembler回调方法更改为此方法,它将起作用:
- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}
如果没有,请告诉我,我会帮助进一步调试。
对于背景:我做了这个改变,因为我遇到了一个情况,我的Assembler回调确实需要检查刚刚进行当前匹配的Parser。
它还更紧密地协调了委托回调的强大Cocoa约定,这些回调始终将委托人对象作为其第一个参数。事后我希望我将ParseKit中汇编程序的整个概念重命名为代表。因为在可可的说法中,这基本上就像汇编者一样。