6
給定一個簡單的Parsekit語法。Parsekit自動完成
@start = sentence+;
sentence = 'beer' container;
container = 'bottle' | 'cup';
如果我有一個局部解析beer
是有可能得到Parsekit到可能的補回了句?
給定一個簡單的Parsekit語法。Parsekit自動完成
@start = sentence+;
sentence = 'beer' container;
container = 'bottle' | 'cup';
如果我有一個局部解析beer
是有可能得到Parsekit到可能的補回了句?
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實現的想法。對於這樣一個小例子,這個解決方案可能看起來像是矯枉過正(可能是)。但是對於一個真實世界的例子來說,這將是一個非常強大和優雅的自動完成解決方案。