2012-01-19 4 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生産のためのアセンブラコールバックを実装します。これはあなたに物事のこれらのタイプはParseKitで実現することができるかのアイデアを与える必要があり

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; 

:あなたの「クライアント」または「ドライバのコードは次のようになります

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

。このような小さな例では、この解決法は過剰なもののように見えるかもしれません(そしておそらくそうです)。しかし実際の大きな例では、これはオートコンプリートのための非常に強力で洗練されたソリューションになります。

関連する問題