简单编译器.doc_第1页
简单编译器.doc_第2页
简单编译器.doc_第3页
简单编译器.doc_第4页
简单编译器.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:编译原理 课程类型:必修实验项目名称: 编译器前端实验题目: 大作业班级:10703107学号:1070310701姓名:郭辰设计成绩报告成绩指导老师一、实验目的通过实现一个可以把类似c语言的源代码转变为中间代码的编译器,更好地理解编译的过程,锻炼自己的编程能力。二、实验要求及实验环境要求:完成类高级语言的编译器前端的设计与实现环境:格物208机房,自己的的笔记本电脑。三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1逻辑设计语言文法设计:1.表达式EETTTTFFF(F)|id2.布尔表达式BB or C|CCB and B|HHnot A|AAi i|ii|i=i3.语句文法SidESif B then SSif B then S else SSwhile B do SS L LL;S |S4.说明语句P DD D;SD id:ZD D;DZ int词类编码表:01 and2 bool3 char4 do5 else6 FALSE7 float8 for9 if10 int11 not12 or13 then14 TRUE15 while16 标识符17 整常数18 实常数19 (20 )21 *22 +23 ,24 26 =27 =28 :29 ;30 31 进行词法分析后,选用自顶向下递归下降的方法,分析语法的同时进行语义动作。终结非终结符的属性用结构体定义。/*单词词类编码*/char bm3210 = ,and,bool,char,do,else,FALSE,float,for,if, int,not,or,then,TRUE,while,标识符,整常数,实常数,(,),*, +,=,=,:,;,;/*初始化标识符符表*/char bzfb1MAXSIZE10 = ;/*初始化整常数表*/int zcsb1MAXSIZE = ;属性:struct char id_stead; id_bzf;struct char type10; int width;Z_syn;struct char addr10;E_syn,T_syn,F_syn,T_syn,T_1_syn,E_syn,E_1_syn,id_bzf_syn;struct char addr10;B_syn,C_syn,B_syn,B_1_syn,H_syn,C_syn,C_1_syn,H_syn,id1,id2;词法分析器语法语义分析器原始代码 token字 中间代码2物理设计词法分析: 逐字读文件,与词汇表比较,相同的用对应编码替换输出。遇到数字和标识符时,多存一个编码,记录其内容。语法语义分析:采用递归下降方法,把消除左递归的文法逐码判断,递归调用非终结符命名的函数。修改后的文法:说明语句: P D D id:ZD| D D|S D ;DD| 语句文法: S id=E|if B then S S|while B do S|L S else S| L SL L ;SL| 表达式: E TE E +TE| T FT T *FT| F (E)|id 布尔表达式: B CB B or CB| C HC C and HC| H not B|id H H id|=id四、测试结果试验用程序:a:int;b:int; if a0 and c0 then a=0 else a=1; while a5 do a=a+1输出结果:五、系统不足与经验体会没有处理浮点数的功能,输出不太标准。要编出一个完善的编译器是很不容易的!六、附录:源代码(带注释)#include #include #include #include #define FILENAME D:test.txt /*文件的路径*/#define RESULTFILE D:token.txt /*结果文件路径*/#define MAXSIZE 30 /*最大变量个数*/*单词词类编码*/char bm3210 = ,and,bool,char,do,else,FALSE,float,for,if, int,not,or,then,TRUE,while,标识符,整常数,实常数,(,),*, +,=,=,:,;,;/*初始化标识符符表*/char bzfb1MAXSIZE10 = ;/*初始化整常数表*/int zcsb1MAXSIZE = ;/*初始化实常数表*/float scsbMAXSIZE = ;int func1(char str10);int main1() /*打开文件*/ int fh; fh = open(FILENAME, O_RDONLY); FILE* fp = fopen(RESULTFILE, w); if(fh = -1) fprintf(fp, File open failed!n); return -1; char buf10; int i; int j; int k; int n; int numofbzf,numofzcs,numofscs,numofzero; numofbzf = 0; numofzcs = 0; numofscs = 0; numofzero = 0; while(1) k = 0; sym1:for(i=0;i= 20) goto sym5; k+; while(bufi = | bufi = 0 | bufi = n); do k = 0; for(j=1;j= 19 & j= 31) if(buf0 = =) read(fh, &buf1, 1); if(buf1 = =) j+; else lseek(fh, -1L, SEEK_CUR); fprintf(fp, n, j); goto sym1; break; n = j; i+; read(fh,&bufi, 1); if(bufi = ( | bufi = )| bufi = *| bufi = +| bufi = ,| bufi = | bufi = =| bufi = ;| bufi = :| bufi = | bufi = ) lseek(fh, -1L, SEEK_CUR); goto sym4; while(bufi != & bufi != 0 & bufi != n); sym4: bufi = 0; if(n 19) fprintf(fp, n, n); goto sym1; if(buf0=65 & buf0=97 & buf0=122) for(k=0;k=numofbzf;k+) if(!strcmp(bzfb1k, buf) fprintf(fp, n, k); goto sym2; for(k=1;k=65 & bufk=97 & bufk=48 & bufk = 57) fprintf(fp, invalid symboln); goto sym1; strcpy(bzfb1numofbzf, buf); fprintf(fp, n, numofbzf); numofbzf+; sym2:; if(buf0=48 & buf0=57) int ppp = 0; int pppp = 0; for(k=0;k=48 & bufk=57) fprintf(fp, invalid symboln); goto sym1; else ppp = (int)bufk-48; for(j=0;j(i-k-1);j+) ppp = ppp*10; pppp = pppp + ppp; for(k=0;k=numofzcs;k+) if(pppp = zcsb1k) fprintf(fp, n, k); if(pppp = 0 & numofzero = 0) numofzcs+; numofzero+; goto sym3; zcsb1numofzcs = pppp; fprintf(fp, n, numofzcs); numofzcs+; sym3:; sym5: close(fh); fclose(fp); return 0;int token200 = ;int token_cur;char current_char;int i=0;int j=0;int k=0;/*初始化标识符符表*/int bzfbMAXSIZE = ;/*初始化整常数表*/int zcsbMAXSIZE = ;int num_of_bzf = 0;int num_of_zcs = 0;int offset;struct char id_stead; id_bzf;struct char type10; int width;Z_syn;struct char addr10;E_syn,T_syn,F_syn,T_syn,T_1_syn,E_syn,E_1_syn,id_bzf_syn;struct char addr10;B_syn,C_syn,B_syn,B_1_syn,H_syn,C_syn,C_1_syn,H_syn,id1,id2;int get_token();void advanced();void P();void D();void D_();void D_();void Z();void S();void S_();void L();void L_();void E();void E_();void T();void T_();void F();void B();void B_();void C();void C_();void H();void H_();int main() main1(); get_token(); i = -1; / FILE* fp2 = fopen(RESULTFILE, w); num_of_bzf = 0; num_of_zcs = 0; P(); / fclose(fp2); return 0;int get_token() int ppp; FILE* fp1 = fopen(RESULTFILE, r); fseek(fp1, 0, SEEK_SET); while(1) sym1:do current_char = fgetc(fp1); if(feof(fp1) != 0) fclose(fp1); return 0; while(current_char != =48 & current_char Dn); offset = 0; D();void D() advanced(); if(token_cur = 16) id_bzf.id_stead = bzfbnum_of_bzf; num_of_bzf+; advanced(); if(token_cur = 28) / printf(D - id:TD_n); Z(); printf(enter(%c, %s, %d)n, id_bzf.id_stead, Z_syn.type, offset); offset = offset + Z_syn.width; D_(); else printf(error in D()n); else / printf(D - $n); i = i - 1; void D_() advanced(); if(token_cur = 30) / printf(D_ - Sn); i = i-1; S(); else / printf(D_ - Dn); i = i-1; D(); void D_() advanced(); if(token_cur = 29) / printf(D_ - ;D_D_n); D_(); D_(); else / printf(D_ - $n); i = i-1; void Z() advanced(); int i; for(i=0;i intn); Z_syn.type0 = i; Z_syn.type1 = n; Z_syn.type2 = t; Z_syn.width = 4; else printf(error in Z()n); void S() advanced(); if(token_cur = 16) id_bzf_syn.addr0 = bzfbnum_of_bzf; num_of_bzf+; advanced(); if(token_cur = 26) / printf(S - id = En); E(); printf(=, %s, , %sn, E_syn.addr, id_bzf_syn.addr); else printf(error in S()n); else if(token_cur = 9) / printf(S - if B then S S_n); B(); printf(jnz, %s, , K+2n, B_syn.addr); printf(j, , , n); advanced(); if(token_cur = 13) S(); S_(); else printf(error in S()n); else if(token_cur = 15) / printf(S - while B do Sn); B(); printf(jnz, %s, , L%d+2n, B_syn.addr, k); printf(j, , , n); advanced(); if(token_cur = 4) S(); printf(j, , , L%d, k); else printf(error in S()n); else if(token_cur = 30) / printf(S - Ln); L(); advanced(); if(token_cur != 31) printf(error in S()n); else printf(error in S()n); void S_() advanced(); if(token_cur = 5) / printf(S_ - else Sn); printf(jz, %s, , K+2n, B_syn.addr); printf(j, , , n); S(); else / printf(S_ - $n); i = i - 1; void L() / printf(L - SL_n); S(); L_();void L_() advanced(); if(token_cur = 29) / printf(L_ - ;SLn); S(); L_(); else / printf(L_ - $n); i = i - 1; void E() / printf(E - TE_n); T(); strcpy(E_syn.addr,T_syn.addr); E_(); strcpy(E_syn.addr, E_syn.addr);void E_() advanced(); if(token_cur = 22) / printf(E_ - +TE_n); T(); printf(+, %s, %s, t%dn, E_syn.addr, T_syn.addr, j); E_1_syn.addr0 = t; E_1_syn.addr1 = (char)(j+48); j+; E_(); strcpy(E_syn.addr, E_1_syn.addr); else / printf(E_ - $n); i = i - 1; void T() / printf(T - FT_n); F(); strcpy(T_syn.addr,F_syn.addr); T_(); strcpy(T_syn.addr, T_syn.addr);void T_() advanced(); if(token_cur = 21) / printf(T_ - *FT_n); F(); printf(*, %s, %s, t%dn, T_syn.addr, F_syn.addr, j); T_1_syn.addr0 = t; T_1_syn.addr1 = (char)(j+48); j+; T_(); strcpy(T_syn.addr,T_1_syn.addr); else / printf(T_ - $n); i = i - 1; void F() advanced(); if(token_cur = 19) / printf(F - (E)n); E(); strcpy(F_syn.addr, E_syn.addr); advanced(); if(token_cur != 20) printf(error in F()n); else if(token_cur = 16 | token_cur = 17) / printf(F - idn); if(token_cur = 16) F_syn.addr0 = bzfbnum_of_bzf; num_of_bzf+; if(token_cur = 17) F_syn.addr0 = (char)(zcsbnum_of_zcs+48); num_of_zcs+; else printf(error in F()n); void B() / printf(B - CB_n); C(); strcpy(B_syn.addr,C_syn.addr); B_(); strcpy(B_syn.addr,B_syn.addr);void B_() advanced(); if(token_cur = 12) / printf(B_ - or CB_n); C(); printf(or, %s, %s, t%dn, B_syn.addr, C_syn.addr, j); B_1_syn.addr0 = t; B_1_syn.addr1 = (char)(j+48); j+; B_(); strcpy(B_syn.addr,B_1_syn.addr); else / printf(B_ - $n); i = i - 1; void C()/ printf(C - HC_n); H(); strcpy(C_syn.addr,H_syn.addr); C_(); strcpy(C_syn.addr,C_syn.addr);void C_() advanced(); if(token_cur = 1) / printf(C_ - and HC_n); H(); printf(and, %s, %s, t%dn, C_syn.addr, H_syn.addr, j); C_1_syn.addr0 = t; C_1_syn.addr1 = (char)(j+48); j+; C_(); strcpy(C_syn.addr,C_1_syn.addr); else / printf(C_ - $n); i = i - 1; void H() advanced(); if(token_cur = 11) / printf(H - not Bn); B(); printf(not, %s, , t%dn, B_syn.addr, j); H_syn.addr0 = t; H_syn.addr1 = (char)(j+48); j+; else if(token_cur = 16 | token_cu

温馨提示

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

评论

0/150

提交评论