编译原理中如何用三元式表示数组?以A[i]为例
用三元式表示数组元素A[i]的方法
嘿,这个问题问到点子上了!在编译原理的三元式中间代码体系里,咱们没法直接写出A[i]这种带下标的语法糖,得把它拆解成符合三元式规则的运算步骤——毕竟三元式的核心就是操作符 + 两个参数,所有复杂操作都得拆成一个个基础运算单元。
先理清楚数组元素的底层逻辑:一维数组A的元素A[i],在内存里的实际地址是「数组基地址 + 下标i × 单个元素占用字节数」。如果要获取这个元素的值,还得再加一步“取地址对应内容”的操作。咱们一步步拆成三元式:
步骤1:计算下标偏移量
首先得算出i对应的内存偏移(也就是i个元素占多少字节),用乘法运算:
| 序号 | op | arg1 | arg2 |
|---|---|---|---|
| 1 | * | i | size |
注:
size是数组单个元素的字节大小,比如int类型是4,float是8,编译时这个值是确定的常量。
步骤2:计算元素的内存地址
把数组的基地址(可以直接用符号A表示,编译时会解析成实际内存地址)和第一步算出的偏移量相加,得到A[i]的有效地址:
| 序号 | op | arg1 | arg2 |
|---|---|---|---|
| 2 | + | A | (1) |
这里的
(1)表示引用第1个三元式的运算结果,这也是三元式传递中间值的核心方式。
步骤3:获取元素的值(可选,根据场景)
如果咱们是要读取A[i]的值(比如把它赋值给变量或者参与运算),还需要一个“取内存内容”的操作,通常用load作为操作符(不同教材可能用[],本质一样):
| 序号 | op | arg1 | arg2 |
|---|---|---|---|
| 3 | load | (2) | - |
这里第二个参数用
-表示这是一元操作,有些三元式实现里也会省略第二个参数,只要语义清晰就行。
实际例子:表达式x = A[i]的完整三元式
如果要表示把A[i]的值赋值给x,完整的三元式序列就是:
*isize+A(1)load(2) -=x(3)
另外提一句,如果是多维数组(比如A[i][j]),逻辑是完全一致的——只是要多几步偏移量的计算(先算第一维的总偏移,再叠加第二维的偏移),把每一步运算都拆成独立的三元式就行。
内容的提问来源于stack exchange,提问作者Satish_Mhetre
相关产品推荐
相关产品推荐

