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