Обратные вызовы ассемблера ParseKit не вызываются:Что я делаю не так?

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

Вопрос

Немного разобравшись с синтаксисом грамматики ParseKit (поигравшись в демо-приложении), я теперь пытаюсь заставить работать свою собственную мини-демо, но пока без особого успеха.Обратные вызовы ассемблера не вызываются.

Ниже представлена ​​сокращенная версия соответствующий код.Когда testParse запускается синтаксический анализатор, кажется, все в порядке и правильно сопоставляет мою строку с моей anything производство (которое также работает в демо-версии), но сделалMatchAnything:просто не звонят.

#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 для Делегаты.На языке Cocoa это, по сути, ассемблеры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top