لم يتم استدعاء عمليات الاسترجاعات لمجمع ParseKit:ما الخطأ الذي افعله؟

StackOverflow https://stackoverflow.com//questions/9646054

سؤال

بعد أن تمكنت من التعامل قليلاً مع بناء جملة ParseKit النحوي (اللعب في التطبيق التجريبي)، أحاول الآن تشغيل العرض التوضيحي المصغر الخاص بي، ولكن دون نجاح كبير حتى الآن.لا يتم الحصول على استدعاء عمليات الاسترجاعات المجمّع.

فيما يلي نسخة مكثفة من مناسب شفرة.متى testParse يبدو أن تشغيل المحلل اللغوي يفعل كل شيء على ما يرام ويطابق سلسلتي بشكل صحيح مع سلسلة my anything production (والذي يعمل أيضًا في العرض التوضيحي) ولكن 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، أستطيع رؤية السطر 129 من PKParser

[assembler performSelector:assemblerSelector withObject:self withObject:a];

لا يتم إعدامه، لأن assembler لا شيء.والذي بدوره يقودني إلى مصنع المحلل اللغوي؛حيث يبدأ فهمي لما يحدث بالفشل.

تنصل؛أعلم، ربما أحتاج إلى القراءة الكتاب, ، ولكن شيئًا واحدًا في كل مرة.أرغب في الحصول على دليل صغير على نجاح المفهوم، قبل أن أصرف 30 فأرة مقابل كتاب قد لا أقرأه مرة أخرى إذا لم يكن مشروعي في مرحلة البداية :)

هل كانت مفيدة؟

المحلول

مطور ParseKit هنا .

منذ فترة قمت بتغيير توقيع عمليات الاسترجاعات الخاصة بالمجمع لقبولها اثنين الحجج:

  1. ال محلل الذي يطابق الرمز الحالي.
  2. ال حَشد يحتوي على الحالة الحالية لتحليل الإدخال.

في السابق، لم يكن هناك سوى واحد دعوى:الجمعية.

لست متأكدًا من تحديث المستندات بالكامل لتعكس ذلك.

لذا أظن أنه إذا قمت ببساطة بتغيير طريقة رد اتصال المجمع الخاص بك إلى هذا، فسوف يعمل:

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

إذا لم يكن الأمر كذلك، فأخبرني بذلك، وسأساعدك في إجراء مزيد من التصحيح.


للخلفية:لقد أجريت هذا التغيير لأنني واجهت موقفًا كان فيه رد اتصال المجمع الخاص بي يحتاج حقًا إلى فحص المحلل اللغوي الذي أجرى للتو المطابقة الحالية.

كما أنها تتماشى بشكل أوثق مع اتفاقية الكاكاو القوية مندوب عمليات الاسترجاعات التي تحتوي دائمًا على مندوب كائن كحجة أولى.بعد فوات الأوان، كنت أتمنى لو قمت بإعادة تسمية المفهوم بأكمله المجمعون في ParseKit ل المندوبون.نظرًا لأنه في لغة الكاكاو، هذا هو في الأساس ما يعنيه المجمعون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top