1

我想使用 ParseKit 来分析一些 javascript 代码。我使用 javascript 语法设置了框架,但我无法真正了解分析代码的路径。问题是,我最终希望得到一个包含所有全局声明的 var 的数组(所以 var 是在函数外部定义的)。但我真的不明白我怎么能得到这个结果!我在这里阅读了很多关于堆栈溢出的问题,并且可以看到我可能应该使用汇编程序的堆栈和目标,但问题是函数回调在到达函数块结束时被调用,所以所有 var 定义都在之前被回调过。我怎么知道当我在函数内部的 var 上获得回调时,它在内部?

var i = 0;
function test(){
   var u = 0;
}

例如,我想在这里找到 i,而不是 u。但是回调是

#1  Found var i
#2  Found var u
#3  Found func test

乔纳斯

4

1 回答 1

2

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.
    }
}
于 2012-09-18T17:02:39.793 回答