1

単語の接頭辞のように、ParseKitを使用して部分文字列を解析したいとします。たとえば、「preview」と「review」を解析したいと思います。だから私の文法は次のようになるかもしれません:

@start  = prefix 'view';
prefix = 'pre' | 're';

これで、ParseKitを変更せずに、「preview」と「review」を一致させることができますが、「preview」または「review」を一致させることはできません。ドキュメントを見ると、PKTokeinzerの単語の状態をカスタマイズする必要があると思います。これは、「Word」トークンを終了するための空白を探しているためです。どうすればそれを回避できますか?

4

1 に答える 1

1

ここでParseKitの開発者。

質問を完全に理解できるかどうかはわかりませんが、多少見当違いのように聞こえると思います。

サブトークンまたは文字を一致させる方法を探している場合は、正規表現がParseKitよりもニーズに適している可能性があります。

ParseKit文法は、ParseKitトークナイザー(PKTokenizerクラス)によって生成されたトークンと一致します。個々のキャラクターではありません。

の入力からとトークンPKTokenizerを生成することが不可能というわけではありません。しかし、それは私が賢明でなく、不必要に複雑と呼ぶコードのカスタマイズを必要とするでしょう。それは悪い考えだと思います。previewpreview

とにかく(正規表現ではなく)ParseKitを使用する場合は、(文法ではなく)アセンブラーコールバックでサブ解析を実行するだけです。

だから文法で:

@start = either;
either = 'preview' | 'review';

そしてObjCでは:

- (void)parser:(PKParser *)p didMatchEither:(PKAssembly *)a {
    PKToken *tok = [a pop];
    NSString *str = tok.stringValue;

    if ([str hasPrefix:@"pre"]) {
        ... // handle 'preview'
    } else {
        ... // handle 'review'
    }
}

また、ParseKit Grammarsは、RegExを介した一致するトークンをサポートしていることを忘れないでください。したがって、次で終わるすべての単語を一致させたい場合view

@start = anyView;
anyView = /\b\w*?view\b/;

お役に立てば幸いです。

于 2013-03-03T00:00:45.000 に答える