计算机22班编译原理实验报告宝思阳_第1页
计算机22班编译原理实验报告宝思阳_第2页
计算机22班编译原理实验报告宝思阳_第3页
计算机22班编译原理实验报告宝思阳_第4页
计算机22班编译原理实验报告宝思阳_第5页
免费预览已结束,剩余29页可下载查看

付费下载

下载本文档

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

文档简介

1、编译原理实验 宝思阳学生专业/班级 计算机 22 班学号 2120505031提交日期 2014.12.09 实验一:词法分析器一、实验目的:1强化对系统综合工程实现能力的训练;2加强对词法分析原理、方法和基本实现技术的理解;二、实验内容:用C 语言或者其他的高级语言作为宿主语言完成C1 语言的词法分析器的设计。三、实验要求:1. 编写C0 语言的词法分析器的源程序并调试通过。其中词法分析程序既可以自己手动去完成,也可以利用 LEX 自动生成。2. 通过测试程序的验收;3.实验按照提供的模板填写:(1)功能描述:该程序具功能?程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;另外可以

2、附加函数之间的调用关系图、程序总体执行流程图。实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?你的收获有哪些?四、实验任务、词法分析器任务:输入源程序;扫描、分解字符串,识别出一个个单词(定义符、标识符、运算符、界符、常数)。单词符号的表示:1) 需要对单词分类,每一个识别出来的单词都属于不同的类型public enum TokenType/关键字 IF,ELSE,WHILE,RETURN,VOID,/运算符 + - * / = = != PLUS,MINUS,STAR,SLASH, LT,L

3、TEQ,GT,GTEQ,EQ,NEQ,ASSIGN,/界符 ; , ( ) /* */ MA,LPAREN,RPAREN,LSQUAR,RSQUAR,LBRACE,RBRACE,MENT,ID,NUMBER,/标识符/数字常量 IDletter(letter|didit)*NUMBERdigit digit * lettera|b|z|A|B|Z digit0|9 NONTOKEN,ERROR,ENDFILE / 其它;2) 单词符号的数据结构设计public class Tokenstring str; TokenType ttype;line;/单词字符串/单词的类型/所在行号信息3) 词

4、法分析 状态转换图letter|digit开始状态;Sletter非letter|digitS1需要回退一个字符;digit不需要字符回退;非digitdigit2=非=4=非=5!=6非=/非/非*8*97/S非*+ - * , ; ( ) 其他五、实验结果:使用测试文件 test.txt:void f1(a, a = 1;b = a+b;void main()a100;b; float c; ab=a;b) if(c=b)f1(a,b);for(i=0;i5:i+)得到进行词法翻译后:tokentokentokentokentokentokentokentokentokentokentok

5、entokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentype=ID string=f1 type=LPAREN string=(type= string=type=ID string=a type=COMMA string=,type= string=type=ID string=b type=RPAREN string=) type=LBRACE string= type=ID string=a type=ASSIGN string

6、= type=NUMBER string=1 type=SEMI string=; type=ID string=b type=ASSIGN string= type=ID string=a type=PLUS string=+ type=ID string=b type=SEMI string=; type=RBRACE string=type=VOID string=void type=ID string=main type=LPARENtype=RPAREN type=LBRACEstring=(string=) string=type= string= type=ID string=a

7、 type=LSQUAR type=NUMBERtype=RSQUARstring=string=100 string= type=SEMI string=; type= string= tokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokentokent

8、okentoken type=SEMI string=; type=FLOAT string=float type=ID string=c type=SEMI string=; type=ID string=a type=LSQUAR string= type=ID string=b type=RSQUAR string= type=ASSIGN string= type=ID string=a type=SEMI string=; type=IF string=if type=LPAREN string=(type=ID string=c type=LTEQ string=type=ID s

9、tring=b type=RPAREN string=) type=LBRACE string= type=ID string=f1 type=LPAREN string=(type=ID string=a type=COMMA string=, type=ID string=b type=RPAREN string=) type=SEMI string=; type=RBRACE string= type=ID string=for type=LPAREN string=( type=ID string=i type=ASSIGN string= type=NUMBER string=0 t

10、ype=SEMI string=; type=ID string=i type=LT string=type=NUMBER string=5line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=14 line=15 line=17line=18CANNOT RECGNIZE! string=:type=ID string=i type=PLUS string=+ type=PLUS string=+ type=RPAREN type

11、=LBRACE type=RBRACEtype=RBRACEstring=) string= string=string=六、实验代码文件名:TokenType.l:%# include # include linecount=1;char stype10=;%letter A-Za-z digit 0-9blt number digit+id (letter|_)(letter|digit|_)*%bl+ ;n linecount+; float|if|char|else|while|return|void|Upper(yytext,yyleng);|includefpr string=%s

12、number string=%sidstring=%sf(yyout,n,linecount,stype,yytext);fprf(yyout,n,linecount,yytext);fprf(yyout,n,linecount,yytext);+fprf(yyout,n,linecount,yytext); /算符-fprf(yyout,n,linecount,yytext);*fprf(yyout,n,linecount,yytext);/fprf(yyout,n,linecount,yytext);=fprf(yyout,n,linecount,yytext);fprf(yyout,n,

13、linecount,yytext);=fprf(yyout,n,linecount,yytext);fprf(yyout,n,linecount,yytext);=fprf(yyout,n,linecount,yytext);!=fprf(yyout,n,linecount,yytext);=fprf(yyout,n,linecount,yytext);fprf(yyout,n,linecount,yytext); /界符,fprf(yyout,n,linecount,yytext);(fprf(yyout,n,linecount,yytext);)fprf(yyout,n,linecount

14、,yytext);fprf(yyout,n,linecount,yytext);fprf(yyout,n,linecount,yytext);fprf(yyout,n,linecount,yytext);fprf(yyout,n,linecount,yytext);/*fprf(yyout,n,linecount,yytext);*/fprf(yyout,n,linecount,yytext);.fprf(yyout,n,linecount,yytext);%Upper(char *s,i;l)for(i=0;il;i+) stypei=toupper(si);stypei=0;yywrap(

15、)return 1;文件名:exle.c:#include main()extern FILE *yyin;extern FILE *yyout;if (yyin=fopen(test.txt,rt) = NULL )perror(can not open file test.txtn) ;exit(1);yyout = fopen(result.xml,wa);fprf(yyout , n);yylex();fprf(yyout , n);prf(Complete sucsfully!n);return 0;实验二 语法分析器一、实验题目和要求1、题目编写 C0 语言的语法分析器的源程序并调

16、试通过。其中语法分析程序既可以自己手动去完成,也可以利用 YACC 自动生成。2、实验目的(1)强化对系统综合工程实现能力的训练;(2)加强对语法分析原理、方法和基本实现技术的理解。二、程序设计及设计方案1、语法分析器流设计由于语法分析是在词法分析上做的进一步分析, 所以要求在上次输出词法分析结果的同时,也需要输出语法分析的结果。该结果用 xml 格式的文件表示。具体来说,我在设计程序时首先集成了一个词法分析器(参见实验一) ,将词法分析的结果保存在一个 temp 缓存区内,然后送交语法分析器。语法分析器是一个函数,简述如下:voidfpr fprYacc() /语法分析器f(fpout,n)

17、; f(fpout,n);Cur=0; ChengXu(); boddy();fprf(fpout,);它调用了 Chengxu() 、body()两个函数,基本思路是将词法分析分析出的符号与关键字等比较,相等的话则转入相应的分支处理。如,若检测到当前字符串为“if” ,则转入处理“条件语句”的部分,以确定是否有 if 语句的特征存在。在实际实验中,我所设计的程序对例程可以完全正确地输出结果,对其他测试程序的分析也基本无误,体现了验收,这是对我极大地鼓舞。 2、简要设计方案设计思路的合理性。在验收时,我首先通过了将待分析程序保存在 f 盘根目录下的 incode.txt 文件中,以备词法分析器

18、调用;词法分析器对待分析程序进行分析后, 在 f 盘根目录下创建 outfile.xml 文件,输出词法分析结果;待分析代码以#为结束符。3、程序工作说明由于语法分析是在词法分析上做的进一步分析, 所以要求在上次输出词法分析结果的同时,也需要输出语法分析的结果。该结果用 xml 格式的文件表示,如:4、相关说明 词法分析器任务ype= 将词法分析过程输出的记号输入到语法分析器中,按照 C0和相关数据输出到语法树中。语法树点的类型public enum NodeKindFuncK,SenK,ExpK;public enum SenKindIfK,WhileK,RetureK.的文则,将记号pub

19、lic enum ExpKindSimpleK,AssignK语法树的节点数据结构public class treeNodeStruct treeNode * childMAXCHILD; NodeKind nodeKind;UnionSenKind sen; ExpKind exp;kind; UnionTokenType op; val;Char * name;attr; ExpType type;lineNo;三、实验结果输入文件内容void main()a=0; b=2;while(a=b)+a; #输出文件内容?xml ver=1.0?tree line=1tree line=3tr

20、ee line=3notetype=FunDecl notestring=maindaype=VOID/nodetype=ASSIGN nodestring= daype=none/nodetype=VarDecl nodestring=a daype=/tree line=3tree line=4tree line=4tree line=4nodetype=NUMBER nodestring=0 daype=none/nodetype=ASSIGN nodestring= daype=none/nodetype=VarDecl nodestring=b daype=/nodetype=NUM

21、BER nodestring=2 daype=none/tree line=5 notetype=SENTEN notestring=none daype=none/tree line=5 nodetype=WhileStm nodestring=while daype=none/tree line=5tree line=5tree line=5nodetype=VarID nodestring=a daype=none/nodetype=EQ nodestring= daype=none/nodetype=VarIDnodestring=b daype=none/tree line=6 no

22、tetype=SENTENtree line=6 notetype=EXPRES notestring=none daype=none/ notestring=+a daype=none/四、源代码:#include #include#include #include #define MAXBUF 1023Cur=0; typeMAXBUF; lineMAXBUF;char FILE FILE*stringMAXBUF;*fpin;*fpout;FuZhiYuJu(); TiaoJianYuJu(); XunHuanYuJu(); BoolLiang(); BiaoDaShi(); Xiang

23、();YinZi(); YuJuChuan(); YuJu();Body(); ChengXu(); Yacc(); Judge(char*);void void void void void void void void voidvoid lexscanf(); Judge(char *p)char*word=exp,throw,catch,try,virtual,this,delete,new,protected,private,public,class,return,while,if,else, ,void,float,string;ptr,i,flag; flag=0; for(i=0

24、;i18;i+)ptr=stricmp(p,wordi); if(ptr=0)flag=1; return(i+1); break;if(flag=0)return 0;return 0;void lexscanf()char arrMAXBUF; i=0;j=0;char ch;lineo=1;/fpr ver/fprf(fpout,n);f(fpout,n);while(1)fscanf(fpin,%c,&ch); /从输入文件中读入字符if(ch= |ch=t) /清除空白;else if(ch=n) /识别回车,行数+1lineo+;else if(isdigit(ch) /如果输入字

25、符为数字while(isdigit(ch) /一直读字符,直到读入的字符不是数字arrj=ch; j+;fscanf(fpin,%c,&ch);fseek(fpin,-1L,SEEK_CUR); char* temp1=(char*)malloc(j+1); memcpy(temp1,arr,j); /将缓冲区的内容拷贝到 temp1 中去 temp1j=0;j=0;typeCur=44; lineCur=lineo; stringCur=temp1; Cur+;else if(isalpha(ch) /如果读入的字符为字母while(isalpha(ch)|isdigit(ch)arri=c

26、h; i+;fscanf(fpin,%c,&ch);fseek(fpin,-1L,SEEK_CUR); char* temp=(char*)malloc(i+1); memcpy(temp,arr,i); tempi=0;i=0;if(Judge(temp) /如果 读入的字母能与关键字相等typeCur=Judge(temp); lineCur=lineo; stringCur=temp; Cur+;elsetypeCur=43; lineCur=lineo; stringCur=temp; Cur+;else if(ch=) /处理二字符运算符) /处理二字符运算符=fscanf(fpin

27、,%c,&ch); if(ch=)typeCur=26; lineCur=lineo; stringCur=GTEQ; Cur+;else if(isdigit(ch)|isalpha(ch)|ch=fseek(fpin,-1L,SEEK_CUR); typeCur=25; lineCur=lineo; stringCur=GT;Cur+;else if(ch=) /处理二字符运算符=fscanf(fpin,%c,&ch); if(ch=)typeCur=27; lineCur=lineo; stringCur=EQ; Cur+;else if(isdigit(ch)|isalpha(ch)|

28、ch=)fseek(fpin,-1L,SEEK_CUR); typeCur=29; lineCur=lineo; stringCur=ASSIGN; Cur+;else if(ch=/)fscanf(fpin, %c,&ch); if(ch=*)while(1) fscanf(fpin,%c,&ch);while(ch!=*)fscanf(fpin,%c,&ch);fscanf(fpin,%c,&ch); if(ch=/)break;else if(ch=!) /处理二字符运算符!=fscanf(fpin,%c,&ch); if(ch=)typeCur=28; lineCur=lineo; s

29、tringCur=NEQ; Cur+;else /处理各种单字符运算符if(ch=+)typeCur=19; lineCur=lineo; stringCur=+; Cur+;continue;if(ch=-)typeCur=20; lineCur=lineo; stringCur=-; Cur+;continue;if(ch=)typeCur=22; lineCur=lineo; stringCur=SLASH; Cur+;continue;if(ch=;)typeCur=30; lineCur=lineo; stringCur=SEMI; Cur+;continue;if(ch=,)typ

30、eCur=31; lineCur=lineo; stringCur=COMMA; Cur+;continue;if(ch=:)typeCur=32; lineCur=lineo; stringCur=COLON; Cur+;continue;if(ch=.)typeCur=33; lineCur=lineo; stringCur=DOT; Cur+;continue;if(ch=)typeCur=34; lineCur=lineo; stringCur=WAVE; Cur+;continue;if(ch=()typeCur=35; lineCur=lineo; stringCur=LPAREN

31、; Cur+;continue;if(ch=)typeCur=36; lineCur=lineo; stringCur=RPAREN; Cur+;continue;if(ch=)typeCur=37; lineCur=lineo; stringCur=LSQUAR; Cur+;continue;if(ch=)typeCur=38; lineCur=lineo; stringCur=RSQUAR; Cur+;continue;if(ch=)typeCur=39; lineCur=lineo; stringCur=LBRACE; Cur+;continue;if(ch=)typeCur=40; l

32、ineCur=lineo; stringCur=RBRACE; Cur+;continue;if(ch=*)typeCur=21; lineCur=lineo; stringCur=STAR; Cur+;continue;if(ch=#)/终止符typeCur=45; lineCur=lineo; stringCur=STOP; Cur+;break;FuZhiYuJu() /赋值语句if(typeCur=!43)prf(语法错误,缺少标示符。错误行号%dn,lineCur);else fprf(fpout, n,lineCur); f(fpout, n); f(fpout, n,lineCu

33、r,stringCur);f(fpout, n); f(fpout, n);Cur+; if(typeCur!=29)prf(语法错误,缺少=。错误行号%dn,lineCur);Cur+; BiaoDaShi();fprf(fpout, n);return 1;TiaoJianYuJu() /条件语句if(typeCur!=15)prf(语法错误,缺少 if。错误行号%dn,lineCur);elsefprf(fpout, n,lineCur);Cur+; if(typeCur!=35)prf(语法错误,缺少(。错误行号%dn,lineCur);Cur+;fprf(fpout, n);Biao

34、DaShi();fprf(fpout, n);if(typeCur!=36)prf(语法错误,缺少)。错误行号%dn,lineCur);Body(); if(typeCur!=16)fprf(fpout, n);return 0;Body();fprf(fpout, n);return 1;XunHuanYuJu() /循环语句if(typeCur!=14)prf(语法错误,缺少 while。错误行号%dn,lineCur);/return 0;elsefprf(fpout, n,lineCur,stringCur); f(fpout, n);f(fpout, n,lineCur);Cur+;

35、 if(typeCur!=35)prf(语法错误,缺少(。错误行号%dn,lineCur);Cur+;fprf(fpout, n);BiaoDaShi();fprf(fpout, n);if(typeCur!=36)prf(语法错误,缺少)。错误行号%dn,lineCur);Body();fprf(fpout,n); return 1;DiaoYongYuJu()/函数调用语句fprf(fpout, n,lineCur,stringCur);Cur+; Cur+;fprf(fpout, n);while(typeCur!=36)if(typeCur=43|typeCur=44)fprf(fpo

36、ut, n,lineCur,stringCur);Cur+; if(typeCur=31)Cur+;else if(typeCur!=36)prf(语法错误,没有函数调用。错误行号%dn,lineCur);Cur+;fpr fprf(fpout, n); f(fpout, n);return 1;ReturnYuJu()fprf(fpout, n,lineCur);Cur+;fprf(fpout, n);if(typeCur=44)fprf(fpout, n,lineCur,stringCur);if(typeCur=43)f(fpout, n,lineCur,stringCur);prf(语

37、法错误,返回值类型错误。错误行号%dn,lineCur);Cur+;fpr fprf(fpout, n); f(fpout, n);return 1;void BiaoDaShi() /表达式Xiang(); if(typeCur=30|typeCur=36)return;elseif(typeCur-1=19)fprf(fpout, n,lineCur); if(typeCur-1=20)f(fpout, n,lineCur); if(typeCur-1=23)f(fpout, tree line=%dnodetype=LT nodestring=n,lineCur); if(typeCur

38、-1=24)f(fpout, tree line=%dnodetype=LTEQ nodestring=n,lineCur); if(typeCur-1=25)f(fpout, da else fprype=none/n,lineCur); if(typeCur-1=26)f(fpout, =da else fprype=none/=n,lineCur); if(typeCur-1=27)f(fpout, n,lineCur); if(typeCur-1=28)f(fpout, n,lineCur);BiaoDaShi();fprvoidfprf(fpout, n);Xiang() /项数f(

39、fpout, n);YinZi(); while(typeCur=21|typeCur=22)Cur+; YinZi();fprf(fpout, n);if(typeCur=19|typeCur=23|typeC ur=24|typeCur=25|typeCur=26|type Cur=27|typeCur=28|typeCur=20)Cur+;void YinZi() /因子switch(typeCur)case 35:Cur+; BiaoDaShi(); Cur+; break;case 43: if(typeCur+1=35)DiaoYongYuJu();elsefprf(fpout,n

40、,lineCur,stringCur);Cur+;break; case 44:fprf(fpout, n,lineCur,stringCur);Cur+; break; default:prf(语法错误,缺少因子。错误行号%dn,lineCur);void YuJuChuan() /语句串 YuJu();while(typeCur=30|(typeCur-1=40 &(typeCur=43|typeCur=15)|typeC ur=14)|typeCur=13)if(typeCur-1=40)if(typeCur=43|typeCur=15)Cur-;else if(typeCur=14|t

41、ypeCur=13)Cur-;Cur+; YuJu();void YuJu() /语句switch(typeCur)case 43: if(typeCur+1=35)if(DiaoYongYuJu()=1)prf(函数调用语句n);elseif(FuZhiYuJu()=1)prf(变量n);break; case 15:if(TiaoJianYuJu()=0)prf(if then 分支语句n,lineCur);elseprf(if then else 分支语句n);break; case 14:if(XunHuanYuJu()=1)prf(while do 循环语句n);break; cas

42、e 17: Cur+;fprf(fpout, n,lineCur,stringCur);Cur+; break; case 13:if(ReturnYuJu()=1)prf(Return 语句n);break;/*case 19: if(typeCur+1=19)fprf(fpout, n,lineCur,stringCur);/prf(语法错误,缺少语句。错误行号%dn,lineCur);fprf(fpout, n,lineCur,stringCur);void Body() /程序体Cur+; switch(typeCur)case 39: break; case 19:fprf(fpou

43、t, n,lineCur,stringCur);fprf(fpout,n); fpr f(fpout,n,lineCur,stringCur);break; default: Cur+; break;/prf(语法错误,缺少。错误行号%dn,lineCur);Cur+; if(typeCur!=40)YuJuChuan();switch(typeCur)case 40: break; default: Cur+; break;/prf(语法错误,缺少。错误行号%dn,lineCur);Cur+;void boddy()fpr fpr fpr fpr fpr fprvoidf(fpout,f(fpout,f(fpout,f(fpout,f(fpout,f(fpout,n);n);n);n);n);n);ChengXu()

温馨提示

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

评论

0/150

提交评论