ここでParseKitの開発者。
まず、この回答を別の、やや関連性のあるParseKitの質問にチェックアウトします。そこにはたくさんの関連情報があります(そしてそこにリンクされている他の回答にもあります)。
次に、特定の例では、afunction
が開始するたびにフラグを設定し、終了するときにフラグをクリアすることが重要です。したがって、var
declが一致するときはいつでも、フラグをチェックするだけです。フラグが設定されている場合は、vardeclを無視します。フラグが設定されていない場合は、それを保存します。
私が言及したフラグがPKAssembly
、アセンブラコールバック関数の引数であるオブジェクトに格納されていることが非常に重要です。そのフラグをivarまたはグローバルvarとして保存することはできません。それは機能しません(理由の詳細については、以前のリンクされた回答を参照してください)。
フラグを設定し、vardeclsを照合するためのコールバックの例を次に示します。彼らはあなたに私が話していることのアイデアを与えるはずです:
// 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.
}
}