编译原理设计c语言的词法分析器_第1页
编译原理设计c语言的词法分析器_第2页
编译原理设计c语言的词法分析器_第3页
编译原理设计c语言的词法分析器_第4页
编译原理设计c语言的词法分析器_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、-. z.编译原理课程设计报告题目:学院:教师:*:班级:评分:签字:-. z.编译原理课程设计一:设计c语言的词法分析器一、实验目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。二、实验要求了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。三、实验设计3.1单词分类及表示3.1.1 C语言的子集分类标识符:以字母开头的字母数字串整数或浮点型。保存字:for,while,do,else,if,static,int,sizeof,break,continue运算符:+,-,*,/,%,=,!

2、=,=,=,!,&,&,|;界符:(,),:,;,单词二元组单词、单词自身值单词标识符1整数或浮点型2保存字3运算符4界符53.2 词法分析器的设计算法设计概要设计从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进展查找,输出单元二次组至另一文件夹。状态图设计输入输出设计输入:通过文件指针从文件中一个一个读取字符输出:输出单词二元组至文件。格式为种别码,值主要函数void Getchar(FILE *fp ) /读入一个字符void GetBC(FILE *fp)/读入一个非空字符void contacat()/连接字符int letter()/判断是否为字母i

3、nt digit()/判断是否为字母void retract(FILE *fp,char *c)/回退int reserve (char *k)/处理保存字int sysmbol(identifier *id)/处理标识符,查找符号表并存放位置假设没有则添加int constant(constnumber *con)/存入常数表,并返回它在常数表中的位置void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)/写到文件void WordAnalyze(char *k,char *c, char *CODE

4、, identifier *id, constnumber *con, FILE *fp, FILE *fw)/词法分析函数四、结果测试文件输入int main() int a=1,b=3; if(a1) b=b-2;输出结果:结论:程序输出结果与期望输出结果相符。收获与感想通过我本次课程设计掌握了词法分析器设计的根本方法与相关知识。词法分析的关键是明确各类字符的状态转换过程。同时辅助标识符、常量构造体与保存字表用于查找返回值。同时我也对分析问题解决问题有了更深入全面的认识与理解。面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐个解决最后再串联在一起,问题就会变得更容易,思路也会更加

5、清晰。五、实验代码#includeusing namespace std;#define LENGTH 10char ch;char *CODE = identifier,constant,keyword/*保存字*/,+,-,*,/,=,!=,=,=,(,),:,;, ;char *k = for,while,do,else,if,static,int,sizeof,break,continue ;/保存字char token16;/存放处理后的字符串/标识符构造体typedef structchar *I256;int len;identifier;typedef structint co

6、nt300;int len;constnumber;/读入一个字符void Getchar(FILE *fp ) if (ch = getc(fp) = EOF)e*it(1);/读入一个非空字符void GetBC(FILE *fp)while (ch = | ch = n | ch = 9)Getchar(fp);/连接字符void contacat()char * cht = &(ch);strcat_s(token, cht);/判断是否为字母int letter()returnisalpha(ch);int digit()return isdigit(ch);/回退void retr

7、act(FILE *fp,char *c)int a=ftell(fp);fseek(fp,0,SEEK_SET);fprintf_s(fp, %c, ch);ch = ;fseek(fp, a, SEEK_SET);/处理保存字int reserve (char *k)int i;for (i = 0;i LENGTH;i+)if (strcmp(token, ki) = 0)return (i + 1);return 0;/处理标识符,查找符号表并存放位置假设没有则添加int sysmbol(identifier *id)int i;for (i = 0;i len;i+)if (strc

8、mp(token, id-Ii) = 0)return i + 1;if (id-len 256)cout Iid-len = token;id-len+;return id-len;/数字字符串转化为整数int str_to_num()int i=0;int k = tokeni-0;for (i = 1;tokeni != 0;i+)k = k * 10 + tokeni - 0;return k;/存入常数表,并返回它在常数表中的位置int constant(constnumber *con)con-contcon-len = str_to_num();con-len+;return c

9、on-len;/写到文件void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)int num_ = num;fprintf_s(fw, (%d,num);if (num = 4)fprintf_s(fw,%s, CODEnum-1);if (num Ival - 1);break;case 2:fprintf_s(fw, %d, con-contval - 1);break;case 3:fprintf_s(fw, %s, kval - 1);break;fprintf_s(fw, )n);void e

10、rror(FILE *fw)cout (Error, ch ) = A&ch = a&ch = z) /分析标识符和保存字/假设字符为AZ或09,则继续读取while (letter() | digit()contacat();Getchar(fp);retract(fp, c);num = reserve(k);if (num != 0)Tofile(3, num, id, con,fw);elseval = sysmbol(id);Tofile(1, val, id, con,fw);else if (digit()/处理常数while (digit()contacat();Getchar

11、(fp);retract(fp,c);val = constant(con);Tofile(2, val, id, con,fw);else /分析符号switch (ch) case:Getchar(fp);if (ch = =)Tofile(11, 0, id, con,fw);elseretract(fp,c);Tofile(10, 0, id, con,fw);break;case=:Getchar(fp);if (ch = =)Tofile(13, 0, id, con,fw);elseretract(fp,c);Tofile(14, 0, id, con,fw);break;cas

12、e!:Getchar(fp);if (ch = =)Tofile(12, 0, id, con,fw);elseerror(fw);break;case+:Tofile(4, 0, id, con,fw);break;case-:Tofile(5, 0, id, con,fw);break;case*:Tofile(6, 0, id, con,fw);break;case/:Tofile(7, 0, id, con, fw);break;case(:Tofile(15, 0, id, con, fw);break;case):Tofile(16, 0, id, con, fw);break;c

13、ase,:Tofile(17, 0, id, con, fw);break;case:Tofile(18, 0, id, con, fw);break;case;:Tofile(19, 0, id, con, fw);break;case:Tofile(20, 0, id, con, fw);break;case:Tofile(21, 0, id, con, fw);break;default:error(fw);int main()char c100 = F:/1.t*t;FILE *fp,*fw;errno_t err;err = fopen_s(&fp, c, r);if (err != 0)printf(Thefile was not openedn);e*it(0);errno_t err1;err1 = fopen_s(&fw, F:/2.t*t, w);if (err1 != 0)printf(Thefile was not openedn);e*it(0);identifier *id=(identifier *)malloc(sizeof(identifier);id-len

温馨提示

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

评论

0/150

提交评论