这个系列来自LLVM的Kaleidoscope教程,增加了我对代码的注释以及一些理解,修改了部分代码。
现在开始我们要使用LLVM实现一个编译器,完成对如下代码的编译运行
# 斐波那契数列函数定义
def fib(x)
if x < 3 then
1
else
fib(x - 1) + fib(x - 2)
fib(40)
# 函数声明
extern sin(arg)
extern cos(arg)
extern atan2(arg1 arg2)
# 声明后的函数可调用
atan2(sin(.4), cos(42))
这个语言称为Kaleidoscope, 从代码可以看出,Kaleidoscope支持函数、条件分支、数值计算等语言特性。为了方便,Kaleidoscope唯一支持的数据类型为float64, 所以示例中的所有数值都是float64.
编译的第一个步骤称为Lex, 词法分析,其功能是将文本输入转为多个tokens, 比如对于如下代码
atan2(sin(.4), cos(42))
就应该转为
tokens = ["atan2", "(", "sin", "(", .4, ")", ",", "cos", "(", 42, ")", ")"]
接下来我们使用C++来写这个Lexer, 由于这是教程代码,