




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机科学与工程系编译原理课程设计实验报告姓名:_ *_ 学号_ *_ 年级专业及班级_08计算机科学与技术 成绩 实验名称词法分析程序设计与实现完成日期2011/4/12指导教师*实验目的:能够采用C编程语言实现简单的词法分析程序;设计、编制并调试一个词法分析程序,加深对词法分析原理的理解实验要求: 1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号; 3. 识别出的单词以<单词符号,种别码>的形式保存在符号表中(链表);4. 词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。实验内容:选择高级语言(C语言),编制
2、它的词法分析程序。词法分析程序的实现可以采用任何一种编程工具实验原理:1、算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号;2、其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 实验分析:(1)关键字:if else while do case int break等所有的关键字都是小写。(2)运算符和界符: = + - * / < <= <> > >= = ; ( ) 等(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = _ | letter (letter | digit)*NUM =
3、digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 (5)注释被忽略(6)各种单词符号对应的种别码(如下):单词符号种别码单词符号种别码auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27
4、volatile28do29while30static31if32a33b34f35n36t37v3839?4041”42043ddd44 xhh45数字46标识符47#48(49)505152535455*56:5758%5960+61?62=63|64&65!66<67>68>=69=70>>71!=72<<73&&74<=75|76+77?=78-79-80->81“82%A(A可为dsc)83;84_85/868788899091其他类别99实验流程图(由于流程图过大因此各部分分开写):整体:扫描注释:扫描数
5、字:扫描引号:扫描单词:扫描其他字符:实验环境:需要TC、VC+ 6.0等开发工具作为本次试验的环境。实验步骤:1、准备: 用TC、VC+等开发工具;2、对本实验的任务进行分析,确定实现功能的函数;3、写好程序,仔细修改函数;4、上机操作:输入源程序,修改、调试,运行。5、写好试验报告。实验调试过程及测试结果/*源代码*/#include<stdio.h>#include<stdlib.h>#include <ctype.h> #include<string.h>void main()FILE *fp,*fp1;int hanjsq=1;/行计数
6、器,保存行号int guanjz(char ch1);/关键字和标识符判断char ch,infile15,outfile15;/定义输入和输出文件名printf("*Enter the infile name*n");scanf("%s",infile);/输入需要扫描的文件名printf("*Enter the outfile name*n");scanf("%s",outfile);/输入需要另存为的文件名if(fp = fopen(infile,"r") = NULL)/打开需要扫描的文
7、件printf("cannot open filen");exit(0);if(fp1 = fopen(outfile,"w") = NULL)/打开需要存入的文件printf("cannot open filen");exit(0);printf("n*n");printf("* 开始进行词法分析 *n");printf("*n");printf("n*n");printf("行号字符串种别码n");printf("*n&q
8、uot;);fprintf(fp1,"*n");fprintf(fp1,"行号字符串种别码n");fprintf(fp1,"*n");while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*扫描头文件单词及保留字*/if(isalpha(ch) | ch='_')/如果第一个字符为字母或下划线则判断为标识符int i=0;char ch130;/假定每个标识符最长为ch1i+=ch;/将ch保存到ch10中并使i自加1while(!feof(fp)ch=fgetc(fp);if(c
9、h=10)hanjsq+;/如果ch为换行符,则行计数器自加1if(isalpha(ch) | isdigit(ch) | ch='_')/如果ch为字母、数字或下划线就把ch放到ch1i中并使i自加1ch1i+=ch;if(ch='.')/如果ch为小数点则判断是否为头文件 if(ch=fgetc(fp)='h')/如果小数点后一位为h则判定其为头文件if(ch=10)hanjsq+;ch1i+='.'ch1i+='h'ch1i='0'/把结束标志放到ch1i中作为单词结束标志printf(&qu
10、ot;line %d:%s83n",hanjsq,ch1);/以字符串形式输出ch1fprintf(fp1,"line %d:%s83n",hanjsq,ch1);break;else/如果小数点后一位不是h则判定其为标识符fseek(fp,-1,1);/fp回退1ch1i='0'/把结束标志放到ch1i中作为单词结束标志printf("line %d:%s%dn",hanjsq,ch1,guanjz(ch1);/以字符串形式输出ch1fprintf(fp1,"line %d:%s%dn",hanjsq,ch
11、1,guanjz(ch1);break;if(!isalpha(ch) && !isdigit(ch) && ch!='_' && ch!='.')/如果ch不为字母、数字、下划线和点时判断其为标识符ch1i='0'printf("line %d:%s%dn",hanjsq,ch1,guanjz(ch1);fprintf(fp1,"line %d:%s%dn",hanjsq,ch1,guanjz(ch1);break;/*扫描数字*/if(isdigit(ch
12、) | ch='-')/如果ch为数字或'-'if(isdigit(ch)/如果ch为数字printf("line %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否则视为数字结束pri
13、ntf("46n");fprintf(fp1,"46n");fseek(fp,-1,1);/回退一位ch='0'/置ch为0,以免影响下面误判并顺利退出扫描数字break;if(ch='-')/如果ch为'-'ch=fgetc(fp);/预读一位if(ch='-')/如果ch还是为'-'则判断为自减符'-'printf("line %d:-80n",hanjsq);fprintf(fp1,"line %d:-80n",h
14、anjsq);if(ch='>')/如果ch为'>',则判断为结构体运算符'->'printf("line %d:->81n",hanjsq);fprintf(fp1,"line %d:->81n",hanjsq);if(isdigit(ch)/如果ch为数字则可能为减号或负号fseek(fp,-3,1);/回退3为判断ch=fgetc(fp);if(isdigit(ch)/如果ch为数字则判断'-'为减号 ch=fgetc(fp);printf("l
15、ine %d:%c79n",hanjsq,ch);fprintf(fp1,"line %d:%c79n",hanjsq,ch);else /否则判断'-'为负号ch=fgetc(fp);printf("line %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch='.')printf("%c&qu
16、ot;,ch);fprintf(fp1,"%c",ch);else/否则视为数字结束printf("46n");fprintf(fp1,"46n");fseek(fp,-1,1);/回退1break;/*扫描注释*/if(ch='/')/如果ch为'/'则可能为注释ch=fgetc(fp);/读下一个字符if(ch=10)hanjsq+;if(ch='/')/如果该字符也为'/'则判断为注释一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/
17、直到遇到换行符出现才认为注释结束if(ch='*')/如果该字符为'*'则判断为注释多行/直到出现'*/'才认为注释结束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch='*')/出现'*'/且接着出现'/'if(ch=fgetc(fp)='/')break;else/否则原样输出'/'printf("line %d:/83n",hanjsq);fprintf(fp1,"line %d:
18、/83n",hanjsq);fseek(fp,-1,1);/回退1break;/*扫描引号*/if(ch='"')/出现引号int i=0;printf("line %d:%c82n",hanjsq,ch);fprintf(fp1,"line %d:%c82n",hanjsq,ch);printf("line %d:",hanjsq);fprintf(fp1,"line %d:",hanjsq);while(!feof(fp)/先整体输出引号内所有字符并定为第99类ch=fget
19、c(fp);i+;/用于积累回退长度if(ch=10)hanjsq+;if(ch!='"')if(ch!=32)printf("%c",ch);fprintf(fp1,"%c",ch);else break;printf("99n");fprintf(fp1,"99n");fseek(fp,-i,1);/回退到引号开始for(;i>0;i-)ch=fgetc(fp);if(ch=92)/如果ch为''则可能为转义字符char ch513="abfntv?
20、39;"0"/转义字符集ch=fgetc(fp);/预读一位for(int k=0;k<12;k+)/如果为转义字符则输出if(ch=ch5k)printf("line %d:%c%dn",hanjsq,ch,k+33);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,k+33);if(ch='d' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/任意字符转换为三位八进制 fseek(fp,-2,1);printf(&
21、quot;line %d:%c%c44n",hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,"line %d:%c%c44n",hanjsq,fgetc(fp),fgetc(fp);if(ch='x' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/任意字符转换为二位十六进制 fseek(fp,-2,1);printf("line %d:%c%c45n",hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,
22、"line %d:%c%c45n",hanjsq,fgetc(fp),fgetc(fp);if(ch='%')/如果为'%'则可能为%s%c%dch=fgetc(fp);char bfh4="dcs"for(i=0;i<3;i+)if(bfhi=ch)printf("line %d:%c83n",hanjsq,ch);fprintf(fp1,"line %d:%c83n",hanjsq,ch);/*扫描其他符号*/if(!isdigit(ch) && !isal
23、pha(ch) && ch!='_' && ch!='"' && ch!='/')char ch214="#()'*:%"/定义部分单符号集char ch39="+?=|&!<>"/定义部分单符号或双符号(前半部分)集char ch49="+=|&="/定义部分双符号(后半部分)for(int i=0;i<13;i+)/判断单个符号if(ch=ch2i)printf("line
24、%d:%c%dn",hanjsq,ch,i+48);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,i+48);for(int j=0;j<8;j+)/判断双符号if(ch=ch3j)/如果ch与ch3中第j个字符匹配ch=fgetc(fp);/预读一位/if(ch=10)hanjsq+;if(ch=ch4j)/且ch与ch4第j个匹配,则表示ch3j与ch4j连起来为一个双符号printf("line %d:%c%c%dn",hanjsq,ch3j,ch4j,i+69);fprintf(fp1,"l
25、ine %d:%c%c%dn",hanjsq,ch3j,ch4j,i+69);if(ch='<' && ch3j='<')/判断'<<'符printf("line %d:<<77n",hanjsq);fprintf(fp1,"line %d:<<77n",hanjsq);if(ch='>' && ch3j='>')/判断'>>'符printf(&q
26、uot;line %d:>>78n",hanjsq);fprintf(fp1,"line %d:>>78n",hanjsq);else/否则表示ch3j为单符号,不是双符号的一部分printf("line %d:%c%dn",hanjsq,ch3j,j+61);fprintf(fp1,"line %d:%c%dn",hanjsq,ch3j,j+61);fseek(fp,-1,1);/*/printf("*n");printf("* 词法分析结束 *n");printf("* 分析结果保存在文件%s中 *n",outfile);printf("* 欢迎下次使用,谢谢! *n");printf("*n");fprintf(fp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 统编版语文5年级下册全册教学课件(2025年2月修订)
- 专题5 日益重要的国际组织-分述 综合练习
- 嵌入式系统边缘安全威胁分析-洞察阐释
- 2024年台州临海市机关事业单位招聘真题
- 《总有一天会长大》测试题及答案
- 西藏自治区烟草专卖局(公司)真题2024
- 供应商准入资格评估表模板
- 2025年资本论阅读检测试题
- 绪言 化学使世界变得更加绚丽多彩-人教版九年级《化学》上册教学课件
- 基于大数据的社区嵌入式服务设施智能化建设
- GB/T 15968-2008遥感影像平面图制作规范
- GB/T 12467.2-2009金属材料熔焊质量要求第2部分:完整质量要求
- 国家开放大学电大《工程经济与管理》考题及答案
- Unit 4 Developing Ideas 读后续写初探公开课课件 【教材精讲精研】 高中英语外研版(2019)必修第一册
- 智能楼宇管理员(四级)理论考试(重点)题库(含答案)
- 国开期末考试《城市管理学》机考试题及答案(第13套)
- 内蒙古乌海市基本气象特征
- 脉冲编码调制与解调实验报告
- 人教版五年级下册数学找次品表格式教案设计
- 职业安全健康现场检查记录表参考范本
- 《工程勘察设计收费管理规定》计价格【2002】10号(废止)
评论
0/150
提交评论