3

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匹のマウスをフォークする前に、小さな概念実証を行いたい:)

4

1 に答える 1

5

ParseKit の開発者はこちら。

しばらく前に、アセンブラー コールバックのシグネチャを変更して、2 つの引数を受け入れるようにしました。

  1. 現在のトークンに一致したパーサー。
  2. 入力解析の現在の状態を含むAssembly

以前は、引数は1 つだけでした: The Assembly.

これを反映するためにドキュメントが完全に更新されているかどうかはわかりません。

したがって、アセンブラーのコールバック メソッドを次のように変更するだけで機能すると思います。

- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a {
    NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}

そうでない場合はお知らせください。さらにデバッグをお手伝いします。


背景: この変更を行ったのは、アセンブラー コールバックが、現在の一致を行ったばかりのパーサーを検査する必要がある状況に遭遇したためです。

また、最初の引数としてデリゲータオブジェクトを常に持つDelegateコールバックの強力な Cocoa 規則に、より厳密に合わせました。後から考えると、 ParseKitのAssemblersの概念全体をDelegatesに名前を変更しておけばよかったと思います。Cocoa の用語では、それが基本的にアセンブラです。

于 2012-03-10T15:45:36.820 に答える