JavaScript解析器是如何工作的?

4
我正在尝试理解JS的解析过程。但我的搜索结果要么是一些模糊地记录了“解析器/生成器”(我甚至不知道这意味着什么)的项目,要么是使用神奇的“解析”方法使用JS引擎解析JS的方法。我不想浏览一堆代码并尝试了解(虽然我可以,但这需要太长时间)。
我想知道任意JS代码字符串是如何转化为对象、函数、变量等内容的。我还想知道将该字符串转化为内容、存储、引用和执行的过程和技术。
有没有相关文档或参考资料?

2
JavaScript 被解析的方式和其它语言一样;参见 http://en.wikipedia.org/wiki/Parsing。文件会被与定义好的文法进行匹配,并拆分成一个个标记(token)。之后,它会被解释执行。参见 http://en.wikipedia.org/wiki/Interpreter_(computing)。 - Matt
3个回答

4
解析器可能以各种方式工作,但基本上它们首先经过令牌化阶段,然后将结果交给编译器,如果可以的话,编译器会将其转换为程序。例如,给定以下内容:
function foo(a) {
  alert(a);
}

解析器将删除任何前导空格,直到第一个字符,即字母"f"。它会收集字符,直到遇到不属于它的空格,这表示标记的结尾。然后它从"foo"的"f"重新开始,直到它到达"(",所以现在它有了标记"function"和"foo"。它知道"("是一个独立的标记,所以这是3个标记。然后它获取"a"后面跟着")",这是另外两个标记,共计5个标记,以此类推。
唯一需要空格的地方是在标记之间存在歧义的情况下(例如,在"function"和"foo"之间必须有空格或另一个标记)。
一旦标记化完成,它进入编译器,编译器将"function"视为标识符,并将其解释为关键字"function"。然后获取"foo",这是语言语法告诉它的函数名称的标识符。然后"("表示开放分组运算符,因此开始了一个正式参数列表,以此类推。
编译器可以一次处理一个标记,也可以抓取它们的块,或者做各种奇怪的事情以使它们运行更快。

您还可以阅读 C/C++解析器是如何工作的?,这将提供更多线索。或者直接使用谷歌搜索。


1

虽然它并不完全对应于真正的JS引擎的工作方式,但您可能会有兴趣阅读道格拉斯·克罗克福德(Douglas Crockford)关于自顶向下运算符优先级的文章,其中包括用解析它的JavaScript子集编写的小型工作词法分析器和解析器的代码。这是非常易读且简洁的代码(附有良好的解释),至少可以给您提供一个真实实现的轮廓。

比Crockford的“自顶向下运算符优先级”更常见的技术是递归下降解析,它在Narcissus中使用,这是JS的完整实现。


0

也许Esprima可以帮助你理解JavaScript解析语法的方式,它是在线的。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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