实验1 词法分析 (2)new_第1页
实验1 词法分析 (2)new_第2页
实验1 词法分析 (2)new_第3页
实验1 词法分析 (2)new_第4页
实验1 词法分析 (2)new_第5页
全文预览已结束

下载本文档

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

文档简介

1、河南工业大学实验报告课程名称 编译原理 _ 实验项目 实验一 词法分 计_姓 名_ 学 号_ 指导老师 日 期 2012.4.22 批改日期 成 绩 一. 实验目的1 深入理解有限自动机及其应用2 掌握根据语言的词法规则构造识别其单词的有限自动机的方法3基本掌握词法分析程序的开发。二. 实验内容及要求编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)(具体参照实验指导中的要求)三. 实验过程对于这个实验,总共用了五个函数,

2、即主函数、分三种情况取单词、对取到的单词进行分类。主要完成的功能是从缓冲区中识别出一个个单词,并能够区分所取的单词是什么类型。1)首先定义一系列数组来保存不同类的单词:char *key8=if,else,for,while,do,return,break,continue; /保留字char *border6=,;,(,); /分隔符char *arithmetic4=+,-,*,/; /算术运算符char *relation6=,=,; /关系运算符char *consts20; /常数char *label20; /标识符2)取词分类模块:int search(char searchch

3、ar,int wordtype)/对取的单词进行分类 int i=0; switch (wordtype) case 1:for (i=0;i=7;i+)/如果是保留字 if (strcmp(keyi,searchchar)=0) return(i+1); return(0); case 2:for (i=0;i=5;i+)/如果是分隔符 if (strcmp(borderi,searchchar)=0) return(i+1); return(0); case 3:for (i=0;i=3;i+)/如果是算术运算符 if (strcmp(arithmetici,searchchar)=0)

4、return(i+1); return(0); case 4:for (i=0;i=5;i+)/如果是关系运算符 if (strcmp(relationi,searchchar)=0) return(i+1); return(0); case 5:for (i=0;iconstnum;i+)/如果是常数 if (strcmp(constsi,searchchar)=0) return(i+1); i+;/现有的常数数组没有取到的常数 constsi-1=(char *)malloc(sizeof(searchchar); strcpy(constsi-1,searchchar);/添加新的常数

5、到常数数组 constnum+; return(i); case 6:for (i=0;ilabelnum;i+)/如果是标识符 if (strcmp(labeli,searchchar)=0) return(i+1); i+;/现有的标识符数组没有取到的标识符 labeli-1=(char *)malloc(sizeof(searchchar); strcpy(labeli-1,searchchar);/添加新的标识符到标识符数组 labelnum+; return(i); 3)取得字符不同进行不同的处理,这里以取得非字母数字字符模块为例,该模块比较复杂有一定的代表性:char otherp

6、rocess(char buffer)/取到其他字符时,要进行的处理 int i=-1; char othertp20; int otype,otypetp; othertp0=buffer; othertp1=0; if (otype=search(othertp,3)/判断是否为算术运算符 printf(%s (3,%d)n,othertp,otype-1); buffer=fgetc(fp);/取下个字符 goto out; if (otype=search(othertp,4)/判断是否为关系运算符 buffer=fgetc(fp); othertp1=buffer; othertp2

7、=0; if (otypetp=search(othertp,4)/判断结合下个字符是否为关系运算符 printf(%s (4,%d)n,othertp,otypetp-1); buffer=fgetc(fp); /修改部分 goto out; else othertp1=0; printf(%s (4,%d)n,othertp,otype-1); goto out; else if (otype=search(othertp,2)/判断是否为分隔符 printf(%s (2,%d)n,othertp,otype-1); buffer=fgetc(fp); goto out; if (buff

8、er!=n)&(buffer!= )/不能识别的字符 printf(%c error,not a wordn,buffer); buffer=fgetc(fp);out: return(buffer);/返回下个字符4)主函数,测试模块:void main()/主函数,测试程序 int i; for (i=0;i=20;i+) labeli=NULL; constsi=NULL; ; if (fp=fopen(example.c,r)=NULL) printf(error); elsecbuffer = fgetc(fp);while (cbuffer!=EOF)/进入循环,取字符 if (i

9、salpha(cbuffer)/如果是字母 cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer)/如果是数字 cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer);/其他字符 printf(overn);/ getchar(); 5)读取程序截图:读取的程序代码如下:main()int a,b;a = 10; b = a + 20;四. 实验总结(心得)通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相

温馨提示

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

评论

0/150

提交评论