[英]How do ParseKit's Assembler Callbacks work? Where should I store the work I do in them?
[英]ParseKit assembler callbacks not called: What am I doing wrong?
我必須掌握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本老鼠買一本書,如果我的項目是非首發,我可能永遠不會再讀了:)
這里是ParseKit的開發者。
前段時間我更改了Assembler回調的簽名以接受兩個參數:
以前,只有一個論點:大會。
我不確定文檔是否已完全更新以反映這一點。
所以我懷疑如果你只是將Assembler回調方法更改為此方法,它將起作用:
- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}
如果沒有,請告訴我,我將幫助進一步調試。
對於背景:我做了這個改變,因為我遇到了一個情況,我的Assembler回調真的需要檢查剛剛進行當前匹配的Parser。
它還更緊密地對齊了委托回調的強大Cocoa約定,它總是將委托者對象作為它們的第一個參數。 事后來說,我有點希望我已經將ParseKit中匯編程序的整個概念重命名為代表 。 因為在Cocoa的說法中,這基本上就像匯編者一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.