实验3 (1)

master
GreenDay 2 years ago
parent 38a70ce170
commit f5dfcd6915

@ -0,0 +1,25 @@
int a[10];
void Dec_to_Bin(int x)
{
int i = 0;
while(i < 10)
{
a[i] = x % 2;
x = x / 2;
i = i + 1;
}
}
int main(void)
{
int x;
x = getint();
Dec_to_Bin(x);
int i = 0;
while (i < 10)
{
putint(a[9-i]);
i = i + 1;
}
return 0;
}

@ -0,0 +1,18 @@
int main()
{
int n;
int a = 1, b = 1;
n = getint();
int i=0;
while(i < n/2)
{
putint(a);
putint(b);
a = a + b;
b = a + b;
i = i + 1;
}
if(n%2) putint(a);
return 0;
}

@ -0,0 +1,25 @@
int a[5];
int poly(int x)
{
int i=0;
int sum=0;
while(i<5)
{
sum = sum * x + a[4-i];
i = i + 1;
}
return sum;
}
int main()
{
int x;
x = getint();
int i = 0;
while(i < 5)
{
a[i] = getint();
i = i + 1;
}
return poly(x);
}

@ -0,0 +1,30 @@
int main(void)
{
int i = 2;
int j;
int sign;
int num=0;
while(i < 101)
{
sign = 0;
j = 2;
while( j < i )
{
if((i % j) == 0)
{
sign = 1;
break;
}
j = j + 1;
}
if(sign == 0)
{
putint(i);
num = num + 1;
}
i = i + 1;
}
return num;
}

@ -0,0 +1,40 @@
int a[5];
void sort()
{
int temp,max;
int i = 0;
int j = 0;
while(i < 4)
{
j = i+1;
max = i;
while(j<5)
{
if(a[max] < a[j])
max = j;
j = j + 1;
}
temp = a[i];
a[i] = a[max];
a[max] = temp;
i = i + 1;
}
}
int main()
{
int i = 0;
while(i < 5)
{
a[i] = getint();
i = i + 1;
}
sort();
i = 0;
while(i < 5)
{
putint(a[i]);
putch(32);
i = i + 1;
}
return 0;
}

@ -2,16 +2,87 @@
## 贡献详述
### 组员1 张三
### 组员1 舒英特 PB21111704
### 组员2 李四
* task1完成文件
### 组员3 王五
* assign_hand.ll
* func_hand.ll
* task2完成文件
* if_gen.cpp
* while_gen.cpp
* task3完成模块
````c++
void IRBuilder::visit(SyntaxTree::InitVal &node)
void IRBuilder::visit(SyntaxTree::FuncFParamList &node)
void IRBuilder::visit(SyntaxTree::VarDef &node)
void IRBuilder::visit(SyntaxTree::AssignStmt &node)
void IRBuilder::visit(SyntaxTree::ReturnStmt &node)
void IRBuilder::visit(SyntaxTree::EmptyStmt &node)
void IRBuilder::visit(SyntaxTree::UnaryCondExpr &node)
void IRBuilder::visit(SyntaxTree::BinaryExpr &node)
void IRBuilder::visit(SyntaxTree::FuncCallStmt &node)
void IRBuilder::visit(SyntaxTree::WhileStmt &node)
void IRBuilder::visit(SyntaxTree::ContinueStmt &node)
````
共同完成测试集设计以及问题回答
### 组员2 杨宇航 PB21051030
* Task1完成文件
* if_hand.ll
* while_hand.ll
* Task2完成文件
* assign_hand.cpp
* func_hand.cpp
* Task3完成模块
```c++
void IRBuilder::visit(SyntaxTree::FuncDef &node)
void IRBuilder::visit(SyntaxTree::FuncParam &node)
void IRBuilder::visit(SyntaxTree::LVal &node)
void IRBuilder::visit(SyntaxTree::Literal &node)
void IRBuilder::visit(SyntaxTree::BlockStmt &node)
void IRBuilder::visit(SyntaxTree::ExprStmt &node)
void IRBuilder::visit(SyntaxTree::BinaryCondExpr &node)
void IRBuilder::visit(SyntaxTree::UnaryExpr &node)
void IRBuilder::visit(SyntaxTree::IfStmt &node)
void IRBuilder::visit(SyntaxTree::BreakStmt &node)
```
共同完成测试集设计以及问题回答
## 评定结果
| 组员姓名 | 贡献百分比 |
| :-----: | :-------: |
| 张三 | xx% |
| 李四 | xx% |
| 王五 | xx% |
| :------: | :--------: |
| 舒英特 | 50% |
| 杨宇航 | 50% |

@ -1,24 +1,43 @@
# PW6 实验报告
舒英特 PB21111704
* 舒英特 PB21111704
杨宇航 PB21051030
* 杨宇航 PB21051030
## 问题回答
1-1 一个while语句对应三个标签第一个标签处执行判断第二个标签处执行函数体
第三个标签对应while的末尾。br指令有两种形式br label a表示直接跳转到a标签处br i1 x, label a, label b表示x是真则跳到ax是假则跳到b。
* 1-1 一个`while`语句对应三个标签:第一个标签处执行判断,第二个标签处执行函数体,第三个标签对应`while`的末尾。`br`指令有两种形式:`br label a`表示直接跳转到`a`标签处;`br i1 x, label a, label b`表示`x`是真则跳到`a``x`是假则跳到`b`。
1-2 函数调用语句的格式是call <return-type> @<func-name>(<para-type> <para-reg>),包含了返回值类型,参数类型及其具体值。
* 1-2 函数调用语句的格式是call <return-type> @<func-name>(<para-type> <para-reg>),包含了返回值类型,参数类型及其具体值。
2-1 两种 LLVM IR 的不同之处在于第一行getelementptr有4个参数其中前两个参数分别代表数组类型和指针类型后两个参数代表数组相对于的基址偏移量。第三个参数应当为0代表数组的序号。因为`[10 x i32]* %1`被认为是一个指向数组的指针所以应当首先确定该指针指向第几个数组因为只有一个数组因此第三个参数只能为0然后再确定数组内部的偏移量。第二行getelementptr有3个参数前两个参数与第一行含义相同第三个参数等效于第一行的第四个参数因为`i32* %1`本身就指向整形,因此只用一个参数就能确定偏移量。
* 2-1 两种用法的区别为,使用的指针类型不同,前者数据类型为 `i32`,指针类型为 `i32\*`,只有一个参数,表示一维的偏移量;后者数据类型为 `[10 x i32]`(数组),指针类型为 `[10 x i32]*`,有两个参数,分别表示一个维度的偏移量
* 3-1 在`scope`中单独处理`func`方便管理在当前作用域中的变量,方便处理局部变量以及实现整个`modul`的结构层次
## 实验设计
* task1理解LLVM IR指令含义首先将所给的sy代码翻译成单赋值中间表示然后翻译为LLVM IR
* task2理解提供的生成器接口调用接口实现生成Task1中的LLVM IR
* task3根据生成的语法树遍历语法树的节点补充对各个节点的访问代码生成对应的LLVM IR
## 实验难点及解决方案
* 主要难点为理解生成LLVM IR模块的用法然后对应到具体的LLVM IR语句参考所给示例进行理解熟悉用法从而解决
* 其次是根据对语法树结点的访问调用正确的接口来生成对应的LLVM IR代码语句参考PW5的形式进行解决
## 实验总结
* 本次实验使我们组成员进一步了解了LLVM IR的语法
* 本次实验使我们组员可以将课堂理论知识中的IR部分与实践相结合理解更加透彻
* 本次实验使我们组成员更深入理解了LLVM的部分工作原理和机制
* 本次实验使我们组成员提升了对于C++语法中共享指针的熟练程度
## 实验反馈
* task1和task2中所需要完成翻译的sy代码都相对简单可以考虑提供一个具体算法的代码类似于所给demo可以进一步加深理解
* task3中可以适当提供给一个实现示例可以帮助同学们更快熟悉和理解接下来所需要完成的实验任务
## 组间交流
* 无

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save