没有调用ParseKit汇编程序回调:我做错了什么?

时间:2012-03-10 11:28:02

标签: objective-c macos parsing parsekit

我必须掌握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本老鼠的书之前,如果我的项目不是首发,我可能永远不会再读一遍:)

1 个答案:

答案 0 :(得分:5)

ParseKit的开发人员。

前段时间我更改了Assembler回调的签名以接受两个参数:

  1. 与当前令牌匹配的 Parser
  2. 包含输入解析当前状态的程序集
  3. 以前,只有一个参数:大会。

    我不确定文档是否已完全更新以反映这一点。

    所以我怀疑如果您只是将Assembler回调方法更改为此方法,它将起作用:

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

    如果没有,请告诉我,我会帮助进一步调试。


    对于背景:我做了这个改变,因为我遇到了一个情况,我的Assembler回调确实需要检查刚刚进行当前匹配的Parser。

    它还更紧密地协调了委托回调的强大Cocoa约定,这些回调始终将委托人对象作为其第一个参数。事后我希望我将ParseKit中汇编程序的整个概念重命名为代表。因为在可可的说法中,这基本上就像汇编者一样。