【问题标题】:ParseKit assembler callbacks not called: What am I doing wrong?未调用 ParseKit 汇编程序回调:我做错了什么?
【发布时间】:2012-03-10 11:28:01
【问题描述】:

已经掌握了一些 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 只老鼠买一本书,如果我的项目不是初学者,我可能永远不会再读 :)

【问题讨论】:

    标签: objective-c macos parsing parsekit


    【解决方案1】:

    这里是 ParseKit 的开发者。

    不久前,我更改了 Assembler 回调的签名以接受 两个 参数:

    1. 与当前标记匹配的解析器
    2. Assembly 包含输入解析的当前状态。

    以前,只有一个参数:大会。

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

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

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

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


    对于背景:我进行此更改是因为我遇到了一种情况,即我的 Assembler 回调确实需要检查刚刚进行当前匹配的 Parser。

    它还更紧密地对齐了 Delegate 回调的强 Cocoa 约定,该回调始终将 delegator 对象作为其第一个参数。事后看来,我有点希望我在 ParseKit 中将 Assemblers 的整个概念重命名为 Delegates。因为用 Cocoa 的说法,这基本上就是汇编程序。

    【讨论】:

    • Rich,我在这里设置了您的示例并按照我的建议进行了调整,它似乎确实有效,所以应该是这样。
    • 好东西,做到了。非常感谢您这么快的回复!
    • 如果您可以使用更多最新示例更新您的网站,包括错误的用法:params 和新的解析器:param,那就太好了。否则,ParseKit 看起来很棒!
    • @Todd 如果您将所有 ParseKit 文档放在 proejct 的 GitHub wiki 上以便用户可以编辑文档,那就太好了。如果它们是用户可编辑的,我现在可以轻松地对文档进行这些更改。
    • @ToddDitchendorf - 成功了。此页面的底部需要更新:parsekit.com/grammars.html - 我正在使用页面上的示例,直到我按照您在此答案中的建议更改了我的签名,它才起作用。给你一个无关紧要的问题:我正在制作一个 Xcode 插件,它利用你的插件来解析用户键入的代码。我需要做什么才能遵守 ParseKit 中的许可证?如果可能,我宁愿不发布源代码,但如果有必要,我可以这样做......
    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多