编译原理实验指导书.doc
《编译原理实验指导书.doc》由会员分享,可在线阅读,更多相关《编译原理实验指导书.doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date编译原理实验指导书实验一 词法分析中南林业科技大学实验报告课程名称: 编译原理专业班级:2014级计算机科学与技术2班姓名:王晶学号:201445922017年5月5日-目录实验一 词法分析2实验二 LL(1)分析法11实验三 逆波兰式的产生及计算17实验四 LR(1)分析法24实验一 词法分析一、 实验目的编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义
2、的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、 实验题目如源程序为C语言。输入如下一段:main()int a=-5,b=4,j;if(a=b) j=a-b; else j=b-a;要求输出如下:(2,”main”) (5,”(”) (5,”)”)(5,”) (1,”int”) (2,”a”)(4,”=”) (3,”-5”) (5,”,”)(2,”b”) (4,”=”) (3,”4”)(5,”,”) (2,”j”) (5,”;”)(1,”if”) (5,”(”) (2,”a”)(4,”=”) (2,”b”) (5,”)”)(2,”
3、j”) (4,”=”) (2,”a”)(4,”-”) (2,”b”) (5,”;”)(1,”else”) (2,”j”) (4,”=”)(2,”b”) (4,”-”) (2,”a”)(5,”;”) (5,”)三、 实验理论依据(一)识别各种单词符号1、 程序语言的单词符号一般分为五种:(1) 关键字(保留字/ 基本字)if 、while 、begin(2) 标识符:常量名、变量名(3) 常数:34 、56.78 、true 、a 、(4) 运算符:+ 、- 、* 、/ 、 、and 、or 、.(5) 界限符:, ; ( ) /*2、 识别单词:掌握单词的构成规则很重要 (1) 标识符的识别:
4、字母| 下划线+( 字母/ 数字/ 下划线)(2) 关键字的识别:与标识符相同,最后查表 (3) 常数的识别 (4) 界符和算符的识别 3、 大多数程序设计语言的单词符号都可以用转换图来识别,如图1-1 图1-14、 词法分析器输出的单词符号常常表示为二元式:(单词种别,单词符号的属性值)(1) 单词种别通常用整数编码,如1 代表关键字,2 代表标识符等 (2) 关键字可视其全体为一种,也可以一字一种。采用一字一种得分法实际处理起来较为方便。 (3) 标识符一般统归为一种 (4) 常数按类型(整、实、布尔等)分种 (5) 运算符可采用一符一种的方法。 (6) 界符一般一符一种的分法。 (二)超
5、前搜索方法1、 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a+” ,当前字符为“” ,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢? 显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符+ ,这时可知应将 解释为大于运算符。但此时,超前读了一个字符+ ,所以要回退一个字符,词法分析器才能正常运行。又比如:+ 分析为正号还是加法符号 (三)预处理预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。由一个预处理子程序来完成。四、 词法分析器的设计1、 设计方法:(1) 写出该语言的词法规则。 (2) 把词法规则转换为相
6、应的状态转换图。 (3) 把各转换图的初态连在一起,构成识别该语言的自动机 (4) 设计扫描器 2、 把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。 扫描器从初态出发,当识别一个单词后便进入终态,送出二元式 开始读标识符是字母掠过空格和回车符查保留字表是否查到换成属性字结束是数字是特殊符号error取数换成属性字换成属性字换成属性字YNYYYNNN图1-2 取单词程序框图五、 完整程序源代码#include #include #include #include FILE *fp;char cbuffer;char *key10=if,else,for,while,do
7、,return,break,continue,stdio.h,math.h;int atype,id=4;/char digittp20; /定义一个数字数组 char alphaprocess(char buffer);char digitprocess(char buffer);char otherprocess(char buffer);int search(char searchchar ,int wordtype);int main() if (fp=fopen(D:编译原理实验1.c,r)=NULL) /*只读方式打开一个文件if(p=fopen(H:Text.txt,r)=NUL
8、L)*/ printf(error); else cbuffer = fgetc(fp); /*fgetc( )函数:从磁盘文件读取一个字符*/ while (cbuffer!=EOF) if(cbuffer= |cbuffer=n|cbuffer=t) /*掠过空格和回车符和tab*/ cbuffer=fgetc(fp); else if(isalpha(cbuffer) /判断是字母 cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer)|cbuffer=.) /判断为数字 ,或者浮点数 cbuffer=digitprocess(c
9、buffer); else cbuffer=otherprocess(cbuffer); /判断其为其他类型 return 0;char alphaprocess(char buffer) int atype; /*保留字数组中的位置*/ int i=-1; char alphatp20; while (isalpha(buffer)|(isdigit(buffer)|buffer=_|buffer=.) /读到的是字母数字下划线 . alphatp+i=buffer; buffer=fgetc(fp); /*读一个完整的单词放入alphatp数组中*/ alphatpi+1=0; /单词读完
10、置上结束符号 atype=search(alphatp,1); /*对此单词调用search函数判断类型*/ if(atype!=0) /判断函数返回值不是0,是保留字,输出1 printf(%s , 1)n,alphatp,atype-1); id=1; /保留字 else printf(%s ,2)n,alphatp); id=2; /返回值是0,标识符,第二类 return(buffer);int search(char searchchar ,int wordtype) /*判断单词是保留字还是标识符*/ int i=0; int p; switch (wordtype) case 1
11、:for (i=0;i=9;i+) if (strcmp(keyi,searchchar)=0) p=i+1; break; /*是保留字则p为非0且不重复的整数*/ else p=0; /*不是保留字则用于返回的p=0*/return(p); char digitprocess(char buffer) /读入数字 int i=-1;char digittp20; /定义一个数字数组 while (isdigit(buffer)|buffer=.|buffer=e) /读入一个完整的数字放在isdigit数组中 digittp+i=buffer; buffer=fgetc(fp); digi
12、ttpi+1=0; /数组结束 printf(%s ,3)n,digittp); /输出数字为第三类 id=3;return(buffer); char otherprocess(char buffer) /判断为其他字符的函数 char ch20; /定义一个字符数组 char ch120; char ch220; int i=0; ch0=buffer; /除了以上两类其他都读入 ch1=0; if(ch0=,|ch0=;|ch0=|ch0=|ch0=(|ch0=) /读入 , ; ( )字符时直接输出为第五类 printf(%s ,5)n,ch); buffer=fgetc(fp); i
13、d=4; return(buffer); if(ch0=#) /#define,#include关键字,第一类 buffer=fgetc(fp); while (isalpha(buffer) /读到的是字母 ch+i=buffer; buffer=fgetc(fp); chi+1=0; /单词读完置上结束符号 printf(%s , 1)n,ch); id=1; return(buffer); if(ch0=_) /以下划线开头的第二类标识符 buffer=fgetc(fp); while (isalpha(buffer) /读到的是字母 ch+i=buffer; buffer=fgetc(
14、fp); chi+1=0; /单词读完置上结束符号 printf(%s , 2)n,ch); id=2; return(buffer); if(ch0=|ch0=&|ch0=!) if(ch0=!) printf(%s ,4)n,ch); buffer=fgetc(fp); id=4; return(buffer);elsebuffer=fgetc(fp);ch1=buffer;if(ch0=ch1)printf(%s ,4)n,ch); buffer=fgetc(fp); id=4; return(buffer);elsech1=0;printf(%s ,5)n,ch); buffer=fg
15、etc(fp); id=4; return(buffer); if(ch0=*|ch0=/) /读入 * 、时输出为第4类运算符 printf(%s ,4)n,ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0=|ch0=!|ch0=) /读入为 = ! 时,还要再判下一个读入的字符 buffer=fgetc(fp); / 再读入一个字符 if(buffer=) /如果下一个字符为= ch1=buffer; /把读到的字符加入数组ch ch2=0; printf(%s ,4)n,ch); /两个字符一起作为第4类运算符输出 else prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 指导书
限制150内