1、编 译 实 验,任课教师: 王晓斌 806教研室 主楼中338,一. 概述1. 源语言: 扩展MINI-PL(简化的Pascal)语言定义见文法。(1)不允许标号说明、类型说明和函数说明(2)不允许指针、集合、记录、文件和子界型(3)不允许过程作为参数(4)没有REPEAT、CASE、WITH和GOTO语句,2. 工具语言: Pascal、C或其它3. 语法分析采用递归下降分析法4. 目标代码: P码5. 编译程序MINI-CP的结构,源程序字符串.pas,词法分析器,语法分析器,语义分析、中间代码生成器,代码优化器,目标代码生成器,二元式序列.dyd,二元式序列.dys,中间代码序列.qud
2、,中间代码序列.qdo,符 号 表 管 理 程 序,出 错 处 理 程 序,编译程序的结构,P码,二. 各阶段的输入输出1. 词法分析,词法分析器,源程序 .pas,二元式 (文本文件.dyd),2. 语法分析,语法分析器,.dyd,.dys,同时, 产生文本文件.var、 .pro、 .arr,3. 语义分析,语义分析器,.dys,.qud(文本文件),同时, 产生二进制文件.ooj、varfil、procfil、arrfil,4. 优化,优化段,.qud .ooj,.qdo(文本文件),同时, 产生二进制文件.coj,5. 目标代码生成,目标代码生成器,.qdo .coj,.obj(P码)
3、,同时, 产生二进制文件proct(变更后的过程名表)、pf(目标指令),三. 数据结构1. 二元式文件.dyd(1)二元式形式:单词符号种别,长度为16,长度为2,一个空格,(2)每行后加一“.EOLN34”(3)文件结尾加“.EOF37”,2. 错误信息文件.err(1)错误信息格式*LINE:行号错误性质(2)注意: 进入每一阶段, 首先打开.err, 如果无错误, 则.err为空。3. .dys 同.dyd,4. 变量表 变量名vname: char(16) 分类vkind: 01(0变量、1形参) 变量类型vtype: types 变量层次vlev: int 变量在变量表中的位置va
4、dr: int(相对第一个变量而言) types=(ints,reals,bools,chars,arrays),5. 过程名表 过程名proname: char(16) 层次prolev: int 直接外层proc: char(16) 第一个变量的位置firstvar: int 最后一个变量的位置lastvar: int 地址proadr: int 参数个数parnum: int 第一个参数的位置firstpar: int,6. 数组名表 数组名arrname: char(16) 基类型: types 下界low: int 上界high: int,7. 四元式表(oprd, op1, op2
5、, result) oprd整数码 op1第一操作数 op2第二操作数 result结果 op1、op2、result可用二元组表示:(类型,值/地址),8. 目标代码P码参见目标代码(P码)指令表,四. 实现难点1. 文件名的分解多数文件均和源文件同名, 仅扩展名不同。2. 词法分析时, 注意行尾和文件尾。3. 设一个总的变量名表, 查、填表时注意嵌套,也可能涉及到过程名表。,4. 语法错分类:(1)缺少符号错;(2)符号匹配错;(3)符号无定义或重复定义。5. 递归下降分析时, 必须先消除左递归。,6. 递归下降分析时, 跟踪符号的位置当进入某过程时, 其第一个符号必须已经读出; 退出该过
6、程时, 必须读出该语法成分的右界符。,例: G(E) EE+TTTT*FFF(E) i 消除左递归: ETEE+TETFTT*FT F(E)i,过程match:匹配单词符号,并读入下一符号 变量lookahead:即将处理但尚未处理的符号 procedure match(t:token); beginif lookahead=t then lookahead=nexttokenelse error end;,procedure E; beginT;E end; procedure T; beginF;T end;,procedure E;if lookahead=+ then begin ma
7、tch(+);T;Eend; procedure T;if lookahead=* then begin match(*);F;Tend;,7. 进行自上而下语法制导翻译时, 各过程返回的是指针。,五. 实验要求1. 至少完成词法、语法、语义分析。2. 提交: 软盘、文档(1)软盘(说明各文件名称)源程序、测试程序、运行结果(2)文档设计思想、总控算法、主要服务子程序算法、总结(心得、收获、建议等)。,测试程序,PROGRAM EXAM(INPUT,OUTPUT); CONST M=10;N=99; VAR I,J:INTEGER;A:ARRAY110 OF REAL; PROCEDURE PP(X,Y:INTEGER;VAR Z:REAL);VAR I,J:INTEGER;BEGINREAD(I);J:=I+1;WRITELN(J)END; BEGIN I:=1; J:=I+5; WHILE I=M DOBEGIN AI:=J+I; I:=I+1END END.,