编译原理词法分析课程设计.doc_第1页
编译原理词法分析课程设计.doc_第2页
编译原理词法分析课程设计.doc_第3页
编译原理词法分析课程设计.doc_第4页
编译原理词法分析课程设计.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学 号: 课 程 设 计题 目词法分析程序设计学 院计算机科学与技术专 业班 级姓 名 指导教师2009 2010 学年 第 二 学期目录一、课程设计任务书.2二、问题描述3三、词法分析3四、简要分析与概要设计4五、程序流程图.5六、源代码.5七、运行结果17八、设计收获与体会19九、参考文献20十、评分表21 课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 计算机科学与技术学院 题 目: 词法分析程序设计 1目的通过设计、编制、调试一个词法分析程序,加深对词法分析原理的理解。2设计内容及要求通过设计、编制、调试一个对于C语言词法的词法分析程序,加深对词法分析原理的理解,并实现输出单词序列的词法检查和分析。其中(1)学号33至35的同学完成以上任务。(2)自己设计出五种单词的符号表和对应的TOKEN代码,给出分析方法的思想,完成分析程序设计。(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。3.课程设计报告书的内容应包括:1. 设计题目、班级、学号、姓名、完成日期;2. 给出语法分析方法及中间代码形式的描述、文法和属性文法的设计;或者词法分析方法及符号表和TOKEN代码的设计。3. 简要的分析与概要设计;4. 详细的算法描述;5. 源程序清单;6. 给出软件的测试方法和测试结果;7. 设计的评价、收获与体会。时间安排:第17周,周1-周4上午,周五全天指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日词法分析程序设计 1.问题描述本次课程设计要求在Windows 环境下使用visual C+软件,采用熟悉的语言,通过设计、编制、调试一个对于C语言词法的词法分析程序,加深对词法分析原理的理解,并实现输出单词序列的词法检查和分析。2.词法分析2.1 五种单词的文法-l|l-l|d|l|d-d|d-+|-|*|/|=|-,|;|(|)|其中l表示az中的任何一个英文字母,d表示09中的任一个数字。关键字也是一种单词,一般关键字都是由字母构成,关键字集合时标识符集合的子集。2.2 词法分析方法从待分析文件中取出当前符号ch=fgetc(fp)If(Isalpha(ch)读出字符串,放进TOKEN代码中If(Iskey(token)对不同关键字进行种别码设置else 标识符种别码设置else if(Isdigit(ch)统一设置为一种种别码数字放入TOKEN代码中else if(Isoperation(ch)对不同操作符设置不同种别码将读出的操作符放入TOKEN代码else if(Isboundrary(ch)设置每种界符的种别码将读出的界符放入TOKEN代码中2.3符号表设计和TOKEN代码设计typedef struct _token_list /记录词法分析结果 Token token;struct _token_list* next;TokenNode, *PTokenList;typedef struct _symtab/符号表charname10;/名称chartype10;/类型intlength;/长度intoffset;/相对数struct_symtab *next;sym, *PSYMLIST;typedef struct _token /TOKEN代码设计int sym;/种别码 char str10;/存放单词*PToken, Token;3.简要分析与概要设计:设置一个TOKEN结构体,用来存放单词信息,其中包含sym和str10两个成员,sym用来存放单词种别码,str10数组用来存放单词符号。设置一个Symtab结构体,用来存放符号表中个变量的信息,其中name10用来存放单词名称,type10用来存放单词类型,length用来存放单词存储位置信息。在程序运行之前,先把要分析的程序放在一个.txt记事本中,分析过程中通过ch=fgetc(ch)从文件中读取字符,并进行分析,分析过程见2.2词法分析方法。对分析之后的单词用二元式进行输出。接下来进行符号表内容的输出,将已经分析过的关键字,存放在table数组中,当遇到分析出的符号为;时,将table数组清空。对分析出的标识符进行判断,如果是第一次分析出,则用symtab.type存放其类型,用存放其名称,symtab.length存放其长度,symtab.offset存放其相对数,然后输出符号表信息,如果不是第一次分析出,则输出错误提示。4.程序主要流程图5.源代码#define _CRT_SECURE_NO_WARNINGS /字符串和内存操作时 关闭函数的安全警告#include#include #includeint j,n; char ch;typedef struct _tokenint sym;/种别码 char str10;/存放单词*PToken, Token;typedef struct _token_list /记录词法分析结果Token token;struct _token_list* next;TokenNode, *PTokenList;typedef struct _symtab/符号表charname10;/名称chartype10;/类型intlength;/长度intoffset;/相对数struct_symtab *next;sym, *PSYMLIST; char_type510= int, float, char, double, long;/符号表类型int_size5= 32, 32, 8, 64, 32;/及对应的长度PSYMLISTsymtab= NULL;/符号表的头指针PSYMLISTsymtail= symtab;/符号表的尾指针Tokentoken;chartype10= 0;/保存类型名称PTokenListptl= NULL;/TokenList的头指针PTokenListptltail= ptl;/TokenList的尾指针intLineNumber= 1;/记录代码行数intoffset= 0;/计算变量偏移地址voidScan(FILE*);/词法分析boolIsoperation(char ch);/判断i当前所指的字符是否为一个运算符 boolIsboundary(char ch);/判断i当前所指的字符是否为一个分界符boolIskey(char ch);/判断i当前所指的字符是否为关键字boolIsalpha(char ch);/判断i当前所指的字符是否为字母boolIsdigit(char ch);/判断i当前所指的字符是否为数字boolIsType(char ch);/判断是否为类型intGetSizeOfType(char type);/获得类型大小intSearchSymTab(char name); /查找符号表voidAddToSymTab(Token token);voidPrintSymTab();/显示符号表voidAddToTokenList(Token token);/保存到词法分析表voidPrintTokenList();/显示词法分析表/主函数void main()char input20;FILE *fp;printf(*n 1022-表示关键字 n 2-表示标识符 n 3-表示数字 n 4057-表示操作符 n 6065-表示界符 n*n);printf(please input the source file name:);while(true)gets(input);if(fp=fopen(input,r)!=NULL) break;/读取文件内容,并返回文件指针,该指针指向文件的第一个字符elseprintf(file open filed! Please input again:);printf(n*the result is as follows*n);while(!feof(fp) Scan(fp); /扫描源程序/符号表PrintSymTab();/词法分析PrintTokenList();getchar();/暂停/判断i当前所指的字符是否为一个运算符,是的话返回真,反之假 bool Isoperation(char ch) int t; char arr8=+,*,/,=,!; for (t=0;t8;t+) if(ch=arrt) return true; return false; /判断i当前所指的字符是否为一个分界符,是的话返回真,反之假 bool Isboundary(char ch) int t; char arr6=,;,(,); for(t=0;t6;t+) if(ch=arrt) return true; return false; /判断i当前所指的字符是否为一个关键字,是的话返回真,反之假 bool Iskey(char ch) int t; char *keywords13=const,auto,if,else,break,int,char,float,long,for,do,printf,case; for (t=0;t13;t+)if (strcmp(token.str,keywordst)=0) return true; return false; bool IsType(char ch)int t; char *keywords5=int,char,float,long,double; for (t = 0; t 5; t +)if (strcmp(token.str,keywordst)=0) return true; return false; /判断i当前所指的字符是否为字母,是的话返回真,反之假bool Isalpha(char ch) if(ch=a)|(ch=A) return true;return false;/判断i当前所指的字符是否为数字,是的话返回真,反之假bool Isdigit(char ch) if(ch=0&ch=9) return true;return false;int GetSizeOfType(char type)for(int i = 0; i name, token.str, 10);memcpy(s-type, type, 10);s-length = GetSizeOfType(s-type);s-offset = offset;offset += s-length;s-next = NULL;if(symtab = NULL)/如果链表为空 则初始化链表symtab = s;symtail = symtab;else/链表不为空则将节点增加到链表尾部symtail-next = s;symtail = s;int SearchSymTab(char name)int exist = 0; /如果没有找到int index = -1;for(PSYMLIST s = symtab; s != NULL; s = s-next)index += 1;if(strcmp(name, s-name) = 0)exist = 1;return exist? index : -1; void PrintSymTab()printf(符号表:n);printf(名称 类型 长度 相对数 n);for (PSYMLIST s = symtab; s != NULL; s = s-next)printf(%-10s%-10s%-10d%-10dn, s-name, s-type, s-length, s-offset);void AddToTokenList(Token token)TokenNode *tn = (TokenNode *) malloc(sizeof(TokenNode);if(tn = NULL) return;memcpy(&(tn-token), &token, sizeof(Token);tn-next = NULL;if(ptl = NULL)ptl = tn;ptltail = tn;elseptltail-next = tn;ptltail = tn;void PrintTokenList()printf(词法分析表:n);printf(名称 类型n);for (PTokenList s = ptl; s != NULL; s = s-next)printf(%-10s%-10dn,s-token.str, s-token.sym);void Scan(FILE *fp)token.str10=NULL; j=0;ch=fgetc(fp); /获取字符,指针fp并自动指向下一个字符if(ch = n)LineNumber +; /记录分析的代码的行号strcpy(type, );/分析字符串if (Isalpha(ch) /判断该字符是否是字母while (ch = a) & (ch = A) & (ch =0)&(ch:token.strj+=ch;token.strj=0;ch=fgetc(fp);if(ch=)token.sym=42;token.strj+=ch;token.strj=0;elsetoken.sym=43;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;case:token.strj+=ch;token.strj=0;ch=fgetc(fp);if(ch = =)token.sym=44;token.strj+=ch;token.strj=0;elsetoken.sym=45;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;case!:token.strj+=ch;token.strj=0;ch=fgetc(fp);if(ch=)token.sym=46;token.strj+=ch;token.strj=0;elsetoken.sym=47;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;case+:token.strj+=ch;token.strj=0;ch=fgetc(fp);if(ch=)token.sym=48;token.strj+=ch;token.strj=0;else if(ch=+)token.sym=49;token.strj+=ch;token.strj=0;elsetoken.sym=50;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;case-:token.strj+=ch;token.strj=0;ch=fgetc(fp);if(ch=)token.sym=51;token.strj+=ch;token.strj=0;else if(ch=-)token.sym=52;token.strj+=ch;token.strj=0;elsetoken.sym=53;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;case*:token.strj+=ch;token.strj=0; ch=fgetc(fp);if(ch=)token.sym=54;token.strj+=ch;token.strj=0;else token.sym=55;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;case/:token.strj+=ch;token.strj=0;ch=fgetc(fp);if(ch=)token.sym=56;token.strj+=ch;token.strj=0;elsetoken.sym=57;token.strj+ = 0; /0 代表字符结束(空格)fseek(fp,-1,1); /回退一个字符break;/printf(%d , %s)n,token.sym , token.str);AddToTokenList(token);else if(Isboundary(ch) /界符switch(ch)case;:token.sym=60;token.strj+=ch;token.strj=0;break;case(:token.sym=61;token.strj+=ch;token.strj=0;break;case):token.sym=62;token.strj+=ch;token.strj=0;break;case:token.sym=63;token.strj+=ch;token.strj=0;break;case:token.sym=64;token.strj+=ch;token.strj=0;break;case,:token.sym=65;token.strj+=ch;token.strj=0;break;/printf(%d , %s)n,token.sym , token.str);AddToTokenList(token);else token.sym=-1;/保存变量类型到type数组中if(IsType(token.str) )memc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论