编译原理课程设计C语言词法分析器语法分析器.doc
《编译原理课程设计C语言词法分析器语法分析器.doc》由会员分享,可在线阅读,更多相关《编译原理课程设计C语言词法分析器语法分析器.doc(31页珍藏版)》请在三一办公上搜索。
1、编译原理课程设计C语言词法分析器语法分析器 姓名: 某某某 学号: 班级: 软件一班 学院: 信息科学与技术学院2014年11月17日目录1C语言词法分析器的设计31.1实验目的31.2实验要求31.3实验环境31.4实现分析31.4.1词法分析的理论构架31.4.2程序入口设计41.4.3程序执行中的流程41.4.4程序的出口设计51.5源代码51.6结果分析81.7收获与体会112语法分析器122.1实验目的122.2实验要求122.3实验环境122.4实现分析122.4.1LL(1)分析方法的思想122.4.2程序的入口分析122.4.3程序运行的流程132.4.4程序的出口设计142.
2、5源代码142.6结果分析272.7收获与体会30参考文献:311 C语言词法分析器的设计1.1 实验目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。1.2 实验要求所编写的词法分析器要能对最基本的C语言程序进行词法分析。1.3 实验环境1. Windows 7操作系统2. 华硕笔记本,内存4G,处理器i53. 装有Microsoft Visual Studio 2010,并安装framework4.01.4 实现分析1.4.1 词法分析的理论构架词法分析器的功能输入源程序,按照构词规则分解成
3、一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等(1) C语言的关键字经过搜索共有32个, 是由程序语言定义的具有固定意义的标识符。我编写的词法分析器只将其中的一部分常用的定义在程序中,他们有break,case,char,const,continue,default,do,double,else,enun, extern,float,for,goto,if,int,long,return,static,struct,switch,sizeof,typedef,union,unsigned,void,volatile,while而对于C语言的一些保留
4、字如“main”、“return”等我没有将其放入关键字的范围内。(2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。(3) 常数 常数的类型一般有整型、实型、布尔型、文字型等。(4) 运算符 我在本词法分析器里面定义了“+”、“-”、“*”、“/”四种运算符。(5) 界符 我则定义了如下11种, ; . ( ) = : 1.4.2 程序入口设计次法分析入口的设计方法很多,为了我们每次运行时方便起见,我们将我们的C语言程序放入一个txt文件中,每次我们运行程序时,程序将自行读取文件中的C语言代码,并将对其进行词法分析将分析结果输出到控制台,这样的输入方法避免了我们重复输入程序的问题
5、,我们需要对某程序进行词法分析时,我们只需要将我们的C语言程序拷贝到我们的txt文件中,运行程序即可进行词法分析了。开始1.4.3 程序执行中的流程打开txt文件读取C语言代码扫描、是否读取到相应字符NNNN N NYYY Y YY界符?关键字?标识符?运算符?常数?记录标号记录标号记录标号记录标号记录标号输出结束1.4.4 程序的出口设计上面我们讲解了我们词法分析器的入口,但是我们的输出是怎样设计的呢。首先为了使我们的程序有参考对照,我将我们的C语言程序首先输出到控制台上,以便与后面的词法分析是做一个参考,无需再去打开我们相应的txt文件做对照了。其次,我将我的关键字和相应的界符以及相应的运
6、算符都编上一个序号,并且将其一一个二元式的方式输出到控制台上,以便灾后面的词法分析结果中形成对比。最后我们将词法分析的结果输出到控制台上,输出格式为,我们将每一句代码作为一个单位,在每句代码后面我们将给出本局代码分析得到词法分析后的字符标号。例如:Typedef struct |22|19| 其意义就是Typedef 和struct对应的标号为22和19这两种种别1.5 源代码/ cifa.cpp : 定义控制台应用程序的入口点。#include stdafx.h#include #include #include #include #include #include #includeusin
7、g namespace std;bool isLetter(char ch) if (ch=A & ch=a & ch=0 & ch=9) return true; else return false;bool isP(char ch) if(ch=+|ch=*|ch=-|ch=/) return true; else return false;bool isJ(char ch) if(ch=,|ch=;|ch=.|ch=(|ch=)|ch=|ch=|ch=|ch=:|ch=|ch=|ch=|ch=#) return true; / else return false;bool isBlank
8、(char ch) if(ch= |ch=t) return true; else return false;int main() string src,ste,s; char ch0,ch,ch12; char ktt5520=break,case,char,const,continue,default,do,double,else,enun,extern,float,for,goto,if,int,long,return,static,struct,switch,sizeof, typedef,union,unsigned,void,volatile, while,标识符,无符号数 ,;,
9、:,.,(,),?,+,-,+,-,*,/,=,=,=,!=,#; / int pos=0; FILE *fp; fp=fopen(d:in.txt,r); ch0=fgetc(fp); while(ch0!=EOF) /if(ch0!=t)src+=ch0; src+=ch0; ch0=fgetc(fp); src+=#; coutsrcendl; ch=srcpos+; ste= ; for(int j=0;j54;j+)coutjkttjendl; cout词法分析:n; while(ch!=#) char str20; if(ch!=n) if(isDigit(ch) /判断常数 in
10、t i=0; while(isDigit(ch)|ch=.) stri+=ch; /i+; ch=srcpos+; stri=0; ste=ste+|+22; coutstr; continue; else if(isLetter(ch) /判断字符 int i=0,j; while(isLetter(ch)|isDigit(ch) stri+=ch; /i+; ch=srcpos+; stri=0; for(j=0;j28;j+) /判断是否关键字 int t=strcmp(str,kttj); if(t=0) stringstream ss; ste+=|; ssste;ssste; br
11、eak; if(j=28)ste=ste+|+28; / cout ; coutstr; continue; else if(isP(ch) /判断是否运算符 int i=0,j; stri+=ch; stri=0; for(j=34;j38;j+) int t=strcmp(str,kttj); if(t=0) stringstream ss; ste+=|; ssste;ssste; break; coutstr; ch=srcpos+; continue; else if(isJ(ch) /判断是否界符 int i=0,j; while(isJ(ch) stri+=ch; ch=srcp
12、os+; stri=0; for(j=23;j47;j+) int t=strcmp(str,kttj); if(t=0) stringstream ss; ste+=|; ssste;ssste; break; coutstr; continue; else if(isBlank(ch) coutch; ch=srcpos+; continue; else coutstebase=(int *)malloc(MAXQSIZE*sizeof(int);/为base申请空间 if(!Q-base) printf(队列构建失败(按任意键返回主菜单)n);getch();system(CLS);Ch
13、oice(Q);Q-front =Q-rear = 0;/队列头,尾的初始化 return OK;int main()SqQueue *Q;/定义队列 QQ = (SqQueue*) malloc(MAXQSIZE*sizeof(SqQueue);/为Q申请空间InitQueue(Q);/构造空队列Choice(Q);/调用选择函数,获取主菜单return OK;运行后的结果:如图1.1 我先将txt文件中的代码取出图 1.1如图1.2 将我的标号显示在控制台上图 1.2如图1.3 输出词法分析结果图 1.3上述结果和我的预期一样,实现了对C语言的词法分析。1.7 收获与体会首先,这个词法分析
14、器我是用C语言编写,工作量确实有点大,但是由于扎实的C语言基本功,我还是很快的编写出了程序,是我对C语言的使用更加熟练了,此外由于是编写的C语言词法分析器,所以我需要更全面深刻的去了解C语言的知识,使我找到了一些盲区,比如有一些C语言的关键字还不是很熟悉。其次,我还认真的学习了编译原理的词法分析知识,对正规式,状态转换图,以及自动机的知识有了新的理解,并将其运用到我的程序中来,大大的开阔了我的视野,使我的编程能力又上了一个台阶2 语法分析器2.1 实验目的通过设计、编制、调试一个具体的语法分析程序,加深对语法分析原理的理解,学习并掌握一种语法分析的方法,让我们巩固上课内容,学习LL(1)分析法
15、,学会自上而下的文法分析方法。2.2 实验要求语法分析是编译过程的核心部分。他的任务是在词法分析识别单词符号串的基础上,分析并判断程序的的语法结构是否符合语法规则。由此编写一个语法分析器。2.3 实验环境1、 Windows 7操作系统2、 华硕笔记本,内存4G,处理器i53、 装有Visual C+ 6.0,并安装framework4.0注:因为本程序使用到了fprintf和fscanf两个系统函数,由于Microsoft Visual Studio 2010出于安全考虑将这两个函数的参数增加为了4个,但是本程序依旧使用的老版本时的三个参数,所以本程序只能在Visual C+ 6.0上运行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 语言 词法 分析器 语法

链接地址:https://www.31ppt.com/p-2386103.html