ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:127.82KB ,
资源ID:9980138      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9980138.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验报告词法分析器内含源代码.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验报告词法分析器内含源代码.docx

1、编译原理实验报告词法分析器内含源代码编译原理实验(一)词法分析器一 实验描述运行环境:vc+2008对某特定语言A ,构造其词法规则。该语言的单词符号包括:1该程序能识别的单词符号及类别说明表单词类别PROGRAM0NOT1BEGIN2IF3END 4THEN5VAR6ELSE7INT8WHILE9AND10DO11OR 12标识符13常数14+15-16(17)18,19;20=2123*24*25=26=27!=282状态转换图3程序流程: 词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。二 实验目的通过动手实践,使学生对构

2、造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。三 实验任务 编制程序实现要求的功能,并能完成对测试样例程序的分析。四 实验原理char set1000,str500,strtaken20;/set存储代码,strtaken存储当前字符char sign5010,constant5010;/存储标识符和常量定义了一个Analyzer类class Analyzerpublic:Analyzer(); /构造函数 Analyzer(); /析构函数 int IsLetter(cha

3、r ch); /判断是否是字母,是则返回 1,否则返回 0。 int IsDigit(char ch); /判断是否为数字,是则返回 1,否则返回 0。void GetChar(char *ch); /将下一个输入字符读到ch中。void GetBC(char *ch); /检查ch中的字符是否为空白,若是,则调用GetChar直至ch进入一个非空白字符。void Concat(char *strTaken, char *ch); /将ch中的字符连接到strToken之后。int Reserve(char *strTaken); /对strTaken中的字符串查找保留字表,若是一个保留字返回

4、它的数码,否则返回0。void Retract(char *ch) ; /将搜索指针器回调一个字符位置,将ch置为空白字符。void input();/向存放输入结果的字符数组输入一句语句。void display();/输出一些程序结束字符显示样式int analyzerSubFun();/词法分析器子程序,为了实现词法分析的主要功能。五 代码实现 / cifa.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include stdio.h#include string.h#include iostreamusing namespace std;char set

5、1000,str500,strtaken20;/set存储代码,strtaken存储当前字符char sign5010,constant5010;/存储标识符和常量/int Words50010;char ch;/当前读入字符int sr,to=0;/数组str, strtaken 的指针int st=0,dcount=0;int id=0;static int line=1;int h,l;typedef struct Words /*放置二元组*/ int num; char letters20;DS; DS Words500; typedef struct words char word

6、20; int type;WORDS;WORDS words= program,0, not,1, begin,2, end,3, if,4, then,5, var,6, else,7, int,8, while,9, and,10, do,11, or,12, +,15, -,16, (,17, ),18, ,19, ;,20, =,21, ,23, *,24, *,25, =,26, =,27, !=,28 ;typedef struct keytable /*放置关键字*/ char name20; int kind;KEYTABLE;KEYTABLE keyword= /*设置关键字

7、*/ program,0, not,1, begin,2, end,3, if,4, then,5, var,6, else,7, int,8, while,9, and,10, do,11, or,12, ;void openfile() /*打开文件*/ cout_endl; cout 词法分析器 endl; cout_endl; cout请在本程序根目录下寻找以.txt”为结尾的文件作为词法分析对象,输入文件名endl; FILE *fp; char a,filename10; int n=0; gets(filename); if(fp=fopen(filename,r)=NULL)

8、printf(cannot open file.n); /exit(0); else while(!feof(fp) /*文件不结束,则循环*/ a=getc(fp); /*getc函数带回一个字符,赋给a*/ setn=a; /*文件的每一个字符都放入set数组中*/ n+; fclose(fp); /*关闭文件*/ setn-1=0;void reflesh() /*清空strtaken数组*/ to=0; /*全局变量to是strtaken的指示器*/ strcpy(strtaken, );void pre1() /*预处理程序*/ int i,a,b,n=0; do if(setn=/

9、 & setn+1=*) a=n; /*记录第一个注释符的位置*/ while(!(setn=* & setn+1=/) if(setn=n) line+; n+; b=n+1; /*记录第二个注释符的位置*/ for(i=a;i=b;i+) /*/ seti= ; /*把注释的内容换成空格,等待第二步预处理*/ else if(setn=/ & setn+1=/) a=n; /*记录第一个注释符的位置*/ while(!setn=n) n+; b=n+1; /*记录第二个注释符的位置*/ for(i=a;i=a & ch=A & ch=0 & ch=9) return(1); else re

10、turn(0);int Reserve() /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回*/ int i,k=0; for(i=0;i=12;i+) if(stricmp(strtaken,keywordi.name)=0) k=1; Wordsdcount.num=keywordi.kind; strcpy(Wordsdcount.letters,-); dcount+; return(keywordi.kind); if(k!=1) return(-1);void Retract() /*指示器sr回调一个字符位置,把ch置为空*/ sr-; ch= ;int

11、 InsertId() int i,k; for(i=0;iid;i+) k=strcmp(strtaken,signi); if(k=0) return(i); strcpy(signid,strtaken); /*插入标识符*/ Wordsdcount.num=13; strcpy(Wordsdcount.letters,strtaken); id+;dcount+; return(id-1);int InsertConst() int i,k; for(i=0;ist;i+) k=strcmp(strtaken,constanti); if(k=0) return(i); strcpy(

12、constantst,strtaken);/*插入常数*/ Wordsdcount.num=14; strcpy(Wordsdcount.letters,strtaken); st+;dcount+; return(st-1);void analysis() int value; reflesh(); /*清空strtaken数组*/ pre1(); /*预处理,使注释内容换成单个空格,放回set中*/ pre2(); /*预处理,使set中连续的空格置换成单个空格,并把set的内容放到str中*/ sr=0; GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ GetBC

13、(); /*读取第一个字符*/ while(ch!=0) /*当不等于结束符,继续执行*/ if(IsLetter()/标识符和关键字判定 while(IsLetter() | IsDigit() /*若第一个是字符,继续读取,直到出现空格*/ Concat(); GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ value=Reserve(); /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回*/ if(value=-1) /*如果返回值是,那就是标识符,把它输出*/ In

14、sertId(); /*插入标识符*/ reflesh(); else if(IsDigit() while(IsDigit() /*否则,若第一个是数字,继续读取,直到出现空格*/ Concat(); /*把ch中的字符放入strtaken*/ GetChar(); Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ InsertConst(); /*插入常数,返回类型为int*/ /printf( %s,strtaken); /getchar(); reflesh(); else switch(ch) /*否则,若是下面的符号*/ case: case-: case(:

15、 case): case,: case;: case=: case: Concat(); for(int c0=15;c0=23;c0+) if(stricmp(strtaken,wordsc0.word)=0) Wordsdcount.num=wordsc0.type; dcount+; reflesh(); break; default:if(ch=*) /*如果是*符号,继续读取下一个*/ Concat(); /*判断是否为*的情况*/ GetChar(); if(ch=strtaken0) Concat(); else Retract(); for(int c1=24;c1=25;c1

16、+) if(stricmp(strtaken,wordsc1.word)=0) Wordsdcount.num=wordsc1.type; dcount+; /printf( %s,strtaken); /getchar(); reflesh(); break; else if(ch= | ch=!) Concat(); /*判断是否为=,!=的情况*/ GetChar(); if(ch=) Concat(); else Retract(); for(int c2=26;c2=28;c2+) if(stricmp(strtaken,wordsc2.word)=0) Wordsdcount.nu

17、m=wordsc2.type; dcount+; reflesh(); break; else h=ch/line; l=ch%line; coutError in h行l列endl; /getchar(); break; GetChar(); GetBC(); cout输出二元组:endl; for(int d_i=0;d_idcount;d_i+) coutWordsd_i.num Wordsd_i.lettersendl; coutendl; cout输出标识符:endl; for(int sign_i=0;sign_iid;sign_i+) coutsign_i signsign_ie

18、ndl; coutendl; cout输出常量:endl; for(int const_i=0;const_ist;const_i+) coutconst_i constantconst_iendl; cout=3 and n5 then j:=j-1; end . 结果截图:六 总结我在这次词法分析器的设计过程中学到了很多东西,其中最大的收获是对于编译原理中的词法分析这一过程理解的更加清楚明了。其次,是在使用c+编程的能力有所提高。当然,在该词法分析器设计中也有一些不足的地方,比如能识别的关键字有限,并不能识别所有的关键字,识别不出字符常量等。分析结果输出方式为:用一个存放结果的字符串数组,并用指针指向它,输出结果正确,但是输出结果比较乱。不过总的来说,这次实验达到了其初衷,实现了规定的功能。八致谢词:感谢xxx老师对我们的悉心教导以及提供我们这样一个学以致用的机会。通过这一阶段对编译原理课程的学习,特别是通过这次对于词法分析器的编程实践,我对于编译原理中的词法分析这一过程理解的更加清楚明了,收获很大。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1