LLVM学习日志8——Kaleidoscope:添加if和for

这个是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这个函数没有看到定义,不知道什么作用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值