llh 12 months ago
commit 73da4f8a12

@ -0,0 +1,6 @@
int main(){
float c = 0.0;
return c;
int a = 1;
return a;
}

@ -0,0 +1,8 @@
int a = 5;
int b;
int main(){
int a=10;
b=5;
int c=a*2+b*1.1+3.6;
return c;
}

@ -0,0 +1,4 @@
int a[10];
int main(){
return a[0];
}

@ -35,12 +35,27 @@ PB21111663 李璐豪
在task3的时候利用实验框架通过类比上一关的IR认罚的编写利用已经生成的AST树为不同的模块编写对应的IR语法
- 在task1的时候学习SysYF的语法并编写等效的ll文件
- 在task2的时候学习能够生成SysYF的IR文法使之能生成等效的ll文件
- 在task3的时候利用实验框架通过类比上一关的IR认罚的编写利用已经生成的AST树为不同的模块编写对应的IR语法
- 参考助教给出的代码框架,我们把实验分成了变量定义、初始化和赋值;函数和算数调用和求值两个部分进行分工
## 实验难点及解决方案
在函数外表达式的计算中由于全局变量无法使用bb模块内的build相关函数需要根据变量名单独取出值并计算
Const数组不会在函数外进行再赋值的操作
- 全局变量在初始化时如果用到其他全局变量进行赋初值无法使用builder->create_load()
- 获取全局数组中元素的值比较麻烦
- 因此。如果scope.in_global()那不论访问什么变量我们都传值因为赋初值在初始化中完成了和lval中的传值不冲突。同时在没有进入任何bb的情况下赋值语句是不能出现的
## 实验总结
利用PW5学到的AST以及访问者模式我们编写了能够生成IR的实验框架对AST和IR的理解更加深刻
@ -50,4 +65,3 @@ Const数组不会在函数外进行再赋值的操作
配置文件不够齐全
## 组间交流

@ -40,11 +40,11 @@ namespace SysYF
#define get_true_type(left_type, right) \
if (!scope.in_global()) \
{ \
if (left_type == INT32_T && right->get_type() == FLOAT_T) \
if ((left_type == INT32_T || left_type == INT32PTR_T) && right->get_type() == FLOAT_T) \
{ \
right = builder->create_fptosi(right, INT32_T); \
} \
else if (left_type == INT32_T && right->get_type() == INT1_T) \
else if ((left_type == INT32_T || left_type == INT32PTR_T) && right->get_type() == INT1_T) \
{ \
right = builder->create_zext(right, INT32_T); \
} \
@ -56,22 +56,22 @@ namespace SysYF
{ \
right = builder->create_icmp_ne(right, CONST_INT(0)); \
} \
else if (left_type == FLOAT_T && right->get_type() == INT32_T) \
else if ((left_type == FLOAT_T || left_type == FLOATPTR_T) && right->get_type() == INT32_T) \
{ \
right = builder->create_sitofp(right, FLOAT_T); \
} \
else if (left_type == FLOAT_T && right->get_type() == INT1_T) \
else if ((left_type == FLOAT_T || left_type == FLOATPTR_T) && right->get_type() == INT1_T) \
{ \
right = builder->create_zext(right, FLOAT_T); \
} \
} \
else \
{ \
if (left_type == FLOAT_T && right->get_type() != FLOAT_T) \
if ((left_type == FLOAT_T || left_type == INT32PTR_T) && right->get_type() != FLOAT_T) \
{ \
right = CONST_FLOAT(static_cast<float>(dynamic_pointer_cast<ConstantInt>(right)->get_value())); \
} \
else if (left_type == INT32_T && right->get_type() != INT32_T) \
else if ((left_type == INT32_T || left_type == FLOATPTR_T) && right->get_type() != INT32_T) \
{ \
right = CONST_INT(static_cast<int>(dynamic_pointer_cast<ConstantFloat>(right)->get_value())); \
} \
@ -352,7 +352,7 @@ namespace SysYF
else
{
init_list.clear();
while (init_list.size() < length.size()) // 如果init_list的长度小于length的长度就把init_list其他的值补上0
while (static_cast<int>(init_list.size()) < array_len) // 如果init_list的长度小于length的长度就把init_list其他的值补上0
{
init_list.push_back(ConstantZero::create(type_map[node.btype], module));
}

Loading…
Cancel
Save