デベロッパーParseKitここに。
ParseKitには、入力時に解析エラーが発生したことをユーザーが理解できるようにするためのヒントが2つあります。
-[PKParser bestMatchFor:]
PKTrack
クラス
あなたが-bestMatchFor:
方法を知っているように、あなたがこのような場合には期待して何をしていない場合でも聞こえます。
私はPKTrack
クラスがここでもっと役立つと思います。 Metsker's bookに記載されているように、PKTrack
はサブパーザが必要であることを除いて全く同じようにPKSequence
となり、サブパラザがすべて一致しないとエラーが表示されます。
は、だからここにあなたの例の入力のための文法です:
@start = '(' expr ')' | expr;
expr = ('+' | '-') term term;
term = '(' expr ')' | Word;
連続的に記載されている任意の作品は、シーケンスです - 代わりにトラックである可能性があります。
これらのシーケンスをトラックに変更する利点は、入力が一致しない場合、人間が読める解析エラーメッセージでNSException
がスローされることです。欠点は、これらのトラック例外を捕捉するために、工場で生成されたパーサーのすべての用途をtry/catchブロックでラップする必要があることです。
現在、問題は、PKParserFactory
がトラックを使用してパーサーを作成したことがないことです。代わりに、常にSequencesを使用します。
だから、私はをに追加しました。トランクの頭に新しいオプションが追加されました。Google Code(あなたはうつ病にする必要があります)。
PKParserFactory.m
で
#define USE_TRACK 0
これは、デフォルトで0
です。この定義を1
に変更すると、シーケンスの代わりにトラックが使用されます。
(+ a - b c))
と、このクライアントコード:
NSString *g = // fetch grammar above
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"(+ a - b c))";
@try {
PKAssembly *res = [p parse:s];
NSLog(@"res %@", res);
}
@catch (NSException *exception) {
NSLog(@"Parse Error:%@", exception);
}
あなたは素敵っぽい人間が読めるエラーが発生します。
Parse Error:
After : (+ a
Expected : Alternation (term)
Found : -
希望したがって、上記の文法や、このような不正な入力与えられましたそれは助ける。