当编译程序扫描上述源程序时,生成栈式符号表,试就此符号表回答以下问题: (1)画出扫描到 getsym 过程体之前的栈符号表,并要求指明 DISPLAY 和 TOP 值。 (2)编译 getsym 的过程体而需要查找栈符号表时,试以该过程体中出现的变量 i 、 j 和 k 为例说明其查找范围的控制步骤。 (3)画出"扫描到 term 过程体之前"的栈符号表。 (4)编译 term 的过程体时,试以该过程体中的变量 i 和 cxl 为例说明其查找范围的控制步骤。 (5)画出"扫描完 stat 过程说明"设计的栈符号表。
时间: 2024-03-14 09:47:18 浏览: 14
很抱歉,由于我是一个语言模型 AI,无法直接绘制图表。但我可以解释栈符号表的实现原理以及回答您的问题。
首先,栈式符号表(Stacked Symbol Table)是一种用于在编译过程中管理符号(Symbol)的数据结构。它通常是使用栈(Stack)实现的,每个作用域(Scope)对应一个栈帧(Stack Frame)。当进入一个新的作用域时,就会创建一个新的栈帧并将其推入栈中;当退出一个作用域时,就会弹出栈帧并销毁其中的符号。栈式符号表通常还会使用一个叫做 `DISPLAY` 的指针数组来记录每个作用域的起始位置,以便快速定位符号的位置。
回答您的问题:
1. 在扫描到 `getsym` 过程体之前,栈式符号表可能是这样的:
```
|-----------------|
| ... |
|-----------------|
| DISPLAY[1] |
|-----------------|
| TOP |
|-----------------|
```
其中 `DISPLAY[1]` 指向根作用域的起始位置,`TOP` 指向栈顶。
2. 当编译 `getsym` 的过程体时,在查找变量 `i`、`j` 和 `k` 时,编译器会按照以下步骤进行控制:
- 首先,编译器会查找当前作用域的符号表,即栈顶的栈帧。
- 如果当前作用域中没有找到变量,编译器会沿着 `DISPLAY` 数组向上查找,直到找到包含该变量的作用域为止。
- 如果整个符号表中都没有找到该变量,编译器会抛出一个错误。
3. 在扫描到 `term` 过程体之前,栈式符号表可能是这样的:
```
|-----------------|
| ... |
|-----------------|
| DISPLAY[2] |
|-----------------|
| DISPLAY[1] |
|-----------------|
| TOP |
|-----------------|
```
其中 `DISPLAY[2]` 指向当前作用域的父作用域的起始位置,`DISPLAY[1]` 指向根作用域的起始位置,`TOP` 指向栈顶。
4. 当编译 `term` 的过程体时,在查找变量 `i` 和 `cxl` 时,编译器会按照以下步骤进行控制:
- 首先,编译器会查找当前作用域的符号表,即栈顶的栈帧。
- 如果当前作用域中没有找到变量,编译器会沿着 `DISPLAY` 数组向上查找,直到找到包含该变量的作用域为止。
- 如果整个符号表中都没有找到该变量,编译器会抛出一个错误。
5. 在扫描完 `stat` 过程说明后,设计的栈符号表可能是这样的:
```
|-----------------|
| ... |
|-----------------|
| DISPLAY[2] |
|-----------------|
| DISPLAY[1] |
|-----------------|
| TOP |
|-----------------|
```
其中 `DISPLAY[2]` 指向当前作用域的父作用域的起始位置,`DISPLAY[1]` 指向根作用域的起始位置,`TOP` 指向栈顶。在 `stat` 过程中可能会创建新的栈帧,具体情况需要根据代码实现来确定。