昆明理工大学信息工程与自动化学院学生实验报告
( 2012 —2013 学年 第 1 学期 )
课程名称:编译原理 开课实验室: 信自楼44 年月 日 年级、专业、班 实验项目名称 教师评学号 姓名 成绩 简单样本语言的词法分析器 A.了解□ A.强 □ A.达到□ A.规范□ A.详细□ 指导教师 李亚 C.不了解□ C.差 □ C.未达到□ C.不规范□ C.没有 □ 该同学是否了解实验原理: 该同学的实验能力: 该同学的实验是否达到要求: 实验报告是否规范: 实验过程是否详细记录: B.基本了解□ B.中等 □ B.基本达到□ B.基本规范□ B.一般 □ 语 教师签名: 年 月 日
一、实验目的及内容
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
WINDOWS下的VISUAL C++6.0;
四、实验方法、步骤(或:程序代码或操作过程)
#include
-1-
#define MAX 22 char ch =' ';
string key[15]={\\int Iskey(string c){ //关键字判断 int i;
for(i=0;i if(key[i].compare(c)==0) return 1; } return 0; } int IsLetter(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsDigit(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } void analyse(FILE *fpin){ string arr=\ while((ch=fgetc(fpin))!=EOF) { arr=\ if(ch==' '||ch=='\\t'||ch=='\\n'){} else if(IsLetter(ch)){ while(IsLetter(ch)||IsDigit(ch)) { if((ch<='Z')&&(ch>='A')) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)){cout< else if(IsDigit(ch)){ while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){ arr=arr+ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); cout< else switch(ch){ case'+': -2- case'-' : case'*' : case'=' : case'/' :cout< case']' : case';' : case'.' : case',' : case'{' : case'}' :cout< if(ch=='=') cout<<\运算符\ else {cout<<\运算符\ fseek(fpin,-1L,SEEK_CUR);} }break; case'>' :{ch=fgetc(fpin); if(ch=='=') cout<<\运算符\ if(ch=='>')cout<<\输入控制符\ else {cout<<\运算符\ fseek(fpin,-1L,SEEK_CUR);} }break; case'<' :{ch=fgetc(fpin); if(ch=='=')cout<<\运算符\ else if(ch=='<')cout<<\输出控制符\ else if(ch=='>') cout<<\运算符\ else{cout<<\运算符\ fseek(fpin,-1L,SEEK_CUR);} }break; default : cout< void main(){ char in_fn[30]; FILE * fpin; cout<<\请输入源文件名(包括路径和后缀名):\ for(;;){ cin>>in_fn; if((fpin=fopen(in_fn,\ else cout<<\文件路径错误!请输入源文件名(包括路径和后缀名):\ } cout<<\分析如下*********************\ analyse(fpin); -3- fclose(fpin); } 五、实验过程原始记录( 测试数据、图表、计算等) 源程序为: # include double r,s,h,v; printf(\ scanf(\ s=3.1415926*r*r; v=s*h; printf(\ return 0; } -4- -5- 六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获) 词法分析器主要特点是不依靠语法,而只依靠词法,即处理一个单词时不依赖于外部单词的信息,因此词法分析器一般都很简单。语法分析时,调用词法分析器,根据已知文法利用递归向下分析,检查语法错误。在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。这次实验刚开始我的时候我是对照课本先把代码输入,编译的时候只有很少的错误,很快我就把错误修改正确,在连接的时候,有错误,我还没讲要分析的文件名写入,写入后运行正确。这从实验学到了很多知识,对词法分析器有了很多了解。 注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。 -6-