我正在使用PK来尝试和标记化.gift文件格式。我正在尝试执行以下操作:
给定一个与此类似的字符串:@“= 2 + 2”
我试图返回'2 + 2',而不是通过确定正在越过该字符串的令牌是否等于符号然后定义输出字符串应该如何的麻烦。我要做的是说,如果[PKToken.stringValue isEqualToString:@“=”]从PKTokenizer中弹出该值,然后返回格式的其余部分仍然保持格式化。
让我知道这是否足够明确......
- 斯凯勒
答案 0 :(得分:2)
ParseKit的开发人员。这是我的 ParseKit Tokenizer Answer 。
首先,我必须说使用正则表达式而不是ParseKit可以更好地完成对单个字符的简单过滤。
也就是说,如果您尝试使用ParseKit tokenizer 进行此类操作,请按以下步骤操作:
NSString *s = @"= 2 + 2";
PKTokenizer *t = [PKTokenizer tokenizerWithString:s];
t.whitespaceState.reportsWhitespaceTokens = YES;
PKToken *eof = [PKToken EOFToken];
PKToken *tok = nil;
NSMutableArray *toks = [NSMutableArray array];
while ((tok = [t nextToken]) != eof) {
if (![tok.stringValue isEqualToString:@"="]) {
[toks addObject:tok];
}
}
NSString *result = [toks componentsJoinedByString:@""];
NSLog(@"%@", result);
答案 1 :(得分:2)
ParseKit的开发人员。这是我的 ParseKit语法答案。
同样,我必须说使用正则表达式而不是ParseKit可以更好地完成对单个字符的简单过滤。
那就是说,如果你试图用ParseKit 语法来做这种事情,这里有一种方法:
我的语法:
@reportsWhitespaceTokens = YES;
@start = (reject! | passThru)+;
reject = '=';
passThru = ~reject;
!
表示丢弃此令牌。 ~
逻辑不。
定义此汇编程序回调:
- (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"], @"");
最后,我们只需获取累积的标记(程序集的目标)并将它们组合成一个字符串。