我想通过 javascript 解析并找到所有变量声明、属性和对特定库中函数的调用。
最好的方法是什么:正则表达式,词法分析器,使用已经完成的事情(它存在吗?)....?
实际上我想要的是确保对象名称空间和方法不会被修改,并且通过静态分析来实现。
我想通过 javascript 解析并找到所有变量声明、属性和对特定库中函数的调用。
最好的方法是什么:正则表达式,词法分析器,使用已经完成的事情(它存在吗?)....?
实际上我想要的是确保对象名称空间和方法不会被修改,并且通过静态分析来实现。
您不能使用正则表达式来做到这一点,而且您可能也不想编写自己的ecma-standard 262实现(这完全是矫枉过正)。
至于我,我挖掘谷歌的 V8 javascript 引擎,更准确地说是 PyV8。我建议你可以使用它。
如果你有问题,那是我用来安装的代码(pip 安装对我的 x64 系统有错误,所以我使用了源代码):
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()
(在浏览器中,您应该称您为全局对象 - Window)
此代码将输出:
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 以后的版本有一个新的 AST API。这些类在 org.mozilla.javascript.ast 中可用
如果您想在 Javascript 中执行此操作,请参阅此讨论JavaScript parser in JavaScript
希望能帮助到你。