简单 不涉及控制流 条件 分支 循环 没有branch指令 一行一行 顺序执行语句的翻译

小难点:数组的翻译 左边与右边的区别是左边不再只是id 可以是 数组元素了L。可以做数组元素的访问。 看等号的右边 也可以是数组元素的引用 类似于 a[1][2]=b[2][3]

综合属性 自底向上 从叶子节点出发:

  • E.code:中间代码
  • E.addr:变量名,常量,与地址无关 例子:
  • top指的是符号表当前作用域的

优化级别0 因为有load store.如果开了优化 ,那么这两条指令都会被删掉 只剩下return 0.

数组引用的中间代码翻译

两个地方碰到数组: 声明:int a[2][3] 数组引用 :x=a[1][2],a[1][2]=x右值 +左值

表达式不是处理声明,而是数组引用,与a的相关信息存储到符号表中。 核心是计算 a[1][2]相对于数组基地址a的偏移地址 计算对应的__宽度__当计算类型的时候 继承属性 往右边下面传递 综合属性 接受 a[2]两个小数组,[3]每个小数组里面元素有3 声明语法的时候同时拿到了 类型信息和每一个类型对应的宽度信息。

综合属性的计算右边的语义 累乘与累加。递归。偏移地址的计算。


对应llvm的实现

gep指令 hh 操作指针 不对内存进行计算。跟内存有关的操作只有load/store/alloca; 0 指向数组本身 当函数传递参数的时候需要。 后面的索引 一条一条脱去层。它会帮你计算。

:yum: :smile: