首页 C语言词法分析器

C语言词法分析器

举报
开通vip

C语言词法分析器C语言词法分析器 46865356.doc 2008-06-12 周宏 1.加强对词法分析原理、方法和基本实现技术的理解; 2.灵活运用这学期所学的知识对词法分析,语法分析有进一步的理解; 3.强化对系统软件综合工程实现能力的训练; 用C语言(或 C++ )作为宿主语言完成: C语言(win-TC , ANSI C或turbo C 2.0)词法分析器的设计和实现。 1. 编写C语言词法分析器的源程序并调试通过; 2. 通过测试程序的验收; 3. 提交简明扼要的书面实验报告,内容包括:属性字设计;源程...

C语言词法分析器
C语言词法分析器 46865356.doc 2008-06-12 周宏 1.加强对词法分析原理、方法和基本实现技术的理解; 2.灵活运用这学期所学的知识对词法分析,语法分析有进一步的理解; 3.强化对系统软件综合工程实现能力的训练; 用C语言(或 C++ )作为宿主语言完成: C语言(win-TC , ANSI C或turbo C 2.0)词法分析器的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 和实现。 1. 编写C语言词法分析器的源程序并调试通过; 2. 通过测试程序的验收; 3. 提交简明扼要的书面实验报告,内容包括:属性字设计;源程序主要流程;主要数据结构设计, 程序。 (1) main主程序图 处理每个字符 开始 1 46865356.doc 2008-06-12 周宏 Scan()函数,分析并 返回每个单词的属性 初始化 Run=1? 判断并输出每 个单词类型属 性。 初始化数组 Program[],words[] 提示输入程序字符串 输入并读取程序字符 是否结束 是 结束 (2) Scan()函数流程图 1 46865356.doc 2008-06-12 周宏 判断并标志为 运算符或标点 符号 初始化数组,标志符 判断并标志为判断并标志是其它类型 否为关键字 Return返回 sign数值 1 46865356.doc 2008-06-12 周宏 if (flag == 0) #include { sign = 100; /*为关键字*/ #include } }/* if 是关键字*/ int i,j,k,sign,number,flag,run,sum,autuor; /*handle digits*/ /*flag which is use to judge the string is keywords or not!*/ else if ((ch >= '0') && (ch <= '9')) char ch; { number = 0; char words[10] = {" "}; while ((ch >= '0' ) && (ch <= '9' )) char program[500]; { number = number*10+(ch-'0'); ch = program[i++]; int Scan(char program[]) } { char * keywords[39] = sign = 200; /*为数字*/ { "auto","default","do", "extern","goto", i--; "int","short","static","struct","switch", } "typedef","void","break","case","char", /*opereation and edge handle*/ "const","continue","double","else", "enum", else switch (ch) "float","for","if","long", "register", { "return","signed","zhouhong","sizeof","union", case '=':{ "unsigned","volatile","while","main","printf", if (ch == '=') "scanf","include","define","string" words[j++] = ch; }; words[j] = '\0'; number = 0; ch = program[i++]; flag = 0; if (ch == '=') j = 0; {words[j++] = ch; ch = program[i++]; words[j] = '\0'; /* To handle the lettle space ands tab*/ sign= 401; /* = = while ((ch == ' ') || (ch == '\t') || (ch == '\r')||(ch=='\n')) */ ch=program[i++]; } else /* 跳过不理睬 */ /*handle letters*/ { i--; /*退回一个字符 if ((ch >= 'a') && (ch <= 'z' )) */ { sign = 402; /* = */ while ((ch >= 'a') && (ch <= 'z' )) } { break; words[j++]=ch; } ch=program[i++]; case'>':{ if (ch == '>') } words[j++] = ch; i--; words[j] = '\0'; words[j++] = '\0'; ch = program[i++]; for (k = 0; k < 39; k++) if (ch == '=') if (strcmp (words,keywords[k]) == 0) {words[j++] = ch; {sign=k+1;flag=1; words[j] = '\0'; if(k==27) autuor=1; sign = 403; /* >= break; */ } } else if(ch=='>') 1 46865356.doc 2008-06-12 周宏 { words[j++] =ch; case'+':{ words[j] ='\0'; if (ch == '+') sign =419; /* >> words[j++] = ch; */ words[j] = '\0'; } ch = program[i++]; else if (ch == '=') { i--; { words[j++] = ch; sign = 404; /* > words[j] = '\0'; */ sign= 409; } } break; else if (ch == '+') } { words[j++] = ch; case'<': {if (ch == '<') words[j] = '\0'; words[j++] = ch; sign= 410; words[j] = '\0'; } ch = program[i++]; else if (ch == '=') {i--; { words[j++] = ch; sign = 411; words[j] = '\0'; } sign = 405; break; } } else if(ch=='<') case'-': {if (ch == '-') { words[j++] = ch; words[j++] = ch; words[j] = '\0'; words[j] = '\0'; sign = 420; ch = program[i++]; } if (ch == '=') else { words[j++] = ch; { i--; words[j] = '\0'; sign = 406; sign= 412; }break; } } else if( ch == '-') case'!': { words[j++] = ch; {if (ch == '!') words[j] = '\0'; words[j++] = ch; sign= 413; words[j] = '\0'; } ch = program[i++]; /* 负数的情况 */ if (ch == '=') else if((ch >= '0') && (ch <= '9')) {words[j++] = ch; {while( (ch >= '0') && (ch <= '9') ) words[j] = '\0'; {words[j++] = ch; sign= 407; ch = program[i++]; } } else words[j] = '\0'; {i--; sign = 1000; /* 标志为1000 */ sign= 408; /* 负数 */ } break; i--; } break; 1 46865356.doc 2008-06-12 周宏 } case';':{ else words[j] = ch; { i--; words[j+1] = '\0'; sign = 414; sign = 501; }break; break; } } case'*':{ if (ch == '*') case'(':{ words[j++] = ch; words[j] = ch; words[j] = '\0'; words[j+1] = '\0'; ch = program[i++]; sign = 502; if (ch == '=') break; {words[j++] = ch; } words[j] = '\0'; case')':{ sign = 415; words[j] = ch; } words[j+1] = '\0'; else sign = 503; { break; i--; } sign = 416; case'[':{ } words[j] = ch; break; words[j+1] = '\0'; } sign = 504; case'/':{ if (ch == '/') break; words[j++] = ch; } words[j] = '\0'; case']':{ ch = program[i++]; words[j] = ch; if (ch == '=') words[j+1] = '\0'; { sign = 505; words[j++] = ch; break; words[j] = '\0'; } sign = 417; case'{':{ } words[j] = ch; else words[j+1] = '\0'; { sign = 506; i--; break; sign = 418; } } case'}':{ break; words[j] = ch; } words[j+1] = '\0'; case'^':{ sign = 507; if(ch=='^') break; words[j++] = ch; } words[j] = '\0'; case':':{ sign =421; words[j] = ch; break; words[j+1] = '\0'; } sign = 508; 1 46865356.doc 2008-06-12 周宏 break; break; } } case'"':{ } words[j] = ch; return sign; words[j+1] = '\0'; } sign = 509; void display() break; {printf("Autuor: zhouhong\n"); } printf("calss: computer 0502\n"); case'%':{ printf("time: 2008-06-10\n"); if (ch == '%') printf("Email: zhouhong206521@126.com\n"); words[j++] = ch; printf("QQ: 454350734\n"); words[j] = '\0'; } ch = program[i++]; if (ch == '=') int main() { { words[j++] = ch; i=0; run=1; words[j] = '\0'; while(run) sign = 510; { int ent; } int j; else ent=autuor=sum=0; { for( j = 0; j < 500; j++) i--; program[j] = ' '; sign = 511; for( j = 0; j < 10; j++) } words[j] = ' '; break; /* 初始化 */ } printf("enter the program end with '@':\n"); case',':{ do words[j] = ch; { words[j+1] = '\0'; ch = getchar(); sign = 512; program[i++] = ch; break; }while(ch != '@'); } case'#':{ words[j] = ch; i = 0; words[j+1] = '\0'; do{sign = Scan(program); sign = 513; if (sign == 200) break; {printf("(number , %8d, %5d) } ",number,sign); case'@':{ sum++; ent=1; words[j] = '#'; } words[j+1] = '\0'; else if (sign == -1) sign = 0; { printf("(error , %5d) break; ",sign); } sum++; ent=1; default:{ } else if(sign>=1&&sign<=38) sign = -1; /* 错误 */ 1 46865356.doc 2008-06-12 周宏 {printf("(keyword , %8s, %5d) ",words,sign); sum++; ent=1; } else if(sign>=401&&sign<=421) { printf("(operator, %8s, %5d) ",words,sign); sum++; ent=1; } else if(sign>=501&&sign<=513) {printf("(symbol , %8s, %5d) ",words,sign); sum++; ent=1; } if(sum%2==0&&ent==1) puts("\r"),ent=0; }while (sign != 0); puts("\n"); if(autuor==1)display(), puts("\n"); printf("continue?(Y or N):"); getchar(); ch=getchar(); if(ch=='N'||ch=='n') run=0; } return 0; getchar(); } 1 46865356.doc 2008-06-12 周宏 (1) 当程序开始时会出现程序输入界面,如下面图(一)所示: 图(一) (2) 接着输入C语言原程序,如下面图(二)所示: 图(二) (3)按回车键后,程序就会运行并输出结果,如下面图(三)所示: 图(三) (4)此程序另外还加入了一个身体标志,当程序输入的单词中包含“zhouhong” 的字符串是,运行程序后,会在正常输出的最后面出现 几行关于个人身份信息。如下面图(四)所示: 1 46865356.doc 2008-06-12 周宏 图(四) (1)刚开始,这个程序是先看了网上的一个类似程序之后,在他的基础上面完善而得到了这个程序, 当然这个程序还有一些不足,如符号“&&“,”||”,”^”等不能识别,并且个别关键字也没有加入 进去,所以当遇到这些会以错误形式输出。 (2)看原程序时,总以为很简单,但真的当自已去做的的时候,发现原来程序的完善是无穷无尽的, 你只能做到更好,却做不到最好。 (3)在上理论课时,理性的觉得很难,当看到程序是如何识别一个一个关键字,一个一个字符的时 候,也觉得并不是那么难啊。 1
本文档为【C语言词法分析器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_624976
暂无简介~
格式:doc
大小:74KB
软件:Word
页数:12
分类:互联网
上传时间:2017-09-26
浏览量:96