ParseKitの開発者はこちら。これが私のParseKit Grammar Answerです。
繰り返しますが、個々の文字の単純なフィルタリングは、おそらく ParseKit よりも正規表現を使用した方がうまくいくと言わざるを得ません。
とはいえ、 ParseKit grammarでこの種のことをしようとしている場合は、次の 1 つの方法があります。
私の文法:
@reportsWhitespaceTokens = YES;
@start = (reject! | passThru)+;
reject = '=';
passThru = ~reject;
つまり、この token を破棄し!
ます。はLogical Notです。~
このアセンブラー コールバックを定義します。
- (void)parser:(PKParser *)p didMatchPassThru:(PKAssembly *)a {
NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
PKToken *tok = [a pop];
if (!a.target) {
a.target = [NSMutableArray array];
}
[a.target addObject:tok];
}
ご覧のとおり、アセンブリのターゲットとして格納されている配列にpassThruトークンを蓄積するだけです。
私のドライバーコード:
NSString *g = // fetch grammar above
PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
NSString *s = @"= 2 + 2";
NSArray *toks = [p parse:s];
NSString *result = [toks componentsJoinedByString:@""];
NSLog(@"res '%@'", result);
NSAssert([result isEqualToString:@"2 + 2"], @"");
最後に、蓄積されたトークン (アセンブリのターゲット) をフェッチし、それらを文字列に結合します。