Compute the x'th fibonacci number.

@liwei

Plan

  1. 参考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。