6

単純な Parsekit 文法が与えられます。

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

部分的な解析beerがある場合、Parsekit に可能な補完を文に返すことは可能ですか?

4

1 に答える 1

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 でどのように実装できるかがわかります。このような小さな例では、このソリューションはやり過ぎのように見えるかもしれません (おそらくそうです)。しかし、現実世界の大規模な例では、これはオートコンプリートのための非常に強力で洗練されたソリューションになります。

于 2012-01-19T20:30:31.380 に答える