跟我一起写编译器吧。
想学习编译器的你肯定和我有一样的烦恼,想自己动手,太难。想学习他人的项目,但是项目太大了,根本无从下手。
今天我带着这个痛点,决定和大家一起定义一个简单的语言,并实现它的编译器。
Tiny
这个语言的名字很简单,就叫做Tiny。它只能实现简单的函数调用和+ - × / 运算。Tiny 是一个单文件程序,所有的代码必须在一个文件中定义。它接受自定义函数,赋值,变量声明,函数调用,且有一个main函数作为唯一入口。
程序实例
// p.tiny
// In this program, it is a regular valid program
func int main(){
print("Hello World!\n");
int a = 1;
int b = 2;
int c;
c = add(a, b);
print(c);
f();
return 0;
}
func int add(int a, int b){
return a + b;
}
func int f(){
print(1);
print("You are in f()\n");
return 0;
}
注意事项
- identifier, type 是大小写敏感的
- 数字是十进制数字
- 注释只支持单行注释
- integer 是 32 为数字, float是32为float数字
- 不支持使用括号调整优先级
- 主函数不支持返回void,只能返回integer
Tiny Token
- keyword: func
- keyword: return
- keyword: print
- special token: ; | ( | ) | { | } | , | =
- identifier: ([a-zA-Z_][a-zA-Z0-9_]*)
- type: int | float
- operator: + | - | * | /
- number: ([1-9][0-9]* | 0)
- float: ([1-9][0-9]*.[0-9]+ | 0.[0-9]+)
- whitespace: \s | \t | \n
- comment: //.*\n
Tiny Grammar
grammar 虽然简单,但是也有100来行,所以就不写在这里了,但是大家可以在项目仓库中找到。
计划
- 定义完整的grammar
- 实现lexer
- 实现parser
- 实现语义分析
- 生成可执行代码
结尾
如果你正在学习编译器,希望这个项目对你有帮助。欢迎关注我的公众号,我会在这里持续更新,直到我们可以使用这个语言计算简单的数学算术运算。