9

私は、グラマーを指定するためにBNFのような構文をとるObjective-CにParseKitを使用しています。

@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;

最後の行を含めるとエラーが発生します。基本的に、オブジェクトは家か何か他のものである可能性があると言いたいです。非終端記号「other」は、家ではなかった単語が何であれ、それをキャッチすることになっています。

私は「何でも-ここ」の考えを間違った方法で考えていますか?

ありがとう!

4

2 に答える 2

6

ParseKit の開発者はこちら。上記のカーマインの答えは素晴らしいので、彼のアドバイスに従うべきです。1 つの小さな追加メモ:

「家」が他のランダムな単語と一致したときにパーサーデリゲートが簡単に認識できるようにする場合は、上記の文法の最後の行を次のように変更します。

object = house | other;
house = 'house';
other = Word;

次に、Parser デリゲートに次の 2 つのコールバック メソッドを実装する必要があります。

- (void)parser:(PKParser *)p didMatchHouse:(PKAssembly *)a;
- (void)parser:(PKParser *)p didMatchOther:(PKAssembly *)a;

任意のトークン (単語だけでなく、数字、記号、引用符付き文字列など)とのother一致を許可する場合は、組み込み型を使用できます。その場合、上記の例の最後の行を次のように変更します。Any

other = Any;
于 2011-10-14T15:46:15.600 に答える
4

コメントで提案されているように、次のルールを置き換えるか、新しいルールを追加する必要がありotherますWord

other = Word;

'house'は であるため、ルールを次Wordのように直接置き換えることもできます。object

object = Word;

WordParseKitの Aは、文字 ( [a-zA-Z])、数字 ( )、および文字で始まる[0-9]記号-_、の連続したシーケンスです。'ParseKit トークンの詳細については、ドキュメントを参照してください。

于 2011-08-19T14:48:26.043 に答える