已经掌握了一些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 是零。这反过来又把我带到解析器工厂;我对正在发生的事情的理解开始失败。

免责声明;我知道,我可能需要阅读 这本书, ,但一次一件事。我想得到一个小的概念证明工作,分叉出30只老鼠一本书之前,我可能永远不会再读,如果我的项目是一个非启动:)

有帮助吗?

解决方案

这里是ParseKit的开发者。

前一阵子我改变了汇编回调的签名接受 争论:

  1. 解析器 与当前令牌匹配。
  2. 大会 包含输入解析的当前状态。

以前,只有 一个 论点:的组装。

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

所以我怀疑如果你简单地将你的汇编器回调方法更改为this,它会起作用:

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

如果没有,让我知道,我会帮助进一步调试。


背景资料:我做了这个改变,因为我遇到了一个情况,我的汇编器回调真的需要检查刚刚进行当前匹配的解析器。

它还更密切地协调了强有力的可可公约。 代表 回调总是有 委派人 对象作为他们的第一个参数。事后看来,我有点希望我重新命名了整个概念 装配工 在ParseKit到 代表们.因为在Cocoa的说法中,这基本上就是汇编程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top