【问题标题】:Parse JavaScript to instrument code解析 JavaScript 以检测代码
【发布时间】:2010-10-25 00:28:12
【问题描述】:

我需要将 JavaScript 文件拆分为单个指令。例如

a = 2;
foo()
function bar() {
    b = 5;
    print("spam");
}

必须分成三个指令。 (赋值、函数调用和函数定义)。

基本上我需要检测代码,在这些指令之间注入代码以执行检查。用“;”分割显然不会起作用,因为您也可以用换行符结束指令,也许我不想在函数和类定义中检测代码(我还不知道)。我用flex/Bison 上了一门关于语法的课程,但在这种情况下,该规则的语义操作将是“打印解析树中的所有后代并将我的代码放在最后”,这是无法完成的我认为基本的野牛。我该怎么做呢?我还需要拆分代码,因为我需要使用 python-spidermonkey 与 Python 交互。 或者......是否已经有一个图书馆可以让我免于重新发明轮子?它不必在 Python 中。

【问题讨论】:

  • 好吧,我会试试 jQuery AOP
  • 我没有看到这个建议跟进。我已经检测了大型 javascript 库。我希望你试一试;它易于使用。

标签: javascript python parsing spidermonkey


【解决方案1】:

为什么不使用 JavaScript 解析器?有很多,包括一个用于 ANTLR 的 Python API 和一个围绕 SpiderMonkey 的 Python 包装器。

【讨论】:

  • 我研究了 ANTLR,但似乎真的很复杂 :-( 我已经计划使用 python-spidermonkey,但我需要先正确拆分代码:execute("function foo () {")给出一个错误。我只是认为会有另一种方法......如果我将 python 对象输入到 js 上下文中,我可以将回调放入 python 代码中。但它看起来相当复杂,我对这种语言很陌生-接口(我也是 js 新手)
  • 像 ANTLR 这样的工具“非常复杂”,因为它们正在处理非常复杂的问题。很多人试图通过某种字符串破解来操纵代码;它几乎总是以糟糕的方式结束,因为字符串黑客无法可靠地处理复杂情况。
【解决方案2】:

JavaScript 难以解析;你需要一个完整的 JavaScript 解析器。 DMS Software Reengineering Toolkit 可以解析完整的 JavaScript 并构建相应的 AST。 然后可以使用 AST 运算符遍历树以“拆分它”。然而,更简单的是应用源到源的转换来寻找一种表面语法 (JavaScript) 模式,然后用另一种模式替换它。您可以使用此类转换将插桩插入代码中,而不是拆分代码以保留进行插入的操作。转换完成后,DMS 可以重新生成有效的 JavaScript 代码(如果不受影响,则与原始 cmets 一起完成)。

【讨论】:

    【解决方案3】:

    为什么不使用现有的 JavaScript 解释器,例如 Rhino (Java) 或 python-spidermonkey(不确定这个解释器是否还活着)?它将解析 JS,然后您可以检查生成的解析树。我不确定重新创建原始代码有多容易,但这主要取决于检测代码的可读性。如果没有人看过它,只需生成一个非常紧凑的表单即可。

    pyjamas 也可能感兴趣;这是一个 Python 到 JavaScript 的转译器。

    [编辑] 虽然乍一看这并不能解决您的问题,但您可以将其用于不同的方法:不要检测 JavaScript,而是用 Python 编写代码(可以轻松检测;所有工具都已经那里),然后将结果转换为 JavaScript。

    最后,如果您想在 Python 中解决问题但找不到解析器:使用 Java 引擎将 cmets 添加到代码中,然后您可以在 Python 中搜索以检测代码。

    【讨论】:

    • 你是第二个说我可以用 python-spidermonkey 解析代码的人......我弄错了吗?它似乎没有任何解析功能。代码显然必须在某个地方解析,但它是在 spidermonkey 引擎内部完成的,python 接口不提供挂钩。我只看到为 python 程序员公开的“execute”、“add_global”、“rem_global”和“gc”。我错过了什么吗?
    • 不幸的是,它是分析页面重定向项目的一部分。我不会编写 javascript 代码 :-) 恶意网站会竭尽全力混淆他们的代码。
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      忘记我的解析器。 https://bitbucket.org/mvantellingen/pyjsparser 是伟大而完整的解析器。我在这里修复了一些错误:https://bitbucket.org/nullie/pyjsparser

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-22
        • 2014-09-25
        • 2010-10-17
        相关资源
        最近更新 更多