这个是Kaleidoscope的第5章,之前的都只有一个基本块,这是远远不够的。这一章教了if和for。
if比较简单,例子中的if是这样用的,和一般c的不用,if没有括号,多了then。整个if分成三块,if后面的解析表达式,then后面的表达式,else后面的解析表达式。
def fib(x)
if x < 3 then
1
else
fib(x-1)+fib(x-2);
增加了关键词,当然得修改Token,增加不同的返回值。然后分析词法,这个增加在关键词的分析中就行。关键是语法分析和从AST生成LLVM IR语言。语法分析需要扩展AST,增加了IfExprAST。其中增加了cond,then,else。
语法解析还算简单,注意的是在函数ParseExpression后自动读取下一个语元,不用再getNextToken。
在转换为LLVM IR时,由于是SSA的,所以需要Phi operation
这个概念我也第一次听说,挺有意思的,对于这个来说,就是在分支之后,合二为一时需要增加一个phi操作。
因为增加了基本块,所以增加基本块,thenBB,ElseBB,MergeBB。这三个连接方式有所不同,我有点弄不清区别,但是看也是能看。
for循环比if的复杂一点,不过大致都是相同的。使用in来开启主要内容
extern putchard(char);
def printstar(n)
for i = 1, i < n, 1.0 in
putchard(42); # ascii 42 = '*'
# print 100 '*' characters
printstar(100);
在语法解析时,有一点我没有看懂,在for后面定义变量。难道每次都要新定义一个变量吗?感觉语法分析就是强制按照前面的例子来定义的。
LLVM IR的实现基本也差不多,phi函数用在for的那一句中。不过NamedValues这个函数没有看到定义,不知道什么作用