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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

西南交大编译原理课程设计词法分析器和语法分析器.docx

1、西南交大编译原理课程设计词法分析器和语法分析器编译原理课程设计报告院 系 专 业 年 级 学 号 姓 名 课程设计一:手工设计C语言的词法分析器一、设计内容手工设计c语言的词法分析器,结合状态转换图的原理完成对c语言源程序的基本单词的分析及提取,并设计相应的数据结构保存提取出来的单词。以及对c语言中的保留字的处理策略,实现一个完整的C语言的词法分析器的编写。二、设计目的通过本实验的设计更具体的理解词法分析器的工作机制。同时更理解C语言的结构体系。从而更深刻的透析编译原理过程。三、设计平台1、硬件环境 (1)Intel(R) Core(TM) i3-2310M CPU 2.10GHz 2.10G

2、Hz (2)内存4G2、软件环境 (1)Window8 Professor (2)Visual C+6.0开发软件3、开发语言:C语言。四、需求分析:词法分析程序又称词法分析器或词法扫描器。可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词,这里,作为子程序词法分析器的结构:状态转换图的程序实现 为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符2) strToken 存放构成单词符号的字符串3) Buffer 字符缓冲区4)struct keyType 存放保留字

3、的符号和种别五、概要设计保留字表的设计结构:基本功能状态转换:六、详细设计1.GETCHAR 读一个字符到 ch 中2.GETBC 读一个非空白字符到ch 中3.CONCAT 把CHAR 中字符连接到strToken 之后4.LETTER 判断CHAR 中字符是否为字母5.DIGIT 判断ch 中字符是否为数字6.RESERVE 用strToken中的字符串查找保留字表,并返回保留字种别码,若返 回零,则非保留字7.RETRACT 把CHAR 中字符回送到缓冲区源程序:#include stdio.h#include stdlib.h#include conio.h#include strin

4、g.h#define N 47 /保留字个数char ch=0; /存放最新读进的源程序字符char strToken20=0; /存放构成单词符号的字符串char buffer257=0; /字符缓冲区/*-保留字结构-*/struct keyType char keyname256; int value; KeyN=$ID,0,$INT,1,auto,2,break,3,case,4, char,5,const,6,continue,7,default,8,do,9, double,10,else,11,enum,12,extern,13,float,14, for,15,goto,16,

5、if,17,int,18,long,19,register,20, return,21,short,22,signed,23,sizeof,24,static,25, struct,26,switch,27,typedef,28,union,29,unsigned,30, void,31,volatile,32,while,33,=,34,+,35,-,36,*,37, /,38,%,39,40,;,41,(,42,),43,?,44,clear,45,#,46;/*-子过程-*/void GetChar() /读一个字符到ch中 int i; if(strlen(buffer)0) ch=b

6、uffer0; for(i=0;i256;i+) bufferi=bufferi+1; else ch=0;void GetBC() /读一个非空白字符到ch中 int i; while(strlen(buffer) i=0; ch=bufferi; for(;i=A&ch=a&ch=0&ch=9) return true; else return false;int Reserve() /用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字 int i; for(i=0;i0;i-) bufferi=bufferi-1; buffer0=ch; ch=0;/*-词

7、法分析器-*/keyType ReturnWord() strcpy(strToken,0); int c; keyType tempkey; GetBC(); if(ch=A&ch=a&ch=0&ch0) a=b+c;); printf(buffer:n%sntt 单词t种别号n,buffer); while(strlen(buffer) printf(按任意键提出一个词:); getch(); temp=ReturnWord(); printf(%st %dnn,temp.keyname,temp.value); printf(the end!n); return 0;七、测试当输入字符“

8、if(i0) a=b+c”,当缓冲区接受这串字符后,通过调用词法分析子程序,可有如下的显示结果:八、结束语通过对C语言词法分析器的设计和编写,更加了解了编译程序在编译过程中的效用。同时,也更加了解了C语言的结构。对于词法分析器这一章的理论知识也有了较深入的理解。课程设计二:手工设计简单的语法分析器一、设计内容用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。二、设计目的了解掌握算符优先分析的基本方法、内容; 学会科学思考并解决问题,提高程序设计能力。三、设计平台1、硬件环境 (1)In

9、tel(R) Core(TM) i3-2310M CPU 2.10GHz 2.10GHz (2)内存4G2、软件环境 (1)Window8 Professor (2)Visual C+6.0开发软件3、开发语言:C语言。四、需求分析:语法分析的任务: 把单词符号作为基本单位,分析程序是否为合法的程序.算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约,若能正确地归约为文法的初始符号,则表示输入字串是合法的.该试验主要研究对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。文法表示: Sv=E|E?|clea

10、r EE+T|E-T|T TT*F|T/F|F F (E)|v|c 五、概要设计单词种别码设计:符号种别码=1?2+3-4*5/6(7)8v9c10clear11#12N13六、详细设计1.优先关系矩阵:int priorityNUMNUM2.单词种别码结构:struct WordType3.变量表中的元素结构:struct VarWord4.变量表结构:struct VarTable5.归约栈:mainStack6.单词串:wordStack7.输入串转化成单词串:GetwordStack()8.从单词串中取单词:GetWord()9.清空单词串和归约栈:ClearwordStack()、C

11、learmainStack()10.查看变量在变量表中的位置:CheckvarTable(char a)11.变量表添加变量:AddvarTable(VarWord a)12.初始化归约栈:InitmainStack()13.归约栈添加:AddmainStack(WordType a)14.归约处理程序:Handle()15.归约子程序:MainHandle()源程序:#include stdio.h#include stdlib.h#include conio.h#include string.h#define NUM 14#define M 256/优先关系矩阵int priorityNU

12、MNUM=0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0, 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0, 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0, 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0, 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0, 0,0,0,-1,-1,-1,-1,-1,2,-1,0,0,0,0, 0,0,0,1,1,1,1,0,1,0,0,0,1,0, 0,0,1,1,1,1,1,0,

13、1,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,-1,-1,-1,-1,-1,0,0,0,0,3,0, 0,0,1,0,0,0,0,0,0,0,0,0,1,0; /*-单词,种别码-*/struct WordType char wordM; int value;wordTypeNUM=error,0,=,1,?,2,+,3,-,4,*,5,/,6,(,7,),8,$i,9,$c,10,clear,11,#,12,$N,13;/*-变量表-*/struct VarWord char varn

14、ameM; /变量名 char valueM; /变量值 bool flag; /变量是否赋值标志;struct VarTable VarWord elemM; /变量数组 int len; /变量表的长度varTable;/*-单词栈-*/struct OperateStack WordType elemM; /单词元素 int len; /栈的长度;OperateStack mainStack; /归约栈OperateStack wordStack; /单词串/*-输入串转化成单词串-*/bool GetwordStack() int i; wordStack.len=0; keyType

15、 temp; while(strlen(buffer) temp=ReturnWord(); /词法分析器获得一个分析词 if(temp.value=1) /常数($c,10) strcpy(wordStack.elemwordStack.len.word,temp.keyname); wordStack.elemwordStack.len.value=10; else if(temp.value=0) /变量($i,9) strcpy(wordStack.elemwordStack.len.word,temp.keyname); wordStack.elemwordStack.len.val

16、ue=9; else for(i=0;iNUM;i+) if(strcmp(temp.keyname,wordTypei.word)=0) /关键字 wordStack.elemwordStack.len=wordTypei; break; else if(i=NUM-1) printf(输入串中出现未识别单词!n); return false; wordStack.len+; wordStack.elemwordStack.len+=wordType12; return true;/*-从单词串中取单词-*/WordType GetWord() WordType temp=wordStack

17、.elem0; for(int i=0;iwordStack.len-1;i+) wordStack.elemi=wordStack.elemi+1; wordStack.len-; return temp;/*-清空栈-*/void ClearwordStack() /清空单词串 wordStack.len=0;void ClearmainStack() /清空归约栈 mainStack.len=0;/*-查看变量在变量表中的位置-*/int CheckvarTable(char a) for(int i=0;iM;i+) if(strcmp(a,varTable.elemi.varname

18、)=0) return i; else if(i=M-1) return -1;/*-添加变量-*/void AddvarTable(VarWord a) varTable.elemvarTable.len=a; varTable.len+;/*-初始化归约栈-*/void InitmainStack() mainStack.elem0=wordType12; mainStack.len=1;/*-添加归约栈-*/void AddmainStack(WordType a) mainStack.elemmainStack.len=a; mainStack.len+;/*-归约-*/bool Ha

19、ndle() int i; /常量归约 if(mainStack.elemmainStack.len-1.value=10) mainStack.elemmainStack.len-1.value=13; /变量归约 else if(mainStack.elemmainStack.len-1.value=9) mainStack.elemmainStack.len-1.value=13; i=CheckvarTable(mainStack.elemmainStack.len-1.word); if(i0) printf(n变量 %s 未定义!,mainStack.elemmainStack.l

20、en-1.word); return false; else strcpy(mainStack.elemmainStack.len-1.word,varTable.elemi.value); /赋值归约 else if(mainStack.elemmainStack.len-2.value=1) if(mainStack.elemmainStack.len-3.value=9) i=CheckvarTable(mainStack.elemmainStack.len-3.word); if(i0) VarWord temp; strcpy(temp.varname,mainStack.elemm

21、ainStack.len-3.word); strcpy(temp.value,mainStack.elemmainStack.len-1.word); temp.flag=true; AddvarTable(temp); else strcpy(varTable.elemi.value,mainStack.elemmainStack.len-1.word); strcpy(mainStack.elemmainStack.len-3.word,mainStack.elemmainStack.len-1.word); mainStack.elemmainStack.len-3.value=13;

22、 else if(mainStack.elemmainStack.len-3.value=13) strcpy(mainStack.elemmainStack.len-3.word,mainStack.elemmainStack.len-1.word); mainStack.len=mainStack.len-2; /运算归约 else if(mainStack.elemmainStack.len-2.value=3) int a,b; a=atoi(mainStack.elemmainStack.len-1.word); b=atoi(mainStack.elemmainStack.len-3.word); a=a+b; itoa(a,mainStack.elemmainStack.len-3.word,10); mainStack.len=mainStack.len-2; else if(mainStack.elemmainStack.len-2.value=5) int a,b; a=atoi(mainStack.elemmainStack.len-1.word); b=atoi(mainStack.elemmainStack

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

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