《编译原理实验讲义》由会员分享,可在线阅读,更多相关《编译原理实验讲义(38页珍藏版)》请在金锄头文库上搜索。
1、1编译原理编译原理实验书实验书2011 年 3 月实验目录实验 1:词法分析程序(3 学时、第 6、7 周).2 实验 2:语法分析-递归子程序法(3 学时,第 7、8 周).11 实验 3:语法分析-预测分析法(3 学时,第 9、10 周).28 实验 4:语义分析和代码生成(15 学时,第 1017 周) .38适用专业及实验总学时: 2008 级计算机科学与技术专业 2008 级计算机科学与技术专业(网络方向) 24 总学时恭喜你!你将进入非常重要的专业课程的实践。编译原理的知识影响到专业人员的素质,除编译程序外有大量专业工作与编译技术相关 。你现在需要通过脚踏实地的实践学习,把自己的专
2、业水平提高一个层次。如何才能把实验做好?实验课时非常有限,建议打印本学期的全部实验资料打印本学期的全部实验资料。如果可以,你的私人电脑安装 Visual Studio C+开发环境,以便课余继续练习。上实验课之前,上实验课之前,一定要仔细研究实验课相关程序,设计好解决方案。一定要仔细研究实验课相关程序,设计好解决方案。上实验课时,直接调试程序并获得结果,如有不懂之处,应该也必须及时提问、解决。实验课后,完成实验报告。每个实验必须提交实验报告。实验报告内容含:关键问题、设计思路、实现的关键代码、程序运行结果、总结及进一步改善建议。每个实验报告 1500 字2500 字,约 23 页 A4纸。实验
3、报告打印出来后上交。不允许抄袭实验报告。实验报告内容超过 60%相同,涉及人员均作为抄袭处罚。一份汗水,一份收获。只要你认真完成上述实验,你一定获得更加专业的自信。加油!2实验实验 1:词法分析程序:词法分析程序(3 学时、第学时、第 6、7 周)周)1 实验目的和内容: 1) 实验目的:通过完成词法分析程序,了解词法分析的过程。 2) 实验内容:用 C 实现对 Pascal 的子集程序设计语言的词法识别。 3) 实验要求:要求修改文法和程序,增加浮点数处理功能。实验环境是 Windows 操作系统、Visual C+开发环境。 2. 程序设计语言的描述: . PROGRAM ; CONST
4、,; 标识符=无符号整数 VAR ,; 标识符,标识符: INTEGER|LONG ; PROCEDURE 标识符;|PROCEDURE 标识符(标识符:); | | 标识符:= IF THEN WHILE DO 标识符|标识符() READ (标识符,标识符) WRITE (,) BEGIN ;END |ODD +|- 标识符|无符号整数|() +|- *|/ =|=其中:用左右尖括号括起来的符号串表示非终结符 定义为 表示该语法成分可以重复 0n 次 表示方括号内为可选项,即 0 或 1 次33 程序设计语言单词的内部编码:(35 个终结符)内 码单词内码单词内码单词内码单词1PROGRA
5、M2CONST3VAR4INTEGER5LONG6PROCEDURE7IF8THEN9WHILE10DO11READ12WRITE13BEGIN14END15ODD16+17-18*19/20=21=26.27,28;29:30:=31(32)33无符号整数34标识符35#4.词法分析程序的设计思想: 为了使实现的编译程序实用,规定源程序可以采用自由书格式,即一行内可 以书写多个语句,一个语句也可以写成多行;标识符的前 20 个字符有效;整数用 2 个字节表示;长整数用 4 个字节表示。这样,词法分析程序的主要工作为: 1) 从源程序中读入字符。 2) 统计行数和列数用于错误单词的定位。 3)
6、 删除空格类字符,包括回车、制表符空格。 4) 对拼写的单词,用(内码,属性)二元式表示。 5) 填写符号表。 这里采用一遍扫描的方法,即从左到右只扫描一次源程序,词法分析作为语 法分析的一个子程序,在编写词法分析程序时,用重复调用词法分析子程序 取一单词方法,得到整个源程序的内码流。5调试时可以使用下面的源程序作为下述词法分析程序的输入(当然,你也可以自己编 写一个源程序) ,词法分析程序输出词法分析结果。 PROGRAM MYPASCAL;CONST UNIT=100; VAR x:INTEGER; PROCEDURE subproc(i:INTEGER);BEGINx:=i;END; B
7、EGINsubproc(20);x:=x+UNIT; END.6下面是一个词法分析程序,该程序能够将源程序,也就是相应字符流转换成内码,并4输出到文件。程序的执行需要提供两个参数,第一个参数是源程序文件名,第二个参数是 存放分析结果的文件名,第二个参数可以省略,可由程序自动生成。Vc+6 程序参数的设 置方法:菜单 project 下子菜单 settings 中的 debug 选项卡下 program arguments 对话框中, 输入参数。#include #include #include #include #define lenth1 15 /保留字表的长度 #define lenth
8、2 17 /运算符界符表长度 struct char name21;int type;int addr;indent1000; /符号表 struct stchar name21;int code;sym; /当前单词 FILE *f1,*f2; int line=1,row=1,val; /行号、列号、数字串的值 char ch= ; /当前字符 int lenth3=0; /符号表中实际的标识符个数 void getsym(); char getchr(); void error(int); main(int argc,char *argv)char ft12,*fc;if (f1=fop
9、en(argv1,“r“)=NULL) /打开源程序文件printf(“can not open file.n“); exit(0);if (argc“,“,“=“,“.“, “,“,“;“,“:“,“:=“,“(“,“)“; /运算符界符表 char str21; int i,n; while (isspace(ch)ch=getchr(); if (isalpha(ch) /如果当前字符是字母n=0;while (isalpha(ch) | isalnum(ch) /当前字符是字母或者数字,继续循环if (isalpha(ch) ch=tolower(ch);if (n = : :=n=0
10、; if (ch= | ch=:)strn+=ch;if (ch=getchr()=) / =或:=strn+=ch;ch=getchr(); else if (ch=) / strn+=ch;ch=getchr(); else if (ch=-1)strcpy(sym.name,“);sym.code=35; /# /else error(1);7strn=0; /str 为一个完整的单词for (i=0;i或:Y =或:=YNN YNch 是+ - * / = . , ; ( ) 中的符号?为该符号构造字符串 str读入下一个符号到 ch在运算符界符表 d 中查该符号的位置 i登记该符号到
11、 sym,内码 i+16ch 是或者:吗?构造 str 并读入符号到 chch 是=吗?构造 str 并读入符号到 chch 是吗?构造 str 并读入符号到 ch登记#到 sym,内码35在 str 末尾加0,构建字符串在运算符界符表 d 查 str 位置 i。查到?单词 str?登记 str 到 sym,内码 i+1611实验实验 2:语法分析:语法分析-递归子程序法递归子程序法(3 学时,第学时,第 7、8 周)周)1目的:通过完成语法分析程序,了解语法分析的过程和作用。 2 实验内容:用递归子程序法实现对 Pascal 的子集程序设计语言的分析程序。下面分析 程序对源程序的内码流进行分
12、析,如果为文法定义的句子,则输出“是” ,否则输 出“否” 。还能根据需要处理说明语句,填写相应的符号表,供以后生成代码时使 用。 3 实验要求:要求修改文法和程序,增加浮点数处理功能。 4 改写实验一的文法,使其是无递归和无左公共因子的 BNF,改变后文法如下(没有浮 点数处理功能): . PROGRAM ; CONST ;| 标识符=无符号整数 , | VAR | 标识符:; , 标识符 | | INTEGER|LONG ; | PROCEDURE 标识符; (标识符:) | ; | | 标识符 :=|()| IF THEN WHILE DO READ (标识符) WRITE () , |
13、 BEGIN END ; | |ODD +|-| | 结束12| 标识符|无符号整数|() +|- *|/ =|=5非终结符和函数名对照表:(34 个非终结符)非终结符函数名非终结符函数名programprogheadblockconsexplconsdefivarexplconssuffvardefivarsuffprocdefitypilprocedhprocsuffassiprosentencesuffixifsentreadwhilsentidsuffwritecompsentexprsuffsentsuffconditiotermsuffexpresstermfactsuffargu
14、mentfactoraAddopermuloperrespoper6递归子程序的设计思想: 为每一个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应 的子程序。由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。 这里将词法分析作为一个语法分析的子程序,当语法分析需要单词时,就调用相 应的词法分析程序获得一个单词。语法分析的作用是识别输入符号串是否为文法 上定义的句子,即判断输入符号串是否满足程序定义的要求。 当一个非终结符对应有两个或者两个以上产生式时,可根据当前单词决定采 用哪一个产生式进行右部分析。 7 调试时可以使用下面的源程序作为语法分析程序的输入(当然,你也可以编写一个源 程序) 。 PROGRAM MYPASCAL;CONST UNIT=100; VAR x,y:INTEGER; PROCEDURE subproc(i:INTEGER);BEGINx:=i;END;13BEGINsubproc(20);x:=x+UNIT;y:=20;WHILE x=y*(x-1)+20 THEN x:=20+(x+y)/3;READ(x,y);WRITE(x*y+1);END END.8下面是一个递归子程序语法分析程序,程序的执行需要提供一个参数:源程序文件名。#include #include #includ