2012-01-19 13 views
6

Data una semplice grammatica Parsekit.Completamento automatico di Parsekit

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

Se ho un parse parziale beer è possibile ottenere Parsekit per tornare i possibili completamenti alla frase?

risposta

4

Sviluppatore di ParseKit qui.

Sfortunatamente, in ParseKit non esiste un meccanismo "libero" che restituirà questi dati da solo.

Tuttavia, questo è esattamente il tipo di compito per cui ParseKit è progettato/adatto. Ma devi scrivere un codice da solo. Qualcosa del genere funzionerebbe:

Innanzitutto, modificare leggermente la grammatica per includere una produzione denominata per 'beer'. In questo modo sarà più facile implementare un callback:

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

quindi implementare un callback assemblatore per la beer produzione.

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

tuo 'cliente' o il codice di 'pilota' dovrebbe essere simile:

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; 

Questo dovrebbe darvi un'idea di come questi tipi di cose possono essere implementati con Parsekit. Per un esempio così piccolo questa soluzione potrebbe sembrare un eccesso (e probabilmente lo è). Ma per un grande esempio del mondo reale questa sarebbe una soluzione molto potente ed elegante per il completamento automatico.