从JSLINT解析树生成JavaScript

6

在使用Crockford的JSLINT解析JavaScript源代码后,通过调用JSLINT()提供了访问解析树的途径,即通过JSLINT.tree

如果能够分析树、基于分析进行结构性更改,并从修改后的树生成新的JavaScript代码,那将是非常强大的。

是否有一个开源项目是基于JSLINT,提供从解析树转换回JavaScript的功能呢?

(这样做是否可行?也就是说,JSLINT是否保留了足够详尽的解析信息来使所有重要细节都不遗漏?)


那应该有什么用呢?你能提供一个可能的用例吗? - user123444555621
1
可能性是无限的。想想你可以如何增强语义而不修改语法(这很好,因为它不会破坏现有的编辑工具)。这里有一个随机的例子:假设你说如果函数的参数以后缀“_”命名,则它们不能为nullundefined,并且您希望在运行时自动检查此内容。在解析树中查找声明此类参数的函数,并在这些函数的开头插入运行时检查将是微不足道的。 - Daniel Earwicker
好的,但是为什么一开始要构建整个语法树呢?我还没有查看像UglifyJS或YUICompressor这样的压缩器的源代码,但我认为它们会提供更合理的基础。 - user123444555621
  1. 所以您可以对整个树执行分析和修改。为什么不构建整个语法树呢?
  2. 快速查看YUICompressor的源代码显示它使用Rhino的Parser类,该类构建完整的语法树。不知道YUICompressor在多大程度上使用这些信息,但它可能会使用。
- Daniel Earwicker
2个回答

3
我不知道JSLint是否能够做到这一点(从一些论坛帖子来看,维护树不是他们的目标,但这是进行linting过程的副产品)。 uglifyjs项目可能会帮助生成JavaScript的AST,并将AST重新转换为代码。请参见this方法以获得AST到JavaScript的转换。

那看起来绝对完美。 - Daniel Earwicker

1

虽然不是开源的,但正好符合OP的要求:我们的JavaScript前端

这个前端基于我们的DMS软件重构工具包,它是通用可定制编译器技术,适用于构建任意代码分析器和转换器。DMS有许多可用于许多语言(COBOL、Java、C++等)的前端。

特别是,基于DMS的解析器(包括其JavaScript解析器)收集了重新生成源树所需的完整信息,包括标记的列起始和结束信息、数字文字的基数、字符串引号约定的差异等,以便在未应用任何转换时进行忠实打印。DMS还提供许多其他有用的树处理服务,如访问者、符号表构建支持、流分析支持、模式匹配以及源到源的转换。

它能够提供所有这些服务,因为它的工程成本已经分摊到了许多许多语言和应用程序中。

我们这样做是因为正如Daniel所说,“可能性是无限的”。他举了一个例子,即对代码进行仪器化以监视运行时故障;这种仪器化是一个非常有用的想法,我们基于这个想法构建了测试覆盖工具。

+1,因为它看起来是一个很棒的工具包,可能比我需要的功能更强大,而且对于我的小玩意儿,我显然会倾向于免费的库。 - Daniel Earwicker
我们发现的情况是,人们从小想法开始,随着他们获得信心,他们建立了越来越大的项目。有很多脚本语言最初是为“只有几个命令”而设计的,但人们已经构建了巨型系统。随着改变代码的能力变得更加熟悉,人们会做更多的事情,并要求DMS提供这种支持。如果“免费库”解决方案对您有效,那就更好了!但我敢打赌,在您尝试了一番之后,您会重新考虑这个立场 :-} - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接