#llvm #compiler #front-end #toy #language #path #yot

bin+lib yotc

为玩具语言 yot 提供的 LLVM 前端

7 个版本

0.3.0 2020 年 6 月 21 日
0.2.3 2020 年 6 月 3 日
0.2.2 2020 年 5 月 30 日
0.1.1 2020 年 5 月 23 日

#21 in #toy

MIT 许可证

54KB
1K SLoC

Yotc

为玩具语言 yot 提供的 LLVM 前端。

基于 LLVM Kaleidoscope

运行

  • 安装 LLVM 9.0
  • 使用 cargo install yotc 安装 yotc
  • 对于自动链接(即默认输出格式 "可执行文件"),PATH 中需要包含 gcc
  • 用法: yotc (文件路径)
  • 运行 yotc --help 查看更多选项

Yot 语法

  • 注意:每个变量都是 32 位 int,并且函数也必须返回 int。比较运算符返回 1 或 0
  • 函数
    • 常规语法
      @sum[a, b] {
          -> a + b // -> is the return keyword
      }
      
    • 仅返回语句的简写表示
      @sum[a, b] -> a + b;
      
    • 外部函数
      @!print[_, _];
      
    • 调用函数
      sum(a, b);
      
  • 变量
    • 带值的声明
      @a = 5;
      
    • 不带值的声明(将被分配垃圾值)
      @a;
      
    • 引用变量
      @b = a + 5;
      
  • 操作
    • 可用操作 =+-*/==!=<><=>=
      @a = (-b + 5) - 10 / -(5 - -2);
      
  • 注释
    • 注释以 // 开头,直到行尾的标记都被忽略
  • 程序
    • 程序仅由顶层函数组成(尚无全局变量)
    • main 函数入口点
  • 示例
    • 参见 examples/
    • 首先使用 yotc equals_ten.yot -f object-file 生成 equals_ten.yot 的目标文件
    • 使用 g++ io.cc equals_ten.o 编译和链接 io.cpp 生成可执行文件

待办事项

  • if、for、while 语句
  • LLVM IR优化
  • 支持打印字符串字面量
  • 更好的编译器错误
    • 当前的错误要么含糊不清,要么完全错误,且没有任何行号信息
    • 大多数错误都被LLVM捕获,这意味着会有更多丑陋且含糊的错误消息
  • 更多数据类型(浮点数、布尔值、字符)
  • 测试

依赖项

~3–12MB
~119K SLoC