7

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

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

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

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

4

5 回答 5

4

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

于 2009-05-09T16:28:39.230 回答
2

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

于 2009-08-27T04:32:51.010 回答
0

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

睡衣也可能很有趣;这是一个 Python 到 JavaScript 的转译器。

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

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

于 2009-05-09T16:29:54.113 回答
0

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

于 2011-09-18T11:44:45.373 回答
0

为什么不试试 javascript 美化器?

例如http://jsbeautifier.org/

或查看适用于 Windows 和 Linux 的命令行 JavaScript 代码美化器

于 2009-05-09T18:28:34.910 回答