编译原理实验

上传人:大米 文档编号:490370733 上传时间:2022-09-25 格式:DOC 页数:31 大小:886.50KB
返回 下载 相关 举报
编译原理实验_第1页
第1页 / 共31页
编译原理实验_第2页
第2页 / 共31页
编译原理实验_第3页
第3页 / 共31页
编译原理实验_第4页
第4页 / 共31页
编译原理实验_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《编译原理实验》由会员分享,可在线阅读,更多相关《编译原理实验(31页珍藏版)》请在金锄头文库上搜索。

1、实验一 词法分析一、 实验目的编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、 实验题目如源程序为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

2、”) (5,”(”) (2,”a”)(4,”=”) (2,”b”) (5,”)”)(2,”j”) (4,”=”) (2,”a”)(4,”-”) (2,”b”) (5,”;”)(1,”else”) (2,”j”) (4,”=”)(2,”b”) (4,”-”) (2,”a”)(5,”;”) (5,”)三、 实验理论依据(一)识别各种单词符号程序语言的单词符号一般分为五种:关键字(保留字/ 基本字)if 、while 、begin标识符:常量名、变量名常数:34 、56.78 、true 、a 、运算符:+ 、- 、* 、/ 、 、and 、or 、.界限符:, ; ( ) /*识别单词:掌握单词的

3、构成规则很重要 标识符的识别:字母| 下划线+( 字母/ 数字/ 下划线)关键字的识别:与标识符相同,最后查表 常数的识别 界符和算符的识别 大多数程序设计语言的单词符号都可以用转换图来识别,如图1-1 图1-1词法分析器输出的单词符号常常表示为二元式:(单词种别,单词符号的属性值)单词种别通常用整数编码,如1 代表关键字,2 代表标识符等 关键字可视其全体为一种,也可以一字一种。采用一字一种得分法实际处理起来较为方便。 标识符一般统归为一种 常数按类型(整、实、布尔等)分种 运算符可采用一符一种的方法。 界符一般一符一种的分法。 (二)超前搜索方法词法分析时,常常会用到超前搜索方法。如当前待

4、分析字符串为“a+” ,当前字符为“” ,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢? 显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符+ ,这时可知应将 解释为大于运算符。但此时,超前读了一个字符+ ,所以要回退一个字符,词法分析器才能正常运行。又比如:+ 分析为正号还是加法符号 (三)预处理预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。由一个预处理子程序来完成。四、 词法分析器的设计1、 设计方法:2、 写出该语言的词法规则。 3、 把词法规则转换为相应的状态转换图。 4、 把各转换图的初态连在一起,构成识别该语言

5、的自动机 5、 设计扫描器 6、 把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。 7、 扫描器从初态出发,当识别一个单词后便进入终态,送出二元式 开始读标识符是字母掠过空格和回车符查保留字表是否查到换成属性字结束是数字是特殊符号error取数换成属性字换成属性字换成属性字YNYYYNNN图1-2 取单词程序框图五、 程序代码#include #include FILE *fp;char cbuffer;char *key8=if,else,for,while,do,return,break,continue;int atype,id=4;int isalpha( ch

6、ar c) if(c=a)|(c=A) return 1; else return 0;int isdigit(char c) if(c=0&c=9) return 1; else return 0;int search(char searchchar ,int wordtype) /*判断单词是保留字还是标识符*/ int i=0; int p; switch (wordtype) case 1:for (i=0;i=7;i+) if (strcmp(keyi,searchchar)=0) p=i+1; break; /*是保留字则p为非0且不重复的整数*/ else p=0; /*不是保留

7、字则用于返回的p=0*/return(p); char alphaprocess(char buffer) int atype; /*保留字数组中的位置*/ int i=-1; char alphatp20; while (isalpha(buffer)|(isdigit(buffer)|buffer=_) alphatp+i=buffer; buffer=fgetc(fp); /*读一个完整的单词放入alphatp数组中*/ alphatpi+1=0; atype=search(alphatp,1);/*对此单词调用search函数判断类型*/ if(atype!=0) printf(%d,

8、%s)n,atype-1,alphatp); id=1; else printf(2,%s)n,alphatp); id=2; return (buffer);char digitprocess(char buffer) int i=-1;char digittp20;while (isdigit(buffer)|buffer=.) /*1 判断小数*/ digittp+i=buffer; buffer=fgetc(fp); digittpi+1=0;printf(3,%s)n,digittp);id=3;return(buffer); char otherprocess(char buffe

9、r) char ch20; ch0=buffer; ch1=0; if(ch0=,|ch0=;|ch0=|ch0=|ch0=(|ch0=) printf(5,%s)n,ch); buffer=fgetc(fp); id=5; return(buffer); if(ch0=/) buffer=fgetc(fp); if(buffer=*) /*2 区分注释符号和除号*/ ch1=buffer; buffer=fgetc(fp); while(buffer!=*) buffer=fgetc(fp); ch2=buffer; buffer=fgetc(fp); if(buffer=/) ch3=bu

10、ffer; ch4=0; printf(5,%s)n,ch); else printf(4,%s)n,ch); id=4; return(buffer); buffer=fgetc(fp); id=5; return(buffer); if(ch0=*) printf(4,%s)n,ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0=|ch0=!|ch0=) buffer=fgetc(fp); if(buffer=) ch1=buffer; ch2=0; printf(4,%s)n,ch); else printf(4,%s)n,ch); id=4; return(buffer);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号