Парсекит автозаполнение - PullRequest
6 голосов
/ 19 января 2012

Учитывая простую грамматику Parsekit.

@start = sentence+;
sentence = 'beer' container;
container = 'bottle' | 'cup';

Если у меня есть частичный анализ beer, можно ли заставить Parsekit вернуть возможные дополнения к предложению?

1 Ответ

4 голосов
/ 20 января 2012

Разработчик ParseKit здесь.

К сожалению, в ParseKit нет «свободного» механизма, который бы сам возвращал эти данные.

Тем не менее, это именно та задача, для которой предназначен ParseKit. Но вы должны написать код самостоятельно. Примерно так будет работать:

Во-первых, немного измените грамматику, чтобы включить именованную продукцию для 'beer'. Это облегчит реализацию обратного вызова:

@start = sentence+;
sentence = beer container;
beer = 'beer';
container = 'bottle' | 'cup';

Затем реализуйте обратный вызов ассемблера для производства beer.

- (void)parser:(PKParser *)p didMatchBeer:(PKAssembly *)a {

    // here you could find some clever way to look up the completions for 'beer' prefix
    // or you can hardcode the completions yourself
    NSArray *completions = [NSArray arrayWithObjects:@"bottle", @"cup", nil];

    // store the completions as the current assembly's target
    a.target = completions;
}

Ваш код клиента или драйвера должен выглядеть следующим образом:

PKParser *p = [PKParserFactory parserFromGrammar:g assembler:a];

PKAssembly *input = [PKAssembly assemblyWithString:@"beer"]; // get this string from the user in reality
PKAssembly *result = [p bestMatchFor:input];
NSArray *completions = result.target;

Это должно дать вам представление о том, как эти типы вещей могут быть реализованы с помощью ParseKit. Для такого небольшого примера это решение может выглядеть как излишнее (и это, вероятно, так). Но для большого реального примера это было бы очень мощное и элегантное решение для автозаполнения.

...