词法分析器的构造-南邮201编译原理试验一报告_第1页
词法分析器的构造-南邮201编译原理试验一报告_第2页
词法分析器的构造-南邮201编译原理试验一报告_第3页
词法分析器的构造-南邮201编译原理试验一报告_第4页
词法分析器的构造-南邮201编译原理试验一报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、实验报告(2015 / 2016学年第二学期)课程名称编译原理实验名称词法分析器的构造实验时间2016年 4 月 29 日指导单位计算机软件教学中心指导教师学生姓名学院(系)wujun计算机学院、软件学院班级学号专 业计算机科学与技术实验报告实验名称词法分析器的构造指导教师实验类型设计实验学时4实验时间2016429一、实验目的和要求1、实验目的:设计、编制、调试一个词法分析程序,对单词进行识别和编码,加 深对词法分析原理的理解。2、实验要求:1)、允许用户自己输入源程序并保存为文件;2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格 等);3)、能够将该源程序中所有的单词根据其所属

2、类型(整数、保留字、运算符、标识符等。定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:识别保留字:if、int、for、while、do、return、 break、continue等,其他的都识别为标识符;常数为无符号整形数; 运算符包括:+、-、*、/、=、=、=、!=等;分隔符包括:,、;、 、(、)等;4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。文本内谷为待分析的类 C语言程序。(5,')')-5 -、实验环境(实验设备)硬件:计算机软件:Visual C +6.0二、实验原理及内容1、实验内容:设计并实现一个词法分析器,实现对指

3、定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实 现简单的词法分析操作。例如下面为一段C语言源程序:mai n()int a,b;a = 10;b = a + 20;要求输出如下:(2,' main')(5,'(')(5,')')(5,')')(5,')')(5(1(2(5(2(5(2(4(3(5(2(4(2(4(3(5(52、,''),'int '),'a'),','),'b'),'

4、;;'),'a'),'='),'10'),';'),'b'),'='),'a'),'+'),'20'),';'),'')实验原理状态转换图3、实验代码:实验代码:#i nclude <stri ng.h>#in elude <iostream.h>#in elude <fstream>#in clude<stdlib.h>#i nclude<stdio.h&g

5、t;#in clude<ctype.h>struct Char /创建一个结构用于存贮关键字char a15;;typedef struct Char CH;/定义关键字CH keyWord67="auto","break","case","cout","cin","char","const","continue","d efault", "do","double"

6、,"else","e num","e ndl","extern","float","for","goto","if","mai n", "in clude","i nt","lo ng","register","return","short","sig ned","si

7、zeof","static","string","struct","switch","typed ef","union","unsigned","void","stdio","whil e","ci n"."cout"."catch","calss"."ctype"."stdli

8、b"."fstream"."export"."iostream","false","friend","inline","mutabl e","namespace","new","operator","private", "protected","public","static_cast","temp

9、late","this","throw","true","try", "type name","usi ng","virtual","asm"/检测是否为数字,是返回true ,否则返回falsebool lsDigit(char A) if(A>='0' && A<=9) return true;elsereturn false;/检测是否为字符,是则返回true,否则返回fals

10、ebool IsLetter(char ch)if(ch>=' A'&&ch<='Z') | (ch>='a'&&ch<='z')return true;return false;/检测是否为分隔符,是则返回true,否则返回falsebool IsSeparator(char ch)if(ch ='('|ch=')'|ch =''|ch =''|ch=''|ch=','|ch=&

11、#39;.'| ch=':'|ch=Y'|ch='"'|ch=''|ch=T|ch=#|ch='_') return true;return false;/检测是否为关键字,是则返回true,否则返回falsebool lsKeyWord(char *a)int i = 0;for(i; i < 67; i+)if (strcmp(a,keyWordi.a) = 0)return true;return false;/预处理去掉注释、换行、空格等void Sca nn er(char s,char

12、a)int i = 0,j = 0,k = strle n(s);for (i; i < k; i +)if (si = '/' && si+1 ='/')dowhil e(si != 'n');i-;else if (si = '/' && si+1 = '*') doi+;whil e(si != '/' | si-1!= '*');con ti nue;else if (si = 't' | si = 'n'

13、 | si = '?')aj+='';elseaj+ = si;"<<e ndl;:"<<e ndl;coutvv"n系统经过预处理后的输出(去掉注释和换行): cout<<a<<"nn"coutvv"系统经过预处理后的输出(去掉注释、换行、空格等)for (i = 0;i < strl en(a); i+)if(ai='') con ti nue;elsecout<<ai;cout«e ndl«e n

14、dl«e ndl;void Handle(char s)/ 词法分析char ch;for (int j = 0; j < strl en(s); j+)char word20 = '0'int i = 0;ch = sj;if (ch ='')con ti nue;else if (lsLetter(ch) dowordi+ = ch; ch = s+j;whil e(IsLetter(ch)| lsDigit(ch)|ch='_'); j-;wordi = '0'if(lsKeyWord(word)cout&l

15、t;<"(1,'"<<word<<"')"<<e ndl;else-7 -cout<v"(2,'"vvwordvv"')"vve ndl;else if(lsDigit(ch)dowordi+ = ch; ch = s+j;whil e(IsDigit(ch);j-;wordi = '0'cout<<"(3,'"<<word<<"')&qu

16、ot;<<e ndl;else if(lsSeparator(ch)word0 = ch;cout<<"(5,'"<<word<<"')"<<e ndl;elseword0 = ch;if(word0='+'|word0='-'|word0='>'|word0='v'| word0='&'|word0='|') if(sj+1=word0 | sj+1='=

17、9;)word1 = s+j; cout<v"(4,'"vvwordvv"')"vve ndl; elsecout<v"(4,'"vvwordvv"')"vve ndl;else if(word0='='|word0='*'|word0='/'| word0='!'|word0='%'|word0=z) if (sj+1 = '=')word1 = s+j; cout<v

18、"(4,'"vvwordvv"')"vve ndl; elsecout<v"(4,'"vvwordvv"')"vve ndl;else if (word0 = '')if (sj+1 = 'n' |sj+1 = 't' | sj+i=''|sj+1='0') word1 = s+j; cout<v"(4,'"vvwordvv"')"vve

19、 ndl; elsecout<v"(4,'"vvwordvv"')"vve ndl;Uelsecout<<"(无法识别字符,'"<<word<<"')"<<endl; cout«"n"int mai n()int i;char b = 32,ch;FILE *fp;doi = 0;char s10000;char a10000 = '0'fp=fope n("cod e.tx

20、t","rb+"); if(fp=NULL) cout<<"Ca n not create file"<<e ndl; exit(0);fseek(fp,0,2);cout<<"Please in put you code(e nd with two'?'):"«e ndl; do ch = getchar(); si+ = ch;if(ch = 'n' | ch= 't') for (i nt j =0; j < 4;j+)

21、 fputc(b,fp);fputc(ch,fp);while(si-1 != '?' | si-2 != '?');si = '0'Scann er(s,a);cout«"词法分析如下:"<<e ndl;Han dle(a); fclose(fp);whil e(true);return 0;4、实验测试和截图(1)、测试一截图-9 -输入代码:Please input you code 'ieoid wi th two T7 ): int mainO(int辺,b;/定义abd += 10.b

22、 - a十12.舛求b的值*/return 0;?输出结果:系统经HfOl理后的输出(去掉注释和换行): int mainO int a,b; a +- 10; b - a + 12; return 0;.系统经ii预处理冶的输岀去掉注释、换行、空格等):intminO in坦 b; a+=10 ; b-a +12 ! returnO !词袪分析如下:(1,J int')(1,J mair?) (5,J C ) (和门 (5/ f ) (1; int1 ) ;) (2f' b') E ;) 伦J a ) (4,7 匸) (3,' 10') :1、 'b1 ) (4,,J、 (2/) (4,1 匸) <3,'挖)(1, ? return7 ) (3,' 0 ) (5/ r) (5, 丁)(2)测试二截图输入代码:Please input you code (end with two* ?'): do ch = getchar(J ;si+ - ch;if(ch = 1 n |I ch= 3) for (int j =0; j < 4;j+) fputc (b, fp);fputc(ch, ip);用Mle(si-l

温馨提示

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

评论

0/150

提交评论