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であるため、実行されていません。これにより、パーサー ファクトリにたどり着きます。何が起こっているのかについての私の理解が失敗し始めます。
免責事項; 私はおそらく本を読む必要があることを知っていますが、一度に1つずつ。私のプロジェクトがスターターではない場合、二度と読まないかもしれない本のために30匹のマウスをフォークする前に、小さな概念実証を行いたい:)