JavaScriptを解析して、特定のライブラリからのすべての変数宣言、属性、および関数の呼び出しを見つけたいと思います。
最良のアプローチは何でしょうか:正規表現、レクサー、それを行うためにすでに行われた何かを使用します(それは存在しますか?)...?
私が実際に望んでいるのは、オブジェクトの名前空間とメソッドが変更されていないことを保証することです。これは静的分析によって行われます。
JavaScriptを解析して、特定のライブラリからのすべての変数宣言、属性、および関数の呼び出しを見つけたいと思います。
最良のアプローチは何でしょうか:正規表現、レクサー、それを行うためにすでに行われた何かを使用します(それは存在しますか?)...?
私が実際に望んでいるのは、オブジェクトの名前空間とメソッドが変更されていないことを保証することです。これは静的分析によって行われます。
正規表現を使用してそれを行うことはできません。また、 ecma-standard 262の独自の実装を作成したくない場合もあります(これは完全にやり過ぎです)。
私に関しては、私はグーグルのV8 javascriptエンジン、より正確にはPyV8を掘ります。私はあなたがそれを使うことができることを提案します。
問題が発生した場合は、インストールに使用したコードがあります(x64システムでpipのインストールでエラーが発生したため、ソースを使用しました)。
apt-get install subversion scons libboost-python-dev
svn checkout http://v8.googlecode.com/svn/trunk/ v8
svn checkout http://pyv8.googlecode.com/svn/trunk/ pyv8
cd v8
export PyV8=`pwd`
cd ../pyv8
sudo python setup.py build
sudo python setup.py install
私が覚えているように、これらのコマンドは私にとってエラーを引き起こしませんでした。(コピーして貼り付けましたが、機能しました)
質問自体への回答:
より複雑なhello wolrdの例では、グローバルオブジェクトのいくつかの変数をリストします。
import PyV8
class Global(PyV8.JSClass): # define a compatible javascript class
def hello(self): # define a method
print "Hello World"
def alert(self, message): # my own alert function
print type(message), ' ', message
@property
def GObject(self): return self
def __setattr__(self, key, value):
super(Global, self).__setattr__(key, value)
print key, '=', value
G = Global()
ctxt = PyV8.JSContext(G)
ctxt.enter()
ctxt.eval("var a=hello; GObject.b=1.0; a();")
list_all_cmd = '''for (myKey in GObject){
alert(GObject[myKey]);
}'''
ctxt.eval(list_all_cmd)
ctxt.leave()
(ブラウザでは、グローバルオブジェクト-ウィンドウと呼ぶ必要があります)
このコードは次のように出力します。
b = 1
Hello World
<class '__main__.Global'> <__main__.Global object at 0x7f202c9159d0>
<class '_PyV8.JSFunction'> function () { [native code] }
<type 'int'> 1
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
<class '_PyV8.JSFunction'> function () { [native code] }
MozillaのRhinoを使用できます。これは、Javaで記述されたJavascriptの実装です。1.7R3リリース以降には、新しいASTAPIがあります。クラスはorg.mozilla.javascript.astで利用できます
これをJavascriptで実行する場合は、 JavaScriptのJavaScriptパーサーに関するこのディスカッションを参照してください。
それが役に立てば幸い。