/x-lang

基于 LLVM 与 rust 实现一门名叫 x 的玩具语言,仅用于学习

Primary LanguageRustMIT LicenseMIT

x-lang

Rust CI GitHub release (latest by date)

logo

基于 LLVM 与 rust 实现一门名叫 x 的玩具语言,仅用于学习

基本语法

fn add(a: num, b: num) -> num {
    return a + b; // 返回语句
}

// main 函数,程序的入口
fn main() {
    var n: num = 3;
    var str = "result: "
    var result = add(n, 4.2);

    // 调用系统内置的打印方法
    print(str, result);
}

更多示例请参考 fixtures 目录里的例子

IDE 插件

VSCode 插件:vscode-x-lang

尝试一下

  • 下载编译好的二进制文件 (下载链接)
  • 执行命令 x-lang example.x 编译并运行 x 语言(目前就实现了通过 JIT 方式运行),example.x 为待编译文件路径。 可以通过 x-lang example.x --debug 运行输出编译后端 LLVM-IR 码

提示:MacOS 系统可能会提示 "无法打卡xxx",先鼠标右键打开,弹出提示后选择 "打开",之后就可以正常打开了

语法注意事项

  • 语句需写在函数体里面,main 函数是程序的入口函数,程序从这里开始
  • x 是一门强类型语言,支持数字(num)、字符串(str)、布尔类型(bool)
  • 通过 var 关键字声明变量,变量声明的类型可以省略,系统会自动推断类型。变量必须先定义后使用
  • 通过 fn 关键字声明函数,函数必须在最外层作用域定义,函数的参数类型及返回类型必须明确标识,不可省略(返回 void 类型可以省略)。函数会进行预编译,所以函数定义的顺序无关紧要。
  • 函数调用时必须与函数定义的参数匹配,否则会调用失败
  • 块级作用域隔离
  • 代码语句后需以分号结尾,或者通过换行以表明代码语句结束

目前支持的能力

  • 调用系统内置方法 print(a, b, c) 控制台打印信息,支持多个任意类型参数

参数教程

一些资源

已知问题

  • 函数返回类型与定义不匹配时未校验
  • 嵌套循环,里面的循环break存在问题,原因是内层的 condition 的变量被重复定义了,导致 break 设置的 condition 的值失效了
  • 位运算未实现
  • 读取函数返回的字符串类型,有问题
  • 完善读取数字 token