Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsekit autocompletion

Given a simple Parsekit grammar.

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

If I have a partial parse beer is it possible to get Parsekit to return the possible completions to the sentence?

like image 342
poulter7 Avatar asked Jan 19 '12 19:01

poulter7


1 Answers

Developer of ParseKit here. 

Unfortunately, there is no "free" mechanism in ParseKit which will return this data by itself. 

However, this is exactly the kind of task ParseKit is designed/well-suited for. But you must write some code yourself. Something like this would work:

First, change the grammar slightly to include a named production for 'beer'. This will make it easier to implement a callback:

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

Then  implement an assembler callback for the beer production.

- (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;
}

Your 'client' or 'driver' code should look like:

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;

This should give you an idea of how these types of things can be implemented with ParseKit. For such a small example this solution may look like overkill (and it probably is). But for a large real-world example this would be a very powerful and elegant solution for autocompletion.

like image 79
Todd Ditchendorf Avatar answered Nov 06 '22 02:11

Todd Ditchendorf