ParseKit的开发者在这里。
首先,查看另一个与 ParseKit question 相关的答案。那里有很多相关信息(以及那里链接的其他答案)。
然后,对于您的特定示例,关键是在 afunction
开始时设置标志,并在结束时清除标志。因此,每当var
匹配 decl 时,只需检查标志。如果设置了标志,则忽略 var decl。如果未设置标志,则存储它。
将我提到的标志存储在作为PKAssembly
汇编程序回调函数参数的对象上是非常重要的。您不能将该标志存储为 ivar 或全局 var。那是行不通的(有关详细原因,请参阅先前链接的答案)。
下面是一些用于设置标志和匹配 var decls 的示例回调。他们应该让您了解我在说什么:
// matched when function begins
- (void)parser:(PKParser *)p didMatchFunctionKeyword:(PKAssembly *)a {
[a push:[NSNull null]]; // set a flag
}
// matched when a function ends
- (void)parser:(PKParser *)p didMatchFunctionCloseCurly:(PKAssembly *)a {
NSArray *discarded = [a objectsAbove:[NSNull null]];
id obj = [a pop]; // clear the flag
NSAssert(obj == [NSNull null], @"null should be on the top of the stack");
}
// matched when a var is declared
- (void)parser:(PKParser *)p didMatchVarDecl:(PKAssembly *)a {
id obj = [a pop];
if (obj == [NSNull null]) { // check for flag
[a push:obj]; // we're in a function. put the flag back and bail.
} else {
PKToken *fence = [PKToken tokenWithTokenType:PKTokenTypeWord stringValue:@"var" floatValue:0.0];
NSArray *toks = [a objectsAbove:fence]; // get all the tokens for the var decl
// now do whatever you want with the var decl tokens here.
}
}