因为最近跟 Babel 打交道比较多,虽然通过自定义 Babel 插件以及魔改 babel-parser 等方式能够达到随心所欲地修改 Javascript 语法树的目的,但是对于解释器的实现本身缺少系统性的认知。大学的时候学习过编译原理这门课,也用 C++ 实现过简易版的 mips 汇编器。最近打算再填新坑,重读 《编译原理 第二版》,构建完整性的知识体系。

词法分析器很难发现源代码中的错误,需要在语法分析阶段去处理。

当所有词法单元的模式都无法匹配剩余输入匹配的时候,就不能继续处理输入了,最简单恢复策略就是”恐慌模式“,我们从剩余的输入中不断删除字符,直到能够在剩余输入的开头发现一个正确的词法单元为之。

首先构造状态转换图,例如比较运算符 relop 的状态转换图如下:

如何区分标识符和保留字:

先将保留字存入符号表,找到一个标识符时,如果它未出现在符号表中,就调用 installID 将该标识符放入符号表,它的词法单元是 ID,否则调用 getToken 查看符号表,要么是之前存入的 ID,要么是保留字。

为每个关键字建立单独的状态转换图,但是用这种方法需要确定词法单元之间的优先级。git