Arrays 编译器对数组|形式参数的支持

Arrays 编译器对数组|形式参数的支持,arrays,parsing,compiler-construction,Arrays,Parsing,Compiler Construction,我被要求在一个编译类似C语言的编译器中基本上从头开始实现数组(事实上,该语言是C语言的一个严格子集)。但我认为这对这个问题并不重要 我扩展了扫描器和解析器,对于全局和局部数组(甚至多维数组),一切都很好。基本上,我为数组的每个条目分配8个字节,例如,arr[10]将分配80个字节。对于寻址和赋值,我使用行主算法 如前所述,本地和全局阵列工作正常。但是,我没有将数组作为正式参数来使用 比如说 int test (int a[10]); int main() { int array[10

我被要求在一个编译类似C语言的编译器中基本上从头开始实现数组(事实上,该语言是C语言的一个严格子集)。但我认为这对这个问题并不重要

我扩展了扫描器和解析器,对于全局和局部数组(甚至多维数组),一切都很好。基本上,我为数组的每个条目分配8个字节,例如,arr[10]将分配80个字节。对于寻址和赋值,我使用行主算法

如前所述,本地和全局阵列工作正常。但是,我没有将数组作为正式参数来使用

比如说

int test (int a[10]);



 int main() {
  int array[10];
  int i;
  i = 0;
  while(i < 10) {
    array[i] = i;
    i = i + 1;
  }
  return test(array);
}

int test (uint64_t a[10]) {
  return a[7];
}
应返回值7。但是,由于堆栈上项目的顺序不同,因此我的值以这种方式存储

a[-9] == 0;
a[-8] == 1;
a[-7] == 2;
a[-6] == 3;
.
.
.
a[-1] == 8;
a[0] == 9;
如果我使用全局或局部数组,我就有数组开头的地址,然后将该地址增加一些偏移量以访问某个元素(因为这是实现数据存储的方式)。在堆栈上,据我所知,结果是相反的

我的问题是堆栈从上到下增长,所以如果我有堆栈指针,变量必须存储在它上面。这意味着我不能仅仅改变内存地址的符号

那么,如何在正确的索引(而不是一些负索引)上获取数组元素呢

我希望这个问题在某种程度上是可以理解的

但是堆栈具有后进先出结构,这意味着变量的存储顺序与定义的顺序相反

那不会发生。调用堆栈的后进先出的唯一问题是堆栈帧的顺序,帧内发生的事情完全取决于您。在只有静态大小的局部变量的简单语言中,可以通过从堆栈指针中减去一些常量来分配所有这些变量所需的内存。当函数离开时,分配被撤消,这就是后进先出的原因,但是块中的变量没有顺序,尤其是这些变量的内部结构没有顺序

但是堆栈具有后进先出结构,这意味着变量的存储顺序与定义的顺序相反


那不会发生。调用堆栈的后进先出的唯一问题是堆栈帧的顺序,帧内发生的事情完全取决于您。在只有静态大小的局部变量的简单语言中,可以通过从堆栈指针中减去一些常量来分配所有这些变量所需的内存。当函数离开时,分配被撤消,这就是后进先出的原因,但是块中的变量没有顺序,尤其是这些变量的内部结构没有顺序。

注意C没有数组参数(它允许语法,有点混乱,但语义上
int test(int a[10])
完全等同于
int-test(int*a)
),因此如果你真的想让你的语言成为C的子集,你也不应该。请注意,C没有数组参数(它允许语法,有点混乱,但语义上
int-test(int-a[10])
完全等同于
int-test(int*a)
,所以,如果你真的想让你的语言成为C语言的一个子集,你也不应该。
a[-9] == 0;
a[-8] == 1;
a[-7] == 2;
a[-6] == 3;
.
.
.
a[-1] == 8;
a[0] == 9;