【问题标题】:Generating JavaScript from a JSLINT parse tree从 JSLINT 解析树生成 JavaScript
【发布时间】:2012-02-26 17:27:05
【问题描述】:

使用 Crockford 的 JSLINT,在调用 JSLINT() 解析一些 JavaScript 源代码后,它通过 JSLINT.tree 提供对解析树的访问

能够分析树,根据分析对其进行结构更改,然后从修改后的树生成新的 JavaScript,这将非常强大。

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

(这是否可能,即 JSLINT 是否从解析中保留了足够完整的信息以往返所有重要的信息?)

【问题讨论】:

  • 那应该有什么好处?你能提供一个可能的用例吗?
  • 可能性是无限的。想想在不修改语法的情况下可以增强语义的方法(这很好,因为它不会破坏现有的编辑工具)。这是一个随机的例子:假设你说如果一个函数的参数以_ 后缀命名,那么它们不能是nullundefined,并且你希望在运行时自动检查这一点。搜索解析树、查找声明此类参数的函数并在这些函数的开头插入运行时检查将是微不足道的。
  • 好的,但是你为什么要首先构建整个语法树呢?我没有研究过像 UglifyJS 或 YUICompressor 这样的压缩器的来源,但我认为它们会提供一个更明智的基础。
  • 1.所以你可以对整棵树进行分析和修改。为什么不构建整个语法树? 2. 快速浏览 YUICompressor 的源码可以看出它使用了 Rhino 的 Parser 类,它构建了一个完整的语法树。不知道YUICompressor 在多大程度上使用了这些信息,但它可以。

标签: javascript parsing jslint roundtrip


【解决方案1】:

我不知道 JSLint 是否可以做到(查看一些论坛帖子,看起来维护树并不是他们的目标,而是进行 linting 过程的副产品)。

uglifyjs 项目可能有助于从 javascript 生成 AST 并将 AST 重新转换为代码。请参阅this AST 到 javascript 的方法。

【讨论】:

  • 这看起来绝对完美。
【解决方案2】:

不是开源的,但完全符合 OP 的要求:我们的 JavaScript Front End

此前端基于我们的 DMS Software Reengineering Toolkit,这是一种通用的可定制编译器技术,可用于构建任意代码分析器和转换器。 DMS 有许多可用于多种语言(COBOL、Java、C++、...)的前端

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

它可以提供所有这些服务,因为它的工程成本已在许多语言和应用程序中分摊。

我们这样做是因为正如丹尼尔所说,“可能性是无限的”。他给出了一个检测代码以监视运行时故障的示例;这种仪器是一个非常有用的想法和we build test coverage tools based on exactly this thought.

【讨论】:

  • +1,因为它看起来像一个很棒的工具包,可能比我正在寻找的强大得多,而且对于我的修补,我显然会倾向于免费库。
  • 我们发现人们从小创意开始,然后随着他们获得信心,他们会构建越来越大的项目。有许多脚本语言最初是为“仅几个命令”而设计的,人们在这些命令中构建了巨大的系统。随着更改代码的能力变得越来越熟悉,人们会做的越来越多,并且需要 DMS 带来的那种支持。在某种程度上,“免费库”解决方案对您有用,给您更多的力量!但我敢打赌,您在充分了解自己的能力后会重新考虑这个职位:-}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多