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

上传人:豆**** 文档编号:28523634 上传时间:2022-07-28 格式:DOCX 页数:12 大小:26.63KB
返回 下载 相关 举报
西南交大编译原理课程设计(词法分析器和语法分析器).docx_第1页
第1页 / 共12页
西南交大编译原理课程设计(词法分析器和语法分析器).docx_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《西南交大编译原理课程设计(词法分析器和语法分析器).docx》由会员分享,可在线阅读,更多相关《西南交大编译原理课程设计(词法分析器和语法分析器).docx(12页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精品文档,仅供学习与交流,如有侵权请联系网站删除编译原理课程设计报告院 系 专 业 年 级 学 号 姓 名 西南交通大学信息科学与技术学院2013年 12月 8日课程设计一:手工设计C语言的词法分析器一、设计内容手工设计c语言的词法分析器,结合状态转换图的原理完成对c语言源程序的基本单词的分析及提取,并设计相应的数据结构保存提取出来的单词。以及对c语言中的保留字的处理策略,实现一个完整的C语言的词法分析器的编写。二、设计目的通过本实验的设计更具体的理解词法分析器的工作机制。同时更理解C语言的结构体系。从而更深刻的透析编译原理过程。三、设计平台1、硬件环境 (1)Intel(R) Core(TM

2、) i3-2310M CPU 2.10GHz 2.10GHz (2)内存4G2、软件环境 (1)Window8 Professor (2)Visual C+6.0开发软件3、开发语言:C语言。四、需求分析:词法分析程序又称词法分析器或词法扫描器。可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词,这里,作为子程序词法分析器的结构:源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序返回一个单词调用数据状态转换图的程序实现 为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放

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

4、 中字符回送到缓冲区源程序:#include stdio.h#include stdlib.h#include conio.h#include string.h#define N 47/保留字个数char ch=0;/存放最新读进的源程序字符char strToken20=0;/存放构成单词符号的字符串char buffer257=0;/字符缓冲区/*-保留字结构-*/struct keyTypechar keyname256;int value;KeyN=$ID,0,$INT,1,auto,2,break,3,case,4,char,5,const,6,continue,7,default,

5、8,do,9,double,10,else,11,enum,12,extern,13,float,14,for,15,goto,16,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;/*-

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

7、-)bufferi=bufferi-1;buffer0=ch;ch=0;/*-词法分析器-*/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

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

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

10、提示错误相关信息。文法表示: Sv=E|E?|clear 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. 从单词串中取单词:GetW

11、ord()9. 清空单词串和归约栈:ClearwordStack()、ClearmainStack()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#defin

12、e NUM 14#define M 256/优先关系矩阵int priorityNUMNUM=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

13、,1,0,1,0,0,0,1,0,0,0,1,1,1,1,1,0,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 WordTypechar wordM;int value;wordTypeNUM=error,0,=,1,?,2,+,3,-,4,*,5,/,6,(,7,),8,$i,9,$c,10,clear,11,#,12,$N,13;/*-变量表-

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

15、yType 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.value=9;e

16、lsefor(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.elem0;for(int i=0;

17、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)=0)return i;else if(i=M-1)re

18、turn -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 Handle()int i;/常量归约if(mainStack.elemmain

19、Stack.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.len-1.word);return false;elsestrcpy(mainStack.ele

20、mmainStack.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.elemmainStack.len-3.word);strcpy(temp.value,mainStack.elemmainS

21、tack.len-1.word);temp.flag=true;AddvarTable(temp);elsestrcpy(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;else if(mainStack.elemmainStack.len-3.value=13)strcpy(mainStack.e

22、lemmainStack.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

23、=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.len-3.word);a=a*b;itoa(a,mainStack.elemmainStack.len-3.word,10);mainStack.len=mainStack.len-2;/输出语句else if(wordStack.elem0.value=2&mainStack.elemmainStack.

24、len-1.value=13&mainStack.elemmainStack.len-2.value=12)printf(n表达式的值为 %s,mainStack.elemmainStack.len-1.word);mainStack.len=0;/结束归约else if(mainStack.elemmainStack.len-2.value=12&wordStack.elem0.value=12)mainStack.len=mainStack.len-2;return true;bool MainHandle()while(wordStack.len)if(prioritymainStack

25、.elemmainStack.len-1.valuewordStack.elem0.value!=1)AddmainStack(GetWord();elseif(mainStack.len)printf(n);for(int i=0;imainStack.len;i+)printf(%s,%d),mainStack.elemi.word,mainStack.elemi.value);Handle();break;if(mainStack.len)MainHandle();return true;/*-主函数-*/int main()int go=1;WordType temp;while(go

26、)printf(n输入串:);scanf(%s,buffer);printf(n单词串:);if(!GetwordStack()return 0;for(int i=0;iwordStack.len;i+)printf(%s,%d),wordStack.elemi.word,wordStack.elemi.value);printf(n归约栈:);InitmainStack();MainHandle();printf(n按0退出,按1继续:);scanf(%d,&go);printf(the end!n);return 0;七、测试演示示例: a=5 b=a+10 b? b+a*a? a=a+b 显示结果如下:对于不存在的变量,出错信息的提醒显示如下:八、结束语通过对C语言语法分析器的设计和编写,了解掌握了算符优先分析的基本方法和内容。对于简单的额赋值语句进行词法分析,和简单的语法分析。完成了实验要求的对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。【精品文档】第 12 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com