0

我想通过 javascript 解析并找到所有变量声明、属性和对特定库中函数的调用。

最好的方法是什么:正则表达式,词法分析器,使用已经完成的事情(它存在吗?)....?

实际上我想要的是确保对象名称空间和方法不会被修改,并且通过静态分析来实现。

4

2 回答 2

1

您不能使用正则表达式来做到这一点,而且您可能也不想编写自己的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] }
于 2012-08-09T08:11:02.583 回答
0

您可以使用Mozilla 的Rhino。它是用 Java 编写的 Javascript 实现。1.7R3 以后的版本有一个新的 AST API。这些类在 org.mozilla.javascript.ast 中可用

如果您想在 Javascript 中执行此操作,请参阅此讨论JavaScript parser in JavaScript

希望能帮助到你。

于 2012-08-09T07:48:23.260 回答