Не получается заставить работать простой пример ParseKit - PullRequest
3 голосов
/ 17 августа 2011

Я только что обнаружил ParseKit, но не могу заставить его работать на простом примере.

NSString *test = @"FOO:BAR";

    NSString *grammar = ...//get grammar txt file and read it into a string

    PKParser *parser = nil;
    parser = [[PKParserFactory factory] parserFromGrammar:grammar assembler:self];

    [parser parse:test];
}

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

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

Мой файл грамматики выглядит так:

@start = foo;
foo = 'FOO:' bar;
bar = 'BAR';

Но методы не срабатывают.

1 Ответ

2 голосов
/ 17 августа 2011

Разработчик ParseKit здесь.Пример выше не будет работать.По умолчанию токенизатор токенизирует это:

FOO:BAR

как три токена:

Word (FOO)
Symbol (:)
Word (BAR)

Проблема в том, что ваша грамматика ожидает слово типа 'FOO:', но двоеточия являются символьными символамипо умолчанию не символы Word.Если вы хотите, чтобы двоеточия (:) принимались в качестве допустимых внутренних символов Word, вам нужно настроить токенизатор, чтобы он принимал это.Я сомневаюсь, что ты действительно этого хочешь.Если вы это сделаете, прочитайте документы здесь, чтобы узнать, как настроить токенизатор: http://parsekit.com/tokenization.html

Я думаю, что лучшая «игрушечная» грамматика для начала может выглядеть примерно так:

@start = pair;
pair = foo colon bar;
foo = 'FOO';
colon = ':';
bar = 'BAR';

У вас есть большая гибкость в том, как вы делаете свои заявления в своей грамматике.Эквивалентная грамматика будет:

@start = foo ':' bar;
foo = 'FOO';
bar = 'BAR';
...