1

いくつかのjavascriptコードを分析するためにParseKitを使用したいと思います。javascript文法を使用してフレームワークをセットアップしましたが、コードを分析するためにどのルートを取るべきかについて頭を悩ませることはできません。つまり、最終的には、たとえば、グローバルに宣言されたすべてのvar(つまり、関数の外部で定義されたvar)の配列を取得したいと思います。しかし、どうすればその結果を得ることができるのか、本当にわかりません!私はここでスタックオーバーフローに関する多くの質問を読んでいて、おそらくアセンブラのスタックとターゲットを使用する必要があることがわかりますが、関数のブロックの終わりに達すると関数のコールバックが呼び出されるということです。すべてのvar定義は以前にコールバックされます。関数内のvarでコールバックを受け取ったときに、その内部を知るにはどうすればよいですか?

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

ここでは、たとえば、uではなくiを見つけたいと思います。しかし、コールバックは

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

ジョナス

4

1 に答える 1

2

ここでParseKitの開発者。

まず、この回答を別の、やや関連性のあるParseKitの質問にチェックアウトします。そこにはたくさんの関連情報があります(そしてそこにリンクされている他の回答にもあります)。

次に、特定の例では、afunctionが開始するたびにフラグを設定し、終了するときにフラグをクリアすることが重要です。したがって、vardeclが一致するときはいつでも、フラグをチェックするだけです。フラグが設定されている場合は、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.
    }
}
于 2012-09-18T17:02:39.793 に答える