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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1编译原理课程设计报告院系专业年级学号姓名西南交通大学信息科学与技术学院2013年12月8日2课程设计一:手工设计C语言的词法分析器一、设计内容手工设计c语言的词法分析器,结合状态转换图的原理完成对c语言源程序的基本单词的分析及提取,并设计相应的数据结构保存提取出来的单词。以及对c语言中的保留字的处理策略,实现一个完整的C语言的词法分析器的编写。二、设计目的通过本实验的设计更具体的理解词法分析器的工作机制。同时更理解C语言的结构体系。从而更深刻的透析编译原理过程。三、设计平台1、硬件环境(1)Intel(R)Core(TM)i3-2310MCPU@2.10GHz2.10GHz(2)内存4G2、软件环境(1)Window8Professor(2)VisualC++6.0开发软件3、开发语言:C语言。四、需求分析:词法分析程序又称词法分析器或词法扫描器。可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词,这里,作为子程序词法分析器的结构:源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序返回一个单词调用数据3状态转换图的程序实现为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1)ch存放最新读进的源程序字符2)strToken存放构成单词符号的字符串3)Buffer字符缓冲区4)structkeyType存放保留字的符号和种别五、概要设计保留字表的设计结构:基本功能状态转换:六、详细设计1.GETCHAR读一个字符到ch中2.GETBC读一个非空白字符到ch中3.CONCAT把CHAR中字符连接到strToken之后44.LETTER判断CHAR中字符是否为字母5.DIGIT判断ch中字符是否为数字6.RESERVE用strToken中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字7.RETRACT把CHAR中字符回送到缓冲区源程序:#includestdio.h#includestdlib.h#includeconio.h#includestring.h#defineN47//保留字个数charch='\0';//存放最新读进的源程序字符charstrToken[20]=\0;//存放构成单词符号的字符串charbuffer[257]=\0;//字符缓冲区/*------------保留字结构-------------*/structkeyType{charkeyname[256];intvalue;}Key[N]={{$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},{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}};/*-------------子过程-------------*/voidGetChar()//读一个字符到ch中{inti;if(strlen(buffer)0){ch=buffer[0];for(i=0;i256;i++)buffer[i]=buffer[i+1];}elsech='\0';}voidGetBC()//读一个非空白字符到ch中{inti;while(strlen(buffer)){i=0;ch=buffer[i];for(;i256;i++)buffer[i]=buffer[i+1];if(ch!=''&&ch!='\n'&&ch!='\0')break;5}}voidConCat()//把ch连接到strToken之后{chartemp[2];temp[0]=ch;temp[1]='\0';strcat(strToken,temp);}boolLetter()//判断ch是否为字母{if(ch='A'&&ch='Z'||ch='a'&&ch='z')returntrue;elsereturnfalse;}boolDigit()//判断ch是否为数字{if(ch='0'&&ch='9')returntrue;elsereturnfalse;}intReserve()//用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字{inti;for(i=0;iN;i++)if(strcmp(strToken,Key[i].keyname)==0)returnKey[i].value;return0;}voidRetract()//把ch中的字符回送到缓冲区{inti;if(ch!='\0'){buffer[256]='\0';for(i=255;i0;i--)buffer[i]=buffer[i-1];buffer[0]=ch;}ch='\0';}/*----------词法分析器------------*/keyTypeReturnWord(){strcpy(strToken,\0);intc;keyTypetempkey;GetBC();if(ch='A'&&ch='Z'||ch='a'&&ch='z'){6ConCat();GetChar();while(Letter()||Digit()){ConCat();GetChar();}Retract();c=Reserve();strcpy(tempkey.keyname,strToken);if(c==0)tempkey.value=0;elsetempkey.value=Key[c].value;}elseif(ch='0'&&ch='9'){ConCat();GetChar();while(Digit()){ConCat();GetChar();}Retract();strcpy(tempkey.keyname,strToken);tempkey.value=1;}else{ConCat();strcpy(tempkey.keyname,strToken);tempkey.value=Reserve();}returntempkey;}/*-------------主函数-------------*/intmain(){keyTypetemp;strcpy(buffer,if(a0)a=b+c;);printf(buffer:\n%s\n\t\t单词\t种别号\n,buffer);while(strlen(buffer)){printf(按任意键提出一个词:);getch();temp=ReturnWord();printf(%s\t%d\n\n,temp.keyname,temp.value);}printf(theend!\n);7return0;}七、测试当输入字符“if(i0)a=b+c”,当缓冲区接受这串字符后,通过调用词法分析子程序,可有如下的显示结果:八、结束语通过对C语言词法分析器的设计和编写,更加了解了编译程序在编译过程中的效用。同时,也更加了解了C语言的结构。对于词法分析器这一章的理论知识也有了较深入的理解。8课程设计二:手工设计简单的语法分析器一、设计内容用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。二、设计目的了解掌握算符优先分析的基本方法、内容;学会科学思考并解决问题,提高程序设计能力。三、设计平台1、硬件环境(1)Intel(R)Core(TM)i3-2310MCPU@2.10GHz2.10GHz(2)内存4G2、软件环境(1)Window8Professor(2)VisualC++6.0开发软件3、开发语言:C语言。四、需求分析:语法分析的任务:把单词符号作为基本单位,分析程序是否为合法的程序.算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约,若能正确地归约为文法的初始符号,则表示输入字串是合法的.该试验主要研究对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。文法表示:S→v=E|E?|clearE→E+T|E-T|TT→T*F|T/F|FF→(E)|v|c五、概要设计单词种别码设计:符号种别码=1?29+3-4*5/6(7)8v9c10clear11#12N13六、详细设计1.优先关系矩阵:intpriority[NUM][NUM]2.单词种别码结构:structWordType3.变量表中的元素结构:structVarWord4.变量表结构:structVarTable5.归约栈:mainStack6.单词串:wordStack7.输入串转化成单词串:GetwordStack()8.从单词串中取单词:GetWord()9.清空单词串和归约栈:ClearwordStack()、ClearmainStack()10.查看变量在变量表中的位置:CheckvarTable(chara[])11.变量表添加变量:AddvarTable(VarWorda)12.初始化归约栈:InitmainStack()13.归约栈添加:AddmainStack(WordTypea)14.归约处理程序:Handle()15.归约子程序:MainHandle()源程序:#includestdio.h#includestdlib.h#includeconio.h#includestring.h#defineNUM14#defineM256//优先关系矩阵intpriority[NUM][NUM]={{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},10{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,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}};/*--------单词,种别码---------*/structWordType{charword[M];intvalue;}wordType[NUM]={{error,0},{=,1},{?,2},{+,3},{-,4},{*,5},{/,6},{(,7},{),8},{$i,9},{$c,10},{clear,11},{#,12},{$N,13}};

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功