简单的词法分析器设计_第1页
简单的词法分析器设计_第2页
简单的词法分析器设计_第3页
简单的词法分析器设计_第4页
简单的词法分析器设计_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理课 程 设 计院 系 专 业 年 级 11级 学 号 姓 名 2014年 05月实验一 简单的词法分析器设计一、设计内容 熟悉并实现一个简单的词法分析器二、设计目的 了解高级语言单词的分类,了解如何识别单词规则,掌握状态图到识别程序的编程。源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。三、实验步骤1.将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。(2)常数:各种类型的常数。(3) 保留字(关键字):

2、如if、begin、then、while、do等。(4) 运算符:如+、-、*、<、>、=等。(5)界符:如逗号、分号、括号等。2.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。3.可选择性地将结果保存到文件中。四、概要设计1待分析的简单语言的词法(1)关键字:while do relop letter id number所有关键字都是小写。(2)运算符和界符:: = + * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式

3、定义: 如课本P20例2.6空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2词法分析器的结构源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序调用数据返回单词图6.1 词法分析器的结构 3部分单词的正规式与状态转换图图6.2部分单词的状态转换图 4功能模块表6.2 词法分析器的C#程序过程或函数功能表过程或函数名简要功能说明void scaner()分析源程序得到单个单词并大致区分其类型,并生成二元组void main( )输入源程序五、详细设计1流程图开始输入C语言源程序初始化source逐个遍历字符,并去除空格

4、符State 为0进入switch分支循环判断根据state的值选择适当的处理调用相关函数输出处理结果开始 图7.1程序总体流程图六、编程调试1.源代码#include"stdio.h"#include"string.h"#include"iostream.h"char prog100,token20;char ch;int syn,p,m=0,n,row,sum=0;char *rwtab6="while","do","relop","letter",&

5、quot;id","number" void scaner()for(n=0;n<8;n+) tokenn=NULL;ch=progp+;while(ch=' ')ch=progp;p+;if(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')m=0;while(ch>='0'&&ch<='9')|(ch>='a'&

6、;&ch<='z')|(ch>='A'&&ch<='Z')tokenm+=ch;ch=progp+;tokenm+='0'p-;syn=10;for(n=0;n<6;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break;else if(ch>='0'&&ch<='9')sum=0;while(ch>='0'&&ch<='9')sum=

7、sum*10+ch-'0'ch=progp+;p-;syn=11;if(sum>32767)syn=-1;else switch(ch)case'<':m=0;tokenm+=ch;ch=progp+;if(ch='>')syn=21;tokenm+=ch;else if(ch='=')syn=22;tokenm+=ch;elsesyn=23;p-;break;case'>':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=24;tokenm+=

8、ch;elsesyn=20;p-;break;case':':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=18;tokenm+=ch;elsesyn=17;p-;break;case'*':syn=13;token0=ch;break;case'/':syn=14;token0=ch;break;case'+':syn=15;token0=ch;break;case'-':syn=16;token0=ch;break;case'=':syn=25;t

9、oken0=ch;break;case'':syn=26;token0=ch;break;case'(':syn=27;token0=ch;break;case')':syn=28;token0=ch;break;case'#':syn=0;token0=ch;break;case'n':syn=-2;break;default: syn=-1;break;void main()p=0;row=1;cout<<"请输入字符串(字符#是字符串输入结束标志):"<<endl;

10、docin.get(ch);progp+=ch;while(ch!='#');cout<<"字符串输出结果为:"<<endl;p=0;doscaner();switch(syn)case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break; case -1: cout<<"Error in row "<<row<<"!"<<endl; break;case -2: row=row+;break; default: cout<<"("<<syn<<","<<token<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论