JavaScript解析器在JavaScript中的实现

74

我需要在JavaScript源代码中添加一些轻量级的语法糖,并使用基于JavaScript的构建系统进行处理。是否有任何用JavaScript编写的开源JavaScript解析器?并且当在V8或类似的高性能JavaScript实现上运行时,它们是否足够快?

感谢你能提供的任何指导!


3
我需要在 JavaScript 源代码中添加一些轻量级语法糖。 你需要吗?比如什么? - Peter Bailey
你需要它来进行代码展示或编辑吗? - Luca Filosofi
1
Objective-J可以实现这个功能。你可能想要查看它的开源代码。但是据我所知,它使用完全不同于Objective-C的语法,并在运行时解释为Javascript。 - Anurag
3
JSLint包含一个用JavaScript编写的JavaScript解析器,详见http://www.jslint.com/fulljslint.js。解析器从第2049行开始。JSLint还能处理html,因此您需要略过那些部分。 - Crescent Fresh
新月法国:请将您的评论重新发布为答案,我会给您点赞。谢谢! - emk
JSLint的源代码可在GitHub上获得:https://github.com/douglascrockford/JSLint => https://github.com/douglascrockford/JSLint/blob/master/jslint.js - dmitris
9个回答

33

UglifyJS是一款用JavaScript编写的JS压缩器/美化器,其中包含一个完整的JavaScript解析器,提供了简单易用的API接口。它经过严格测试并在一些大型项目(如WebKit)中得到广泛应用。


3
UglifyJS非常好,感谢你们的付出。还要感谢HTMLArea,在7或8年前我开发所见即所得编辑器时给了我很大的参考。不过我建议在链接到UglifyJS时提及您的兴趣。 - Tim Down
3
我想指出的是,这个解析器已经就绪,并且似乎运行得非常完美。它在一个单独的文件中,因此无需浏览 jslint.js 文件以删除您不需要的部分。+1 - tex

25
"The fastest Javascript parser in Javascript was esprima.
It also gives you:
Sensible format for the abstract syntax tree (AST), compatible with Mozilla Parser API."

24

Crescent Fresh在评论中回答了这个问题:

JSLint包含一个用JavaScript编写的JavaScript解析器。请参见Douglas Crockford的JSLint,大约在2712行左右开始解析器。JSLint也被编写为处理HTML,因此您需要忽略那些部分。


Crescent Fresh,如果您想将您的评论重新发布为答案,我会接受并点赞您。 - emk
4
最近的源代码,上面的链接已经失效:https://github.com/douglascrockford/JSLint - sibidiba
回答更新(https://github.com/douglascrockford/JSLint/blob/master/jslint.js) - Ivan Castellanos

13

Acorn是一个用JavaScript编写的非常快速的JavaScript解析器。它甚至比Esprima现在更快了。我在Chrome中从Esprima速度比较页面得到的结果:

Source            Esprima    UglifyJS2    Traceur    Acorn
Underscore 1.4.1  15.1       23.8         14.2       7.6
Backbone 1.0.0    17.1       30.2         16.7       7.9
jQuery 1.9.1      241.1      247.2        125.4      81.4
Total             273.3 ms   301.2 ms     156.3 ms   96.9 ms

它与Mozilla的解析器API兼容,因此您可以使用escodegen从解析树生成JavaScript。


9

它本身并不是JavaScript解析器,但有一个名为Jison(类似于Bison)的项目用于生成解析器,它是用JS编写的。


1
好的,问题是关于JavaScript解析器的...? - user663031

7
我见过的唯一一个用JavaScript实现的元循环解释器Narcissus引擎。
它也是由Brendan Eich开发的,他们使用了许多特定于SpiderMonkey的非标准扩展,我认为它在V8上不起作用。

有趣!我想在那里肯定有一个解析器藏着。 :-) 不幸的是,我正在寻找在V8下运行的东西。但是感谢您提供非常有趣的链接! - emk

6
微软使用TypeScript编写了TypeScript编译器。由于TypeScript是JavaScript的严格超集,并且TypeScript可以编译为JavaScript,因此所得到的编译器实际上是一个用JavaScript编写的JavaScript编译器。

当然,这取决于您对“编译器”的定义。但如果接受语言A的一个超集的编译器不是语言A编译器,那么GCC、Clang和几乎所有其他编译器都不在此列。


3

0

链接自最新编辑以来有效。 - Shawn

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