当编译程序扫描上述源程序时,生成栈式符号表,试就此符号表回答以下问题: (1)画出扫描到 getsym 过程体之前的栈符号表,并要求指明 DISPLAY 和 TOP 值。
时间: 2024-03-17 20:47:43 浏览: 18
词法分析器的主要任务是将源程序的字符流转换成一个个单词,并将其分类为对应的记号。在这个 Pascal 程序中,词法分析器需要将源程序中的关键字(如 PROGRAM、VAR、BEGIN、END 等)、标识符(如 P、input、output 等)、常量(如 norw、13 等)以及运算符和界符(如 +、-、*、/、;、:、,、(、) 等)等转换成对应的记号,并将这些记号传递给语法分析器进行后续处理。
在编译过程中,栈式符号表是用于保存程序中定义的变量、常量、过程等信息的一种数据结构。在扫描过程中,编译器会按照作用域嵌套的顺序将符号表压入栈中,并在离开作用域时将符号表弹出。这样做可以保证在查找符号时,先在当前作用域的符号表中查找,如果没有找到,则继续在上一层作用域的符号表中查找,直到找到为止。
根据您提供的程序代码,我画出了扫描到 getsym 过程体之前的栈符号表。假设在程序开始执行时,符号表为空,则 DISPLAY 数组的初始值为 nil,TOP 值也为 nil。当程序执行到 VAR 关键字时,会新建一个符号表,并将其压入栈中,同时将 DISPLAY 的栈顶元素指向该符号表,TOP 值也指向该符号表。在程序执行到 getsym 过程体之前,符号表的状态如下所示:
```
+-------+ +-------+ +-------+
| k | | i | | norw |
+-------+ +-------+ +-------+
| 1 | | | | 13 |
+-------+ +-------+ +-------+
| VAR | | VAR | | CONST|
+-------+ +-------+ +-------+
|PROGAM | | | | |
+-------+ +-------+ +-------+
| DISPLAY --> | DISPLAY --> | DISPLAY --> nil
+-------+ +-------+ +-------+
| TOP --> | TOP --> | TOP --> Symbol table of CONST
+-------+ +-------+ +-------+
```
其中,每个符号表中的符号被表示为一个键值对,键为符号的名称,值为符号的类型和属性等信息。在上面的符号表中,k、i、norw、13、VAR 和 CONST 都是符号的名称,它们的类型和属性等信息被省略了。在符号表中,k、i 和 norw 是变量名,它们的值分别为 1 和 13;VAR 和 CONST 是关键字,表示变量和常量的定义;PROGRAM 是关键字,表示程序的定义。
在这个符号表中,DISPLAY 数组的栈顶元素指向的是 VAR 关键字所对应的符号表,TOP 值也指向该符号表。在扫描过程中,如果需要查找一个符号,编译器会从 DISPLAY 的栈顶开始逐个查找符号表,直到在某个符号表中找到了该符号为止。因此,在这个符号表中,如果需要查找变量 k,就可以从 TOP 指针指向的符号表中查找到它的定义。如果需要查找常量 norw,就需要先从 DISPLAY 数组中查找到 VAR 关键字所对应的符号表,然后在该符号表中查找常量 norw 的定义。