词法分析器实验报告_第1页
词法分析器实验报告_第2页
词法分析器实验报告_第3页
词法分析器实验报告_第4页
词法分析器实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、词法分析实验报告班级:姓名:学号:1. 实验要求a) 可以识别每个单词符号,并以记号形式输出;b) 识别注释c) 统计字符,单词,行,列数等d) 检查错谋并报告位置e) 发现错误修正并恢复2. 程序自动机设计如手写图片。3. 程序源代码词法分析器by程闻博以下保留字以及运算符取自c语言核心技术;/部分位运算符("<<" >>"<< = ">> = ")未列入;内存定位运算符*算作算数运算符;/char * keyword34 = “auto; "break", hase; ”c

2、har: "const", "continue", "default", "do ”double: "else", wenum "extern", float; ”for: "goto; 'if; "int"r tong: "register", “return; bshort "signed; "sizeof; ”static; “struct: 'switch: btypedef"r -

3、print化 "union", "unsigned*, "void", 'volatile爲"while", ”mairt;/保留字/char * count_op5 =:"*"r v %”;/算数运算符/char * assignment_opll = r = "f" += ,"*= 7= b%= "& "a = u;/赋值运算符/char * self_op2 = +:/char * comparison_op6 = r<&quo

4、t;f <=",-> = - = w!="/符/char * logic.op=&&”. -| t;逻辑运算符/char * bool_op4 ="|u怖尔位运算符/char * getmem_op5 = ”&丁;内存定位运算符/char * else_op51 = "(丁;其他运算符/char * note3 = 7/ 7二"厂;注释/char * sentence =丁语句分割#inelude <stdio.h>#inelude <stdlib.h>#include <str

5、ing.h>#inelude <ctype.h>#inelude <vector>using namespace std;file *fpfpo;文件指针char curr;/读入的字符int line, row;char temp1000;int i = 0;int total_words, total_word;struct errint line;int row;int mode;;typedef struct err err;vector<err> errjist;struct id_saveint times;char contain1000

6、;struct id_save* next;;typedef struct id_save* id_saveptr;id_saveptr idjist;void id_countoint k;for(id_saveptr curr = idist; curr->next != null; curr = curr->next) int flag = 1;for(k = 0; tempk !=、0: k+)if(curr->containk != tempk)f-ag ho;break;if(f_ag : 1c?p?currjcomainsnn 0)( cur7vtimes+ r

7、eturn"idsavep= curr2 m new(idisave);curr2otimes hl;for(k h 0 二 empsllxo; k+)( curr2 "contains » tempz;)curr2vcontainsn 3 curr2lvnex( m idl-istvnext; id-isunext u curr2; void 0urputdl=st2 int j h t printf(*d 卑rr); if(idl-istjnextnnull) for(idsaveptr curr n id=stvnext; curtvnex-nnuf cur

8、r h curtvnex 三 printfnoa-%-30s%30d 3j cuuconep cumtimes);j+void bugrepoaint reason)-er 二 emp;(empine h -inp temp.row n row;(emp.mode h reason;errl-ist.pushbackaemp)void outputbugrepo二0亠printf(n 丼i+%ds>t§ 3errl=stsizeeint j h twhi 一 ecerrl=slempty()=err temp;temp n erristback();erris(popback(

9、);switch(tempmode)(case lprintf(-%dillem>商制皿 ewf2dn?sa>hm朋前 %d%dg_l 3j temp.-inptemp.row) break;case 2printf(-%dillemwb。0隔幾直需朋质。%d®%d_k 3二 emp=ne temp, row) break;case wprintf(yd>frdb5-dld。%d®%d5= 3j iemp-ine remp.row); break;j+void ourpuuchar* s ismode)(switch(mode)(case lprintf(

10、y,20s 寂b§#w s); fprimf(fpo、*%,20s 拓昭呵nj y break;case 2- idcount(rprints 沬心 0sox3s); fprimf(fpo、*%20sid3s)八 break;case 3-prints%,20s 磬为己 s); fprhf、衣20s 常3s);break;case 4:printfcn%sntt整行注释内容n s);fprintf(fpor "n%sntt整行注释内容比 s);break;case 5: printfcn%sntt整段注释内容n s);fprintf(fpoz "n%sntt整段注

11、释内容n: s);break;case 6: printf(w%-20s 符号n; s); fprintf(fpor "%-20s 符号n”, s);break;case 7: printfc%-20s 单弓 i号字符n; s); fprintf(fpor "%-20s 单引号字符s);break;case & printf(w%-20s双引号内字符串n: s); fprintf(fpor h%-20s双弓i号内字符串比s);break;if(mode != 4 && mode != 5)total_words+;void jumptoblank()

12、 while(curr != *n' && !feof(fp) && int(curr) != 32)curr = fgetc(fp);row+;char alpha jirst() while(isalnum(curr) != 0 | curr = t) tempfi = curr;i+;curr = fgetc(fp);row+;tempi =char keyword(34(10 = "auto"f 'break: hase: "char", const: "continue: "d

13、efault: "do: "double; welse wenum wextern ”float: for", ”goto: "if, hint *long ”register; “return; "short", "signed", "sizeof: "static "struct*, "switch", mtypedef "printf*, *union"r "unsigned", bvoid"r "v

14、olatile*, "while: 'main”;/保留字 for(intj = 0;j < 34;j +)if(strcmp(keywordjl temp) = 0) 这是f保留字 output(temp, 1); return curr;output(tempz 2);return curr;char digit_first()tempfi = curr;i+;数字部分if(curr = o)curr = fgetc(fp);row+;switch(curr)十六逬制case *x': case *x*:tempi = curr;i+;curr = fget

15、c(fp);row+;if( (isdigit(curr) != 0 | curr = far | curr = tv | curr =| curr = *b* | curr = 'c11| curr =c | curr = d | curr = d | curr =| curr = t* | curr = t | curr = f | curr =?) = 0)bugreport(2);jumptoblanko;return curr;while(isdigit(curr)!= 0 | curr =| curr = tv | curr = b | curr = 8 | curr =|

16、 curr=rc | curr = d | curr = 'd* | curr =宅 curr = t* | curr = f | curr = f) tempi = curr;i+;curr = fgetc(fp);row+;if(curr = t) tempfi = curr; i+; curr = fgetc(fp); row+;if( (isdigit(curr) != 0 | curr = 'a* | curr = a | curr = 'b' | curr = 8 | curr = *c* | curr = 'c | curr = '

17、cf | curr = *d* | curr = *e* | curr = *e* | curr = f | curr = 7*) = o)bugreport(2);jumptobla nk();return curr;while(isdigit(curr) != 0 | curr = *a* | curr = 'a* | curr =| curr = 'b' | curr = *c'| curr = *c | curr =| curr =| curr = 'e* | curr = 'e* | curr = f | curr = 'f*)

18、tempi = curr;i+;curr = fgetc(fp);row+;if(curr = p | curr " p)tempfi = curr;i+;curr = fgetc(fp);row+;if(curr = *-*)tempfi = curr;i+;curr = fgetc(fp);row+;if(isdigit(curr) = 0)bugreport(2);jumptobla nk(); return curr;while(isdigit(curr) != 0)tempi = curr;i+;curr = fgetc(fp);row+;break;八逬制case 

19、9;o': case t: case 2: case 3: case 4: case s: case & case 7:tempfi = curr; i+;curr = fgetc(fp);row+;while(isdigit(curr)!= 0 && curr != 8 && curr != 9) tempi = curr;i+;curr = fgetc(fp);row+;if(curr = t) tempi = curr; i+; curr = fgetc(fp); row+;if(isdigit(curr) = 0 | curr != 8

20、| curr != 9) bugreport(2); jumptoblanko; return curr;while(isdigit(curr) != 0 && curr != 8 && curr != 9) tempfi = curr;i+;curr = fgetc(fp); row+; break;十逬制数字elsecurr = fgetc(fp);row+;while(isdigit(curr) != 0)tempfi = curr;i+;curr = fgetc(fp);row+;if(curr = *.')tempi = curr;i+;whi

21、le(isdigit(curr) != o)tempi = curr;i+;curr = fgetc(fp);row+;if(curr = *e' | curr = 'e*)tempfi = curr;i+;curr = fgetc(fp);row+;while(isdigit(curr) != o)tempfi = curr;i+;curr = fgetc(fp);row+;if(curr = t)tempi = curr;i+;while(isdigit(curr) != o)tempi = curr;i+;curr = fgetc(fp);row+;if(curr = *

22、ur | curr =tempi = curr;i+;curr = fgetc(fp); row+;else if(curr = t |curr =卡') tempi = curr;i+;curr = fgetc(fp); row+;if(isalpha(curr) != 0) bugreport(l); tempi =、0: output(temp, 3); jumptoblanko; return curr;tempi =output(tempz 3);return curr;char symbo_first()char curr.next;curr.next = fgetc(fp

23、);row+;负数判断if(curr =&& isdigit(curr.next)!二 0)tempi = curr;i+;curr = curr. next;curr = digit_first(); return curr;引号判定单引号中只含一个字符,视为一个记号 if(curr =、”) tempi = curr;i+;curr = curr. next;if(curr =召tempi = curr; i+; curr = fgetc(fp); row+; tempfi = curr; i+; curr = fgetc(fp); row+; if(curr =、”) t

24、empi = curr; temp(i + 1 = ao1; output(temp, 7);curr = fgetc(fp); row+; return curr; else bugreport(2); jumptoblanko; return curr;仮弓i号中视为字符串整体输岀视为f记号 if(curr =、)tempi = curr;i+;curr = curr.next;while(curr != v* && curr != *nr && !feof(fp) tempi = curr;i+;curr = fgetc(fp);row+;if(curr

25、= v) tempi = curr; tempi + 1 =、0' output(tempz 8);curr = fgetc(fp);row+; return curr;elsebugreport(3); tempi =、0; output(tempz 8); return curr;注释判定if(curr = 7' && curr.next = 7*)curr = fgetc(fp);row+;curr.next = fgetc(fp);row+;i = 0;while(curr_next != *n* && !feof(fp) tempfi

26、= curr; curr = curr. next; curr.next = fgetc(fp);row+; i+;tempfi = curr;temp(i + 1 =、0'line+;total_word = totalword + row 2; row = 0;output(temp, 4);curr = fgetc(fp);row+;return curr;if(curr = 7* && curr.next = *)curr = fgetc(fp);row+;curr.next = fgetc(fp);row+;i = 0;while( !(curr = '

27、;* && curr.next = 7) && !feof(fp) tempi = curr; curr = curr.next; curr.next = fgetc(fp);row+; if(curr_next =、n') lin e+;total_word = totalword + row - 2; row = 0; i+;iffcurr.next = 7') tempi =、0;elsetempi = curr; temp(i + 1 = ao1;output(temp, 5);curr = fgetc(fp);row+;return c

28、urr;判定符号if( (curr =&& curr_next = '=') | (curr = -* && curr.next = =*) |(curr = * && currnext = *=*) | (curr = 7* && currnext = '=') | (curr =' && curr.next = *=*) | (curr = *&* && curr.next = =") | (curr =,a,&& cur

29、r.next = =*) | (curr = t && curr.next = *=*) | (curr = > && curr.next = =*) | (curr = '<' && currnext = *=*) | (curr =&' && curr.next = '&') | (curr = t && curr.next = t) | (curr = *!' && curr.next = '=*) | (cu

30、rr = *=* && curr_next = '=") | (curr = *+* && curr.next = '+*) | (curr =&& cur匚next = *-*) |(curr =&& currnext = *>')tempo = curr;templ = curr.next;temp2 =output(tempz 6);curr = fgetc(fp);row+;return curr;tempo = curr;templ =output(tempz 6);return

31、curr.next;void analysis()curr = fgetc(fp);row+;while(!feof(fp)if(int(curr) != 32 && curr !=、n && curr!=&& curr != r') /处理数字开头 if(isdigit(curr) != 0)curr = digitjirsto;/处理字母开头else if(isalpha(curr) != 0)curr = alpha_first();/处理符号开头elsecurr = symbojirsto;i = o;temp0 = o:elserow+;if(curr = 'n*)line+;total_word = totalword + row - 2; row = 0;curr = fgetc(fp);row+;totalword = totalword + row - 2;totalword 一;文件结束符号main()line = 1;row = 0;totalwords = 0; totalword = 0;idjist = n ew(id_save);id.saveptr idjist

温馨提示

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

评论

0/150

提交评论