2012-01-19 154 views
6

給定一個簡單的Parsekit語法。Parsekit自動完成

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

如果我有一個局部解析beer是有可能得到Parsekit到可能的補回了句?

回答

4

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實現的想法。對於這樣一個小例子,這個解決方案可能看起來像是矯枉過正(可能是)。但是對於一個真實世界的例子來說,這將是一個非常強大和優雅的自動完成解決方案。