《西南交大编译原理课程设计(词法分析器和语法分析器).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 页