我试图了解JS是如何被解析的。但我的搜索要么返回一些非常模糊的文档“解析器/生成器”(我甚至不知道这意味着什么),或者如何使用神奇的“解析”方法使用JS引擎解析JS。我不想扫描一堆代码并尝试一辈子去理解(尽管我可以,这需要太长时间)。
我想知道如何将任意串JS代码实际转换为对象,函数,变量等。我还想知道将该字符串转换为东西,存储,引用,执行的过程和技术。 / p>
是否有任何文档/参考资料?
答案 0 :(得分:3)
解析器可能以各种方式工作,但从根本上说它们首先经历一个标记化阶段,然后将结果提供给编译器,如果可以的话将其转换为程序。例如,给定:
function foo(a) {
alert(a);
}
解析器将删除任何前导空格到第一个字符,即字母“f”。它将收集字符,直到它获得不属于的内容,空白,表示令牌的结束。它再次以“f”的“f”开始,直到它到达“(”,因此它现在有令牌“function”和“foo”。它知道“(”它本身就是一个标记,所以它是3然后得到“a”后跟“)”,这是另外两个令牌5,依此类推。
对空格的唯一需要是令牌不明确的令牌之间(例如,“function”和“foo”之间必须有空格或另一个标记)。
一旦标记化完成,它将转到编译器,编译器将“function”视为标识符,并将其解释为关键字“function”。然后它得到“foo”,语言语法告诉它的标识符是函数名称。然后“(”表示开始分组操作符,因此表示正式参数列表的开始,依此类推。
编译器可以一次处理一个令牌,或者可以抓住它们,或者做各种奇怪的事情以使它们运行得更快。
您还可以阅读How do C/C++ parsers work?,其中提供了更多线索。或者只使用Google。
答案 1 :(得分:1)
虽然它与真正的JS引擎的工作方式并不完全对应,但您可能有兴趣阅读Douglas Crockford关于Top Down Operator Precedence的文章,其中包括用Javascript子集编写的小型工作词法分析器和解析器的代码解析。它是非常易读和简洁的代码(具有良好的附带解释),至少可以为您提供真实实现如何工作的概述。
比Crockford的“Top Down Operator Precedence”更常见的技术是recursive descent解析,它在Narcissus中使用,是JS中JS的完整实现。