Простой пример ParseKit не работает, а parserFromGrammer показывает множество исключений с PEGRecognitionExceptions в консоли

Я только что наткнулся на ParseKit и включил его в свой проект IOS, используя инструкции из http://parsekit.com/iphone.html. Я получил его из Google Code, проверенная версия - 1543. Все скомпилировано и построено нормально.

Затем я попытался использовать (окончательный рабочий) простой пример из одного из сообщений - Может » t получить простой пример работы ParseKit

NSString *test = @"FOO : BAR";

NSString *grammar = @"@start = foo ':' bar; foo = 'FOO'; bar = 'BAR';";

PKParser *parser = nil;
NSError *err = nil;
parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self error:&err];
NSLog(@"parser: error1: %@", err);

[parser parse:test error:&err];
NSLog(@"parser: error2: %@", err);


- (void)didMatchFoo:(PKAssembly *)a
{
   NSLog(@"FOO");
}

- (void)didMatchBar:(PKAssembly *)a
{
   NSLog(@"BAR");
} 

когда исполнение доходит до линии

    parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self error:&err];

Я вижу много сообщений об ошибках в консоли. DidMatchFoo и didMatchBar не срабатывают.

Вот сообщения с консоли:

objc[53244]: EXCEPTIONS: throwing 0xb47f040 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd2e0] for exception 0xb47f020
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd2e0] for exception 0xb47f020
objc[53244]: EXCEPTIONS: handling exception 0xb47f020 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xb47f5e0 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd170] for exception 0xb47f5c0
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd170] for exception 0xb47f5c0
objc[53244]: EXCEPTIONS: handling exception 0xb47f5c0 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xa589360 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd230] for exception 0xa589340
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd230] for exception 0xa589340
objc[53244]: EXCEPTIONS: handling exception 0xa589340 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xa589470 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd290] for exception 0xa589450
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd290] for exception 0xa589450
objc[53244]: EXCEPTIONS: handling exception 0xa589450 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xa58bd80 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd380] for exception 0xa58bd60
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd380] for exception 0xa58bd60
objc[53244]: EXCEPTIONS: handling exception 0xa58bd60 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8b848e0 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd210] for exception 0x8b848c0
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd210] for exception 0x8b848c0
objc[53244]: EXCEPTIONS: handling exception 0x8b848c0 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8ba5610 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd2d0] for exception  0x8ba55f0
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd2d0] for exception 0x8ba55f0
objc[53244]: EXCEPTIONS: handling exception 0x8ba55f0 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xb57a160 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd330] for exception 0xb57a140
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd330] for exception 0xb57a140
objc[53244]: EXCEPTIONS: handling exception 0xb57a140 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xb57a730 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd2e0] for exception 0xb57a710
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd2e0] for exception 0xb57a710
objc[53244]: EXCEPTIONS: handling exception 0xb57a710 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xb57ac90 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd170] for exception 0xb57ac70
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd170] for exception 0xb57ac70
objc[53244]: EXCEPTIONS: handling exception 0xb57ac70 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0xb57af30 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd230] for exception 0xb57af10
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd230] for exception 0xb57af10
objc[53244]: EXCEPTIONS: handling exception 0xb57af10 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler 
objc[53244]: EXCEPTIONS: throwing 0x8ba5c40 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd290] for exception 0x8ba5c20
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd290] for exception 0x8ba5c20
objc[53244]: EXCEPTIONS: handling exception 0x8ba5c20 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8ba5f40 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd380] for exception 0x8ba5f20
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd380] for exception 0x8ba5f20
objc[53244]: EXCEPTIONS: handling exception 0x8ba5f20 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8e80b40 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd210] for exception 0x8e80b20
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd210] for exception 0x8e80b20
objc[53244]: EXCEPTIONS: handling exception 0x8e80b20 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8e4ac80 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd2d0] for exception 0x8e4ac60
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd2d0] for exception 0x8e4ac60
objc[53244]: EXCEPTIONS: handling exception 0x8e4ac60 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8ba6200 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd330] for exception 0x8ba61e0
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd330] for exception 0x8ba61e0
objc[53244]: EXCEPTIONS: handling exception 0x8ba61e0 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler
objc[53244]: EXCEPTIONS: throwing 0x8ba62c0 (object 0xa17b7b0, a PEGRecognitionException)
objc[53244]: EXCEPTIONS: searching through frame [ip=0xf23ac sp=0xbfffd420] for exception 0x8ba62a0
objc[53244]: EXCEPTIONS: catch(PEGRecognitionException)
objc[53244]: EXCEPTIONS: unwinding through frame [ip=0xf23ac sp=0xbfffd420] for exception 0x8ba62a0
objc[53244]: EXCEPTIONS: handling exception 0x8ba62a0 at 0xf2406
objc[53244]: EXCEPTIONS: finishing handler

[parser parse:test error:&err];

Не вызывает обратные вызовы и не возвращает никаких ошибок.

Будем очень признательны за любые указатели или помощь!

PS - Я раскомментировал некоторые инструкции NSLOG в ParseKit, чтобы узнать, какие исключения были выше:

Для грамматики

    NSString *grammar = @"@start = expr; expr = abc col def; abc = 'ABC'; col = ':'; def = 'DEF';";

я получил

Expected : @
Line : 1
Near : ; expr = abc 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def 
Found : col

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def 
Found : def

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def 
Found : def

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : col

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : def

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : def

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : ;

Expected : @
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : =

No viable alternative found in rule 'predicate'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : ;

No viable alternative found in rule 'primaryExpr'.
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : ;

Expected : |
Line : 1
Near : ; expr = abc col def ; abc = 'ABC' ; col = ':' ; def = 'DEF' ; 
Found : ;

No viable alternative found in rule 'statement'.
Line : 2147483647
Near : «EOF» 
Found : «EOF»

person sridhar_rajagopal    schedule 30.08.2013    source источник


Ответы (1)


Я заставил его работать ... вроде как!

Где вещи отличаются от документации ...

Я связался с libParseKitMobile.a ... это было очевидно, поскольку это была единственная цель для iOS.

Я использовал ParserGenApp, чтобы сначала сгенерировать .h и .m для моей грамматики.

Я включил эти сгенерированные файлы в свой проект. Мой проект не был построен с помощью ARC, а ParseKit делает это, поэтому я добавил -fobjc-arc к флагу компиляции сгенерированного .m

Тогда использование в моем коде было следующим:

NSString *test = @"ABC : DEF";

MyParser *parser = [[MyParser alloc] init];
NSError *err = nil;
PKAssembly *result = [parser parseString:test
                               assembler:self
                                   error:&err];

if (!result) {
    if (err) NSLog(@"%@", err);
} else {
    NSLog(@"%@", [result description]);
}

Обратный вызов должен иметь форму:

- (void)parser:(PKParser *)p didMatchAbc:(PKAssembly *)a;

(в документации ParseKit упоминается - (void) didMatchAbc: (PKAssembly * a); но это не сработает, поскольку требуемая подпись отличается)

Скачивание и опробование полного проекта MiniMath с Github помогло мне в этом разобраться - https://github.com/itod/ParseKitMiniMathExample

Пример MiniMath также был доступен для загрузки в виде zip-архива, но, похоже, в нем нет встроенных файлов ParseKit, и у меня были некоторые проблемы с этим.

Надеюсь, это поможет другим, желающим использовать ParseKit в своих проектах iOS!

Тодд Дитчендорф, большое спасибо за вашу работу над ParseKit! К сожалению, он немного фрагментирован - версия Github, версия кода Google и документация на веб-сайте скудная и интересная, содержит ссылки как на код Github, так и на код Google, что усугубляет путаницу.

parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self error:&err];

похоже не работает. Однако сначала создание кода парсера, а затем его использование, похоже, работает.

Было бы здорово, если бы ParseKit можно было очистить и обновить до последней версии! Это очень полезный инструмент, тем более что я не вижу упоминания другой альтернативы. Если вам нужна помощь в очистке ParseKit и документации к нему, я буду рад помочь!

Привет, Шридхар

person sridhar_rajagopal    schedule 04.09.2013