编译原理实验报告(共27页).doc

上传人:飞****2 文档编号:14443831 上传时间:2022-05-04 格式:DOC 页数:27 大小:818.50KB
返回 下载 相关 举报
编译原理实验报告(共27页).doc_第1页
第1页 / 共27页
编译原理实验报告(共27页).doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《编译原理实验报告(共27页).doc》由会员分享,可在线阅读,更多相关《编译原理实验报告(共27页).doc(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上实验一 词法扫描器设计一 实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。二 实验内容设计一个简单的类C语言的词法扫描器。三 实验要求1、根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;文法见最后附录。2、提供源程序输入界面;3、词法分析后可查看符号表和TOKEN串表;4、保存符号表和TOKEN串表(如:文本文件); 5、遇到错误时可显示提示信息,然后跳过错误部分继续进行分析。四 实验报告(一) 系统功能(包括各个子功能模块的

2、功能说明)程序主要实现的功能:通过词法分析程序,在源程序中识别并分别出数字、标识符和保留字,并分别将记录到指定的文本文档中,过程中不符合符号表要求的字符视为错误处理。子功能模块:关键字处理;数字处理;字母的处理(标识符和保留字);运算符处理;主程序。(二) 开发平台(操作系统、设计语言)Windows 7,Microsoft Visual C+ 6.0。(三) 设计方案(1) 主数据流图(2) 主要子程序的流程框图(3) 主要数据结构:id Letter int10 Num int10 | Num OP +| - |* |/ | = |= | !=Keywordif | then | else

3、 | while | do Lettera|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|ZNum0|1|2|3|4|5|6|7|8|9 | Letter | Num |(四) 具体设计过程(包括主控程序、各个功能模块的具体实现)主模块:judge(FILE *,char *);用词法分析过程的判断子功能模块:Keyword(string );用于判断字符串是否是关键词 Letter(char c);用于判断c是否是字母 Num(char c);

4、用于判断c是否是数字 (五) 源代码#define MAX 50 /长度最大值 50 char ch = ; / 字符 空格string keyword50=bool,break,case,include,char,const, continue,default,do,double,else,false, float,for,if,int,long,namespace,new,return, short,signed,struct,switch,true,using,void,while ,then,class ; / 常见关键字数组 只用了部分30个/*关键字的处理过程*int gjz(st

5、ring c) int i; for(i=0;iMAX;i+) if(pare(c)=0) return 1; /与关键字数组中用相同的就返回真,否则假 return 0;/*字母的处理过程*int zm(char c) if(c=a)|(c=A) return 1; /比较字母的ASCII码值,在大小写范围内,返回真,否则假。 else return 0;/*数字的处理过程*int num(char c) if(c=0&c=9) return 1; /比较字母的ASCII码值,在0-9范围内,返回真,否则假。 else return 0;/*运算符处理过程*/ 过程中指针总是向前看一个,决定

6、当前的各种单词是否结束,或是根据后边的输入消除当前字符二义性。void caculate(FILE *fpin)ofstream out(lex.txt,ios:out); /文件token.txt输入内存 string arr=; /字符串 while(ch=fgetc(fpin)!=EOF) /没到文件末尾,循环至末尾 arr=; if(ch= |ch=t|ch=n) /空格,缩进,换行,均不做操作 else if(zm(ch) /若有字符 while(zm(ch)|num(ch) /当有字符或数字的时候,循环 arr=arr+ch; /组织拼接字符串 ch=fgetc(fpin); /c

7、h 得到文件输入字符 fseek(fpin,-1L,SEEK_CUR); /循环结束后,重定位流指针,从当前位置左移一位。开始判断新的输入是什么类型 if (gjz(arr)outarrt1t关键字endl; /若是关键字,则输出类型1,关键字 else outarrt2t标识符endl; /若是标识符,则输出类型2,标识符 else if(num(ch) /若是数字 while(num(ch)|ch=.&num(fgetc(fpin)|fgetc(fpin)=e|ch=e)/ 数字 | . &(得到一个字符|字符是e|输入是e) if(ch=.) /. fseek(fpin,-1L,SEEK

8、_CUR);/指针左移 arr=arr+ch; if(ch=e) /e,自然对数的底数 ch=fgetc(fpin); / 新读入 if( ch=+) arr+=+; else arr+=-, fseek(fpin,-1L,SEEK_CUR);/指针左移 ch=fgetc(fpin); fseek(fpin,-3L,SEEK_CUR); / 指针左移3 outarrt3t无符号数endl; /无符号数 3 else switch(ch) case+: case- : case* : case= : case/ :outch t4t运算符endl;break; /+ - * / = 运算符 4

9、case( : case) : case : case : case; : case# : case. : case, : case : case :outch t5t界限符endl;break; / (),.#; 界限符 case : string string1=; do string1+=ch; ch=fgetc(fpin); while (ch!=);/循环得到 string1+=ch; outstring1t6t字符串endl; /字符串 6 break; case: :ch=fgetc(fpin); if(ch=) out:= t4t运算符endl; /运算符 :=else out

10、= t4t运算符endl; /运算符 = fseek(fpin,-1L,SEEK_CUR); /当指针回退一个字符 break; case :ch=fgetc(fpin); if(ch=)out= t4t运算符endl; /运算符 = if(ch=a)|(ch=A) fseek(fpin,-1L,SEEK_CUR); /指针回退一个字符 out t5t界限符endl; /界限符 else if(ch=)out t7t控制符endl; /控制符 ) out t4t运算符endl;/运算符 elseout t4t运算符endl; /运算符 :ch=fgetc(fpin); if(ch=) out=

11、 t4t运算符= if(ch=)out t7t控制符 if(ch=n)fseek(fpin,-1L,SEEK_CUR); out t5t界限符 后边没有操作数。 else out t4t运算符 fseek(fpin,-1L,SEEK_CUR); break; default : outch t无法识别字符x; /cinx;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。coutxx;cout.width(30);coutxx;cout.width(30);coutxendl; /*主程序*void main() char in_fn30; /定义存放文件路径的数组 FILE *

12、fpin; coutin_fn; /输入路径名 if(fpin=fopen(in_fn,r)!=NULL) break; /以只读方式打开文件,如果成功跳出循环继续,若不成功则输出错误信息。 else cout文件路径错误!请输入源文件(包括路径和后缀名):; coutn*词法分析结果如下*endl; caculate(fpin); /调用分析程序 fclose(fpin); /关闭文件 coutendl; /结束行 read(); /调用read(),完成输出 /分析文本文件 内容为一个简单的C语言程序 coutn*lex.txt 词法分析完毕*b)c=a+b;elsec=a-b;三 实验要

13、求(一) 程序设计要求(1)给出主要数据结构:分析栈、符号表;(2)将扫描器作为一个子程序,每次调用返回一个TOKEN;(3)程序界面:表达式输入、语法分析的表示结果(文件或者图形方式);(二)实验报告撰写要求(1)系统功能分析与设计(包括各个子功能模块的功能说明);(2)开发平台(操作系统、设计语言);(3)设计方案:包括功能模块结构图、主要函数的流程图;(4)主要数据结构:分析栈、分析表、符号表;(5)具体设计实现过程(包括主控程序、各个功能模块的具体实现)。四 实验设计(一) 系统功能语法分析器的主要功能:是否可以以及如何从语法的起始符号推导出输入符号串。根据语法分析的规则,其必须以$作

14、为终结符,各个语句之间;间隔,判断其是否符合语法规则,一依次输出判断过程中所用到的产生式,并输出最终结论,若有错误可以报错并提示错误所在行数及原因。(二) 开发平台Windows 7,Microsoft Visual C+ 6.0(Dos),C+。(三) 设计方案对输入的源码文件进行此法分析,产生符号表-开始LR语法分析;词法分析:处理注释部分-换行处理/字符处理/数字处理/其他处理(运算法,界限符等)-词法分析产生符号表;LR语法分析:利用闭包运算和GOTO函数原理来对token进行语法分析,并输出分析的结果;(四) 数据结构分析栈struct Symbolchar name50;char

15、*type;int value;Symbol1000;分析表Table3120数组108,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0,113,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,

16、0,203,0,0,0,0,0,0,0,0,203,0,0,7,0,4,0,0,0,0,0,202,0,0,0,0,0,0,0,0,202,0,0,0,0,0,0,0,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,11,25,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,0,205,0,0,0,0,0,0,

17、0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,15,28,25,0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,113,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,113,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,0,206,0,0,0

18、,0,0,0,0,0,0,0,0,0,0,0,121,123,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,22,0,208,0,0,0,0,208,208,208,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,24,0,209,0,0,0,0,209,209,209,0,0,0,0,0,0,0,0,0,0,0,0,210,0,0,0,0,210,210,210,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0

19、,211,211,211,0,0,0,0,0,0,0,0,0,0,0,0,212,0,0,0,0,212,212,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,30,25,0,0,0,0,0,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0符号表struct Tokenchar *type;int attr;Token1000;(五) 重要函数处理注释文字char Explain(char ch)/处理注释的函数

20、int i = START;/数组下标从0开始char EwordMAXSIZE;/存放字符或者字符串char ch1;ch1 =ch;Eword+i = ch1;ch1 = fgetc(Source);if(ch1 = /)/此时为单行注释while(ch1 != n)fprintf(Middle,%c, );ch1 = fgetc(Source);fprintf(Middle,%c,n);ch1 = fgetc(Source);else if(ch1 = *)/此时为多行注释while(!(ch1 = /)&(Ewordi = *)if(ch1 = n)fprintf(Middle,%c,

21、n);Eword+i = ch1;fprintf(Middle,%c, );ch1 = fgetc(Source);ch1 = fgetc(Source);else/此时为除号printf(%c,Eword0);fprintf(Middle,%c,Eword0);return ch1; LR分析法实现语法分析int LR()int tao1000=0;/用于存放语法分析过程中的状态int top=0;/存放栈顶的位置int point=0;/存放Token表,即输入表的当前位置int count;/用于扫描endchar数组时的计数char *input;/暂时保存输入表中的当前位置上的内容/

22、char head;/用于保存产生式的头部int num,state;input=Tokenpoint.type;while(pointTi)/input=Tokenpoint.type;for(count=0;count20;count+)/if(*input)=(*(endcharcount)if(!(strcmp(input,endcharcount)break;/count此时保存语法分析表的列号num=Tabletaotopcount;if(num=0)printf(Wrong in LR!Wrong in %s!,input);elsestate=num%100;/得到十位及个位上

23、的数字num=num/100;/用于辨别是移入1,规约2还是其他0switch(num)case 0:/GOTO表部分top+;/将该状态压栈taotop=state;input=Tokenpoint.type;break;case 1:/执行移入操作top+;/将该状态压栈taotop=state;point+;/指向输入表中的下一个位置input=Tokenpoint.type;break;case 2:/执行规约操作top=top-(int)(*productorstate1-48);/出栈的个数/printf(top=%d,top);input=productorstate2;prin

24、tf(n,productorstate0);/goto L;break;case 10:point+;input=Tokenpoint.type;break;default:printf(Wrong in LR!Wrong in %s!,input);if(point=Ti)&(num=10)return 1;elsereturn 0; 词法分析函数同实验一,故略。(六) 具体实验过程主程序流程图:五 实验结果运行结果:六 实验总结经过本次的实验,使我真正的了解语法分析器的实现过程,让我更加深刻的语法分析器的实现原理,虽然在本次试验中遇到了各种各样的困难和错误,但在同学的帮助下还是把错误改正过

25、来了,是的语法分析器能够正确的识别相应的语法和表达式。附录:简单类c语言文法产生式 语义规则注:P为文法的开始符号说明语句部分文法:P D SD L id ; D |L int | float程序语句部分文法:S id = E; S.code = E.code | gen(id.place:=E.place)S if (C) S1 C.true = newlabel; C.false = S.next;S1.next = S.next;S.code = C.code | gen(C.true:) | S1.codeS if (C) S1 else S2S while (C) S1 do S2C

26、.true = newlabel; C.false = newlabel;S1.next = S2.next =S.next;S.code = C.code | gen(C.true:) | S1.code| gen(gotoS.next)| gen(C.false:)| S2.code;S S ;SC E1 E2C.code = E1.code | E2.code |gen(ifE1.placeE2.placegotoC.true) |gen(gotoC.false)C E1 E2 C.code = E1.code | E2.code |gen(ifE1.placeb)c=a+b;elsec

27、=a-b;四 实验设计(一) 系统功能分析与设计本程序功能:本程序可对一段包含运算符的赋值语句依次进行词法分析、语法分析、语义分析以及生成中间代码。主要进行语义分析并生成中间代码,根据输入的符号串简历分析树并建立相应的依赖图,最后完成根据语义规则的运算。(二) 开发平台(开发软硬件环境)Windows 7,Microsoft Visual C+ 6.0(三)语义翻译中使用的数据结构struct token/词法 token结构体int code;/编码int num;/递增编号token *next;token *token_head,*token_tail;/token队列struct st

28、r/词法 string结构体int num;/编号string word;/字符串内容str *next;str *string_head,*string_tail;/string队列struct ivan/语法 产生式结构体char left;/产生式的左部string right;/产生式的右部int len;/产生式右部的长度;ivan css20;/语法 20个产生式struct pank/语法 action表结构体char sr;/移进或归约int state;/转到的状态编号;pank action4618;/action表int go_to4611;/语法 go_to表struct ike/语法 分析栈结构体,双链ike *pre;int num;/状态int word;/符号编码ike *next;ike *stack_head,*stack_tail;/分析栈首尾指针struct L/语义四元式的数据结构int k;string op;/操作符string op1;/操作数string op2;/操作数string result;/结果L *next;/语义四元式向后指针L *Ltrue;/回填true链向前

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com