实验项目卡-符号表管理+综合PL0编译器
编译原理实践 试验项目名称:符号表管理程序的设计与实现+ PL/0编译器的整合 试验次数:1次试验课 试验目的、内容与要求: 试验目的: 1. 了解符号表的作用 2. 驾驭符号表的内容设计 3. 驾驭符号表的结构支配 4. 驾驭符号表的相关操作 5. 完成PL/0编译器,体会整个编译过程。 试验内容: 1. 了解语义分析阶段须要进行哪些语义检查同时要驾驭符号的作用域原则 2. 确定PL/0语言中有多少种符号,哪些符号须要填入符号表,这些符号都包含哪些属性,设计符号表项的数据结构,可采纳统一的数据项结构,也可不同类别符号采纳不同结构 3. 确定符号表的组织方式:由于标识符有作用域,在组织符号表时,应当保证标识符作用域的有效性。随着分析程序的运行,会不断地进入或退出一些作用域,当退出某个作用域时,应当让这个作用域内的符号表项都作废。一般地,有两种作废方法,真删除法和加标记法法。 4. 定义符号表上的操作:符号表的创建、查找和删除 5. 扫描程序生成符号表。假设符号表初始为空,在编译过程中,每当遇到对某个符号的定义,编译程序首先检查符号表,检查这个符号是否已经存在。若是属于重复定义,报告错误信息;若是一个新的名字,则填入符号表中。在编译过程中遇到对某个符号的运用时,编译器要检查符号表,检查该符号是否已经定义,并根据符号表中的定义来运用符号。 6. 将词法分析、语法分析、语义分析、符号表等各部分模块整合调试。 试验要求: 1. 了解符号表在编译过程中的重要作用 2. 驾驭符号表应包含的符号的属性信息 3. 了解符号表的组织原则 4. 驾驭符号表的操作 5. 驾驭符号表的可见性问题 6. 完成并提交一个完整的PL/0编译器。 7. 留意:此次试验结束后整个编译原理的试验也就完成了,所以这次试验报告在最终写一下整体的试验总结,也就是整个PL/0编译器完成过程中的阅历教训、个人感想之类的。 输入要求:一个PL/0文件。 示例(仅供参考),文件名称test.pl0,文件内容如下: const a=10; var b,c; procedure p; begin c:=b+a; end; begin read(b); while b#0 do begin call p; write(c); read(b); end end. 输出要求:各模块的结果输出,以及最终程序运行的示例。 示例,test.pl0运行结果如下: 请输入PL/0文件: test.txt 0 error,Success! 是否输出汇编代码?(Y/N): y 汇编代码: 0 jmp 0 8 1 jmp 0 2 2 int 0 3 3 lod 1 3 4 lit 0 10 5 opr 0 2 6 sto 1 4 7 opr 0 0 8 int 0 5 9 opr 0 16 10 sto 0 3 11 lod 0 3 12 lit 0 0 13 opr 0 9 14 jpc 0 22 15 cal 0 2 16 lod 0 4 17 opr 0 14 18 opr 0 15 19 opr 0 16 20 sto 0 3 21 jmp 0 11 22 opr 0 0 是否输出符号表?(Y/N): y 符号表: 1 const a val=10 2 var b lev=0 addr=3 3 var c lev=0 addr=4 4 proc p lev=0 addr=2 size=3 运行程序: 输入程序中变量值(0:退出): 3 13 输入程序中变量值(0:退出): 5 15 输入程序中变量值(0:退出): 0 请按随意键接着. . . 试验具体设计说明: 符号表的作用:符号表是用来存放语言程序中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性。在词法分析及语法分析过程中不断积累和更新表中的信息,并在词法分析到代码生成的各阶段,按各自的须要从表中获得不同的属性信息。不论编译策略是否分趟,符号表的作用和地位是完全一样的。 符号表的设计规则 1) 符号名 符号表中设置一个符号名域,存放该标识符,该域通常就是符号表的关键字域。通常在语言程序中标识符字符串是一个变量、函数或过程的唯一标记,因此在符号表中符号名作为表项之间的唯一区分一般不允许重名。从而该符号名与它在符号表中的位置建立起一一对应之关系,使得我们可以用一个符号在表中的位置(通常是一个整数)来替换该符号名。通常把一个标识符在符号表中的位置的整数值称之谓该标识符的内部代码。在经过分析处理的语言程序中标识符不再是一个字符串而是一个整数值,这不但便于识别比较而且缩短了表达的长度。 2) 符号的类型 标识符中除过程标识符之外,函数和变量标识符都具有数据类型属性。对于函数的数据类型指的是该函数值的数据类型。基本数据类型有整型、实型、字符型、逻辑型(布尔型)等,符号的类型属性从程序中该符号的定义中得到。变量符号的类型属性确定了该变量的数据在存储空间的存储格式,还确定了在该变量上可以施加的运算。 3) 符号的作用域及可视性 一般来说,定义该符号的位置及存储类关键字确定了该符号的作用域。C语言中一个外部变量的作用域是整个程序,因此一个外部变量符号的定义在整个程序中只能出现一次。一般来说一个变量的作用域就是该变量可以出现的场合,也就是说在某个变量作用域范围内该变量是可引用的,这就是变量可视性的作用域规则。PL/0语言允许过程嵌套定义,即外层变量和程序对内层可见,内层变量和函数对外层不行见,其中内层函数或变量将使外层的同名函数或变量不行见。 4)符号表操作 在整个编译期间,对于符号表的操作大致可归纳为五类: • 对给定名字,查询名字是否已在表中; • 往表中填入一个新的名字; • 对给定名字,访问它的某些信息; • 对给定名字,填写或更新它的某些信息; • 删除一个或一组无用的项。 不同种类的表格所涉及的操作往往也是不同的。上述五个方面只是