PL/0编译程序设计说明书第1页/共20页PL/0编译程序设计说明书小组组长:李文(00000000)小组成员:******(00000000)******(00000000)******(00000000)******(00000000)2006年1月16日PL/0编译程序设计说明书第2页/共20页1引言...............................................................................................................................................31.1编写目的.............................................................................................................................31.2背景.....................................................................................................................................31.3定义.....................................................................................................................................31.4参考资料.............................................................................................................................52总体设计........................................................................................................................................52.1需求规定.............................................................................................................................52.2运行环境.............................................................................................................................62.3模块流程.............................................................................................................................62.4模块机理说明.....................................................................................................................72.5模块设计与实现...............................................................................................................102.6人工处理过程...................................................................................................................122.7程序的亮点.......................................................................................................................132.8尚未问决的问题...............................................................................................................133程序介绍和使用说明..................................................................................................................134程序测试结果分析......................................................................................................................16PL/0编译程序设计说明书第3页/共20页概要设计说明书1引言1.1编写目的此文档为VK1.0版PL/0编译器详细设计说明书,旨在说明该编译器的设计思想和实现。此说明书可以在阅读本编译器代码时有效地帮助您理解本编译器的设计方法和实现过程,希望能提供给您所需的帮助。1.2背景名称:VK1.0版PL/0编译器说明:此编译器为北京师范大学信息科学学院计算机科学与技术系2003级2005-2006学年度第一学期编译原理课程实验作业。本软件由李文小组合作开发,组长李文,同组人员有吕叶、刘晟忻、肖纯、曲文星。本软件主要用于PL/0程序的编译,软件提供生成中间代码,并执行检测。本软件为开源软件,故除了用于编译以外还可给编译器开发者提供开发参考。本软件开发运行在Windows32位平台上,尚未开发其他平台版本。1.3定义本软件开发中,用到了一些PL/0语言和PCODE的定义以及编译原理术语,下面给予说明。PL/0语言:BNF范式:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉;〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}ENDPL/0编译程序设计说明书第4页/共20页〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/〈关系运算符〉∷=#|=|<|<=|>|>=〈条件语句〉∷=IF〈条件〉THEN〈语句〉〈过程调用语句〉∷=CALL〈标识符〉〈当型循环语句〉∷=WHILE〈条件〉DO〈语句〉〈读语句〉∷=READ'('〈标识符〉{,〈标识符〉}')'〈写语句〉∷=WRITE'('〈表达式〉{,〈表达式〉}')'〈字母〉∷=a|b|…|X|Y|Z〈数字〉∷=0|1|2|…|8|9PL/0语言允许过程嵌套定义,函数及变量作用于本层。即外层变量和程序对内层可见,内层变量和函数对外层不可见。其中内层函数或变量将使外层的函数或变量不可见。PL/0允许递归调用,以函数可见为调用原则。PCODE语言:Pcode语言是PL/0语言的中间代码,其形式如下:指令格式:flaf功能码l层次差(标识符引用层减去定义层)a根据不同的指令有所区别其代码有8条,如下:LIT0a将常数值取到栈顶,a为常数值LODla将变量值取到栈顶,a为偏移量,l为层差STOla将栈顶内容送入某变量单元中,a为偏移量,l为层差CALla调用过程,a为过程地址,l为层差INT0a在运行栈中为被调用的过程开辟a个单元的数据区JMP0a无条件跳转至a地址JPC0a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行OPR00过程调用结束后,返回调用点并退栈OPR01栈顶元素取反OPR02次栈顶与栈顶相加,退两个栈元素,结果值进栈OPR03次栈顶减去栈顶,退两个栈元素,结果值进栈OPR04次栈顶乘以栈顶,退两个栈元素,结果值进栈OPR05次栈顶除以栈顶,退两个栈元素,结果值进栈OPR06栈顶元素的奇偶判断,结果值在栈顶OPR07无操作OPR08次栈顶与栈顶是否相等,退两个栈元素,结果值进栈OPR09次栈顶与栈顶是否不等,退两个栈元素,结果值进栈PL/0编译程序设计说明书第5页/共20页OPR010次栈顶是否小于栈顶,退两个栈元素,结果值进栈OPR011次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈OPR012次栈顶是否大于栈顶,退两个栈元素,结果值进栈OPR013次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈OPR014栈顶值输出至屏幕OPR015屏幕输出换行OPR016从命令行读入一个输入置于栈顶编译术语:开始符号集:设G=(VT,VN,S,P)是上下文无关文法FIRST(α)={a|αaβ,a∈VT,α,β∈V*}若αε,则规定ε∈FIRST(α).后跟符号集:设G=(VT,VN,S,P)是上下文无关文法,A∈VN,S是开始符号FOLLOW(A)={a|SμAβ,且a∈VT,a∈FIRST(β),μ∈VT*,β∈V+}若SμAβ,且βε,则#∈FOLLOW(A)。1.4参考资料本软件为课程作业,故开发时主要参考了课程相关的书籍:编译原理电子课件北京师范大学信息科学学院计算机科学与技术系孙波教授提供《编译原理(第二版)》清华大学出版社张素云、吕映芝等编写。《编译原理及编译程序构造》北京航空航天大学出版社高仲仪金茂忠编《AdvancedCompilerDsignandImplementation》[USA]StenvenS.Muchnick高级编译器设计与实现赵克佳沈志宇译机械工业出版社2总体设计2.1需求规定说明对本系统的主要的输入输出项目、处理的功能性能要求,详细的说明可参见附录C。本编译软件的设计目标是为PL/0提供编译和检错以及供开发参考。输入项目:1.输入PL/0源程序文档名。如果路径正确继续,否则退出2.选择是否进行并输出词法分析结果(Y/N)。3.选择是否输出中间代码到屏幕(Y/N)。程序会在分析完毕输出中间代码到文件4.运行时根据程序结构输出项目:1.如果有错误输出错误2.根据用户选择输出相应结果3.PL/0程序运行的结果PL/0编译程序设计说明书第6页/共20页处理性能:由于PL/0程序较为简单,一般的机器平台均能很快地运行,故进行PL/0程序的编译程序设计时并未考虑性能方面的要求。2.2运行环境本编译软件要求运行在支持Windows32位系统的Intel8086以上机型中。从理论上讲,如果源代码使用GCC编译器编译,应该可以在Linux等系统上运行,但尚未做过测试。2.3模块流程本系统各模块处理数据流程如下图所示:词法分析模块语法分析模块错误处理模块符号表管理模块代码生成模块中间代码解释执行模块PL/