下例中符号a的属性,是取决于编译程序扫描到"a[n][m],"时的有关状态。 … func(x,y) {… struct tag { … int a[n][m],… … Y ![]() } t; } … 编译程序在 ![]() · 类型属性: 当前类型状态是int决定了a的类型属性是整型。 · 存储类别属性: 当前存储状态是在函数内部,决定了a的存储属性是动态存储区(即Auto)。 · 符号作用域属性: 当前是在函数内部作用域中,由func函数层次决定了a的分程序级别level=1,(外层level=0)。 · 存储分配属性: ⒈ 结构成员属性:a是结构tag的成员,是t结构量的成员变量。其存储分配属性是成员变量a在结构量t中的相对位移量。 ⒉ 由于t结构量是函数func中的Auto变量,因而t的存储分配属性又是函数func动态工作区中的相对位移量。 · 数组内情向量属性: 该变量a是一个二维整型数组,具有n×m个元素。 符号属性除了上述这些属性在扫描到该符号时就已具备,并可立即登录之外,还有些符号的属性需要在以后的语法分析过程中逐步获得并登入。例如,常量定义要在定义的常数表达式计算完成后,才能把其值填入该常量符号项的属性中。其它如结构量的值域尺寸,各种属性链(函数形参链、结构成员链及下推链等)的指针都是在编译过程中逐步登录的。 |