Compute the x'th fibonacci number.
Plan
- 参考llvm tutorial实现简单的语言前端
Notes
llvm 为了展现自己对语言的语言前端构建能力,提供了一系列的toy语言教程。接下来一些天,我打算跟着它的教程,进行一遍实现。整个教程中实现的语言叫做Kaleidoscope,翻译成中文是万花筒。它长这样:
# Compute the x'th fibonacci number.
def fib(x)
if x < 3 then
1
else
fib(x-1)+fib(x-2)
# This expression will compute the 40th number.
fib(40)
同时,这种语言还支持标准库函数,类似这样:
extern sin(arg);
extern cos(arg);
extern atan2(arg1 arg2);
atan2(sin(.4), cos(42))
那么开始吧。
Lexer,词法分析器
Lexer的作用,简单来说就是知道这门语言在说什么。针对一句话进行处理,将其拆分成不同的tokens。每个token则包含了一个token code和一些原始信息,类似数字值等。对应上面的语言,可以分成五个类别
- def: 关键字
- oef: 文件结尾
- extern: 关键字
- identifier: 字符串/运算符等
- number: 数字
lexer的作用就是从标准输入中每次读取一行,针对这一行进行解析,返回token类型,得到具体的值。比如解析数字的函数为:
if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+
std::string NumStr;
do {
NumStr += LastChar;
LastChar = getchar();
} while (isdigit(LastChar) || LastChar == '.');
NumVal = strtod(NumStr.c_str(), 0);
return tok_number;
}
More
抽象语法书AST和Parser。