tokuhirom's blog

escodegen + esprima で JS のデバッグをしたら捗りそう

以下のようなコードを実行すると

console.log([
    [1,1,8]
    [2,1,16]
]);

このような結果になる。

[ undefined ]

アレレーってなってたんだけど kazuho さんにきいたところ、

[1,1,8][2,1,16] => ([1,1,8])[(2,1,16)] => ([1,1,8])[16] => undefined

ってことでした。

こんな時、Perl Monger ならとりあえず B::Deparse することによって解決の糸口をさがすんだけど、そういうの EcmaScript でどうすんすかね、ってなことを kazuho さんにきいたところ、esprima っていう es のパーサーがあるよって教えてもらったので、AST はとりだせたんだけど、AST をみても埒があかないので、AST からソースにおとす君がないかなーとさがしたところ const なんとかさんが escodegen ってのを書いていたようなので、この2つを組み合わせて問題を解決することができました。

以下のようなコードをかきます。

var esprima = require('esprima'),
    fs = require('fs'),
    escodegen = require('escodegen');

console.log(escodegen.generate(esprima.parse(fs.readFileSync(process.argv[2]))));

んで、前述のコードをくわせると

console.log([
    [
        1,
        1,
        8
    ][2, 1, 16]
]);

となって、「Ah, そういうことね!」となります。YATTA!

kazuhooku++, Constなんとか++

Created: 2012-08-13 08:31:20 UTC
Updated: 2012-08-13 08:31:20 UTC