在掌握了 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
是 nil。这反过来又把我带到了解析器工厂;我对正在发生的事情的理解开始失败。
免责声明;我知道,我可能需要阅读The Book,但一次只有一件事。我想先做一个小的概念证明,然后再花 30 只老鼠买一本书,如果我的项目不是初学者,我可能永远不会再读 :)