3

我正在使用 PK 来尝试标记 .gift 文件格式。我正在尝试执行以下操作:

给定一个与此类似的字符串:@"= 2 + 2"

我试图返回“2 + 2”,而无需费力地确定越过该字符串的标记是否等于符号,然后定义输出字符串应该如何。我想要做的是,如果 [PKToken.stringValue isEqualToString: @"="] 将该值从 PKTokenizer 中弹出,然后返回字符串的其余部分,其格式仍然完好无损。

让我知道这是否足够清楚......

——斯凯拉。

4

2 回答 2

2

ParseKit的开发者在这里。这是我的ParseKit Tokenizer Answer

首先,我必须说,使用正则表达式可能比 ParseKit 更好地完成单个字符的简单过滤。

也就是说,如果您尝试使用 ParseKit标记器执行此类操作,请执行以下操作:

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);
于 2012-04-10T02:03:57.483 回答
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"], @"");

最后,我们只需获取累积的标记(程序集的目标)并将它们组合成一个字符串。

于 2012-04-10T02:37:29.990 回答