logo资料库

扫描器的设计(实验报告+代码+运行结果) 编译方法.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
编译方法实验报告 姓 班 名 级 实 验 名 称 开 设 学 期 实 验 时 间 评 定 成 绩 学 号 指 导 教 师 扫描器的设计 2 0 1 0 - 2 0 1 1 第 一 学 期 第 1 6 周 评 定 人 签 字 评 定 日 期 东北大学软件学院 2010 年 12 月
一、 实验目的: 熟悉并实现一个扫描器(词法分析程序)。 二、 实验内容: (1) 设计扫描器的有限自动机(识别器); (2) 设计翻译、生成 Token 的算法(翻译器); (3) 编写代码并上机调试运行通过。 ·输入——源程序文件或源程序字符串; ·输出——相应的 Token 序列; 关键字表和界符表; 符号表和常数表; 三、 实验原理: 1. 有限自动机原理:用计算机完成有限自动机的功能,其核心是“变换” 的实现技术。这里介绍的是把变换表按某种方式存贮起来,作为知识 源,实现机制是:控制程序+变换表。变换表的存贮结构有二维数组, 下标是: (状态,输入符号),还有一种存储方式是:压缩变换表:方法是把 每个状态行作为子表,状态为索引,并把错误的输入符号合并在一 起。 2. 词法分析器原理: (1)识别器 --- 识别单词的有限自动机 (2)翻译器 --- 根据有限自动机所识别出的对象,完成从单词串到单 词的 TOKEN 串的翻译。 四、 数据结构设计: char *key[]={"program","begin","end","var","while","do","repeat", /*关键字*/ "until","for","to","if","then","else"}; char*limit[]={";",":","(",")",",",":=","+","-","*","/",">",">=","==","<","<="}; /*运算、限界符*/ fstream outfile;//文件 int search(char *buf,int type,int command)//查找,相当于识别器 void scanner()//扫描,相当于扫描器 五、 关键代码分析(带注释)及运行结果: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0;
char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch>='0'&&ch<='9')) { { sum=0; while((ch>='0'&&ch<='9'))
{ } sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=11; if(sum>32767) syn=-1; } else switch(ch) { case'<':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } else if(ch=='=') { syn=22; token[m++]=ch; } else { syn=23; p--; } break; case'>':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') {
syn=24; token[m++]=ch; } else { syn=20; p--; } break; case':':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p--; } break; case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break; case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\n':syn=-2;break; default: syn=-1;break; }
} void main() { p=0; row=1; cout<<"Please input string:"<0 then x:=2*x+1/3; end#
2 有的 while、do 以及判断错误语句): Begin x<=$; while a<0 do b<>9-x; end # 输出结果
六、 实验思考题: (1) 扫描器的任务是什么? 答:词法分析程序又称扫描器,任务有: 识别单词——从用户的源程序中把单词分离出来; 翻译单词——把单词转换成机内表示,便于后续处理。 (2) 扫描器、识别器、翻译器三者之间的关系是怎样的? 答:扫描器、识别器、翻译器三者之间的关系是: 扫描器的实现要通过识别器和翻译器 (3) 为什么说有限自动机是词法分析的基础? 答:因为词法分析的包括:识别--- 识别单词的有限自动机。 和翻译--- 根据有限自动机所识别出的对象,完成从单词串到单 词的 TOKEN 串的翻译。我们可以看出,不论是识别还是分析, 都是应用有限自动机,所以可以说有限自动机是词法分析的基 础。
分享到:
收藏