自己动手实现 Lua
准备
- 准备开发环境
- IDE vscode 安装 c/c++ 插件,go 相关开发的插件
- 了解 Lua 源码的目录结构,相关文件存在的意义
- 改变自己的默认看法,学习一门语言不是为了学习新的语法糖,而是学习它的设计思想。每种语言发展至今都有其存在的意义,如果没有什么特色,学一门语言和多门语言有什么区别呢?
Lua 虚拟机和 Lua API
二进制 chunk
指令集
Lua API
Lua 运算符
虚拟机雏形
表
函数调用
Go 函数调用
闭包和 Upvalue
元编程
迭代器
Lua 语法和编译器
graph LR A[Source] -- Lexer --> B[Tokens] B[Tokens] -- Parser --> C[AST] C[AST] -- Codegen --> D[ByteCodes]
词法分析
词法分析器的作用是根据编程语言的词法规则,把源代码(字符流)分解为 token 流。 token 按其作用可以分为不同的类型,比较常见的类型: - 空白字符 - \r、\n、\t、\v、\f、\s - 注释 - 短注释、长注释 - 关键字 - and、break、do、else、if、elseif、end、false、for、fuction、goto、in、nil、local、not、or、repeat、return、then、true、until、while - 标识符 - Identifier 变量命名 - 字面量 - 数字字面变量,整数、浮点 - 字符串字面量 - 运算符 - +、-、*、/、^、~、%、&、|、>>、<<等 - 分隔符 - (、)、[、]、{、}、,、:、;等
抽象语法树 AST
语法规则定义了怎样的组合可以构成合法的程序。词法分析阶段
根据词法规则
将字符序列分解为 token 序列,语法分析阶段
根据语法规则
将 token 序列解析为抽象语法树(AST)。
例如:a * (b + c)
graph TB A((*)) --> B((a)) A((*)) --> C((+)) C((+)) --> D((b)) C((+)) --> E((c))