Немного разобравшись с синтаксисом грамматики 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, я вижу эту строку 129 PKParser
[assembler performSelector:assemblerSelector withObject:self withObject:a];
Не выполняется, потому что assembler
- ноль. Что, в свою очередь, приводит меня к фабрике парсеров; где мое понимание того, что происходит, начинает терпеть неудачу.
Отказ от ответственности; Я знаю, что, наверное, мне нужно прочитать Книгу , но по одной вещи за раз. Я хочу получить небольшое доказательство работоспособности концепции, прежде чем раскошелиться на 30 мышей для книги, которую я мог бы никогда больше не прочитать, если мой проект не начальный:)