一起打造编译器:Tiny 语言编译器的逐步构建指南

397 阅读2分钟

跟我一起写编译器吧。

想学习编译器的你肯定和我有一样的烦恼,想自己动手,太难。想学习他人的项目,但是项目太大了,根本无从下手。

今天我带着这个痛点,决定和大家一起定义一个简单的语言,并实现它的编译器。

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;
}

注意事项

  1. identifier, type 是大小写敏感的
  2. 数字是十进制数字
  3. 注释只支持单行注释
  4. integer 是 32 为数字, float是32为float数字
  5. 不支持使用括号调整优先级
  6. 主函数不支持返回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来行,所以就不写在这里了,但是大家可以在项目仓库中找到。

计划

  1. 定义完整的grammar
  2. 实现lexer
  3. 实现parser
  4. 实现语义分析
  5. 生成可执行代码

结尾

如果你正在学习编译器,希望这个项目对你有帮助。欢迎关注我的公众号,我会在这里持续更新,直到我们可以使用这个语言计算简单的数学算术运算。

项目地址github.com/ruibinzhang…