2012-01-19 12 views
6

Otrzymano prostą gramatykę Parsekit.Autouzupełnianie parsekitów

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

Jeśli mam częściowy parse beer jest to możliwe, aby uzyskać Parsekit powrócić możliwe uzupełnienia zdanie?

Odpowiedz

4

Deweloper ParseKit tutaj.

Niestety, nie ma "darmowego" mechanizmu ParseKit, który zwróci te dane samodzielnie.

Jest to jednak dokładnie to, do czego przeznaczony jest ParseKit. Ale sam musisz napisać kod. Coś takiego mogłoby zadziałać:

Po pierwsze, zmień nieco gramatykę, aby zawierała nazwaną produkcję dla 'beer'. Pozwoli to na łatwiejsze do wdrożenia callback:

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

Następnie wdrożyć zwrotnego asemblera dla produkcji 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; 
} 

Twój „klient” lub „kierowca” Kod powinien wyglądać następująco:

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; 

To powinno dać wyobrażenie, jak tego typu rzeczy mogą być realizowane z ParseKit. Dla tak małego przykładu to rozwiązanie może wyglądać jak przesada (i prawdopodobnie tak jest). Ale dla dużego przykładu w świecie rzeczywistym byłoby to bardzo potężne i eleganckie rozwiązanie do autouzupełniania.