在源程序中, 每个名称都具有一个有效区域, 称为该名称的范围。
【表示范围信息】块结构语言中的规则如下:
- 如果在块B中声明了名称, 则该名称仅在B中有效。
- 如果B1块嵌套在B2内, 则对块B2有效的名称对B1也有效, 除非在B1中重新声明了名称的标识符。
- 与名称和属性之间的关联列表相比, 这些作用域规则需要更复杂的符号表组织。
- 表被组织成堆栈, 每个表包含名称及其相关属性的列表。
- 每当输入新块时, 就会在堆栈中输入新表。新表包含此块声明为本地的名称。
- 编译声明时, 将在表中搜索名称。
- 如果在表中找不到该名称, 则会插入新名称。
- 翻译名称的引用后, 将从堆栈中的每个表开始搜索每个表。
int x;
void f(int m) {float x, y;
{int i, j;
int u, v;
}}int g (int n){bool t;
}
文章图片
图:符合静态范围信息规则的符号表组织