前段时间,我用 javascript 重新编写了一个 16 位的虚拟机,用它实现了一个定制的 CPU 架构和汇编语言,汇编器和调试器。虽然从头编一个语言可以完全实现自己的自定义目标,但过程却及其复杂。为了使自己的编程过程更有效率,我决定使用 Lel(布局表达式语言,Layout Expression Language,LEL)。
本文将深入研究怎样用一个简单的方法来编写一个编程语言解释器,由于所有 Lel 的代码都是开放的,可以在 github 上使用。
解释器的组成
解释器是什么?简单来说,它基本上是一个程序,读取源代码,并对其进行运行,而不必首先将该源代码编译成机器语言。虽然这实现起来容易,但是,在运行该源代码之前,还必须执行 3 个步骤,才能实现简单语言解释器:
1. 标记化 ( Tokenisation ) 技术
标记化你的源代码,并将其转换成许多标记,其中每个标记都表示一种类型(比如数字,变量名称,括号等)和一种特殊值(比如 42," 你好 ",真假等)。
2. 解析(树形化)
解析或树形化(treeification),这会让所有的标记都以列表的形式呈现出来,一目了然,结构清晰,就像树形一样。为什么我非要进行解析或树化处理呢?因为在进行编程时,往往是函数的层次嵌套结构,树形数据结构可以表示数据表素之间一对多的关系。
3. 评估
LEL
Lel 或 "Lisp-esque 语言 " 是基于 lisp 的语法,它是一具有 50