単純な Parsekit 文法が与えられます。
@start = sentence+;
sentence = 'beer' container;
container = 'bottle' | 'cup';
部分的な解析beer
がある場合、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 でどのように実装できるかがわかります。このような小さな例では、このソリューションはやり過ぎのように見えるかもしれません (おそらくそうです)。しかし、現実世界の大規模な例では、これはオートコンプリートのための非常に強力で洗練されたソリューションになります。