簡體   English   中英

沒有調用ParseKit匯編程序回調:我做錯了什么?

[英]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回調的簽名以接受兩個參數:

  1. 與當前令牌匹配的Parser
  2. Assembly包含輸入解析的當前狀態。

以前,只有一個論點:大會。

我不確定文檔是否已完全更新以反映這一點。

所以我懷疑如果你只是將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM