使用TypeScript完成一个monkey语言解释器
原版书籍为用Go语言自制解释器
根据b站up主Snow-原青阳的js版学习更改而成
前言
缘起
一直觉得编译器非常神奇,虽然本科期间在学校里学过编译原理的课程,但是感觉我实属是面向考试学习。并且由于当时的课程要求不高,并没有让我们从零手搓一个编译器,我感觉我只是学了点做题技巧,而没能窥见编译器的全貌。
某天很幸运在刷视频的时候看到有个 up 做了个用 js 实现解释器的视频,感觉太对了,这正是我想要的,用我最熟的语言实现一个解释器,这简直太酷了
于是接下来我决定追完这系列视频,完成这个项目,顺便记录一下我的学习过程
目标
用 js TS 自制一个 monkey 语言解释器,不使用任何外部库。
这是个简单的脚本语言,包含大部分编程语言的基础内容,实现它已经够了解解释器原理了
教程来自于b 站 up 主 Snow-原青阳的视频
他使用 js 完成,并且推荐有能力的改用 ts 完成,我觉得完全可以,就换 ts 完成
(联想到 ts 团队正在把 ts 的编译器无缝迁移到 go 语言上,我现在居然在反向做)
梳理
monkey 语言
一门作者为这本书的学习自创的简单语言,麻雀虽小五脏俱全,有以下特性
- 类C语法
- 变量绑定
- 整型和布尔型
- 算术表达式
- 内置函数
- 头等函数和高阶函数
- 闭包
- 字符串数据结构
- 数组数据结构
- 哈希数据结构
最终目标就是实现这个语言的解释器
脉络
编译原理:源代码文本 –> 词法分析 –> 语法分析 –> 抽象语法树 –> 求值 –> 结果
最终为这门语言实现的是一个树遍历解释器,所以没有那么复杂
初始化项目起步
由于用的ts实现,所以需要node环境。先npm init -y
初始化一个node项目,自己简单配一下
之后安装 typescript 和 tsx,用来编译和运行 ts 代码
配置 tsconfig.json(按自己喜欢风格来
之后就可以直接用 npx tsx xxx.ts 运行 ts 文件了
为了省事直接在scripts里加上npx tsx test/lexer.test.ts
,直接npm run test就能跑单元测试
除此之外不需要任何其他依赖,这个项目就是希望尽量少用依赖,完整体验整个过程