您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 2015广工编译原理实验报告(文档最后含源码下载地址)
实验报告课程名称编译原理题目名称PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术13(9)学号学生姓名指导教师林志毅2015年12月24日PL/0修改扩充实验一:实验要求:对PL/0作以下修改扩充:(1)增加单词:保留字ELSE,FOR,STEP,UNTIL,DO,RETURN运算符*=,/=,&,||,!(2)修改单词:不等号#改为(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。二:实验环境与工具(1)计算机及操作系统:PC机,Windows7(2)程序设计语言:C++(3)使用软件BorlandC++Builder6.0(4)教学型编译程序:PL/0三:题目分析与设计第一部分:增加单词1)修改变量定义constNORW=19;/*#OFRESERVEDWORDS*/intSBNUM=43;typedefenum{NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,PROGSYM,ELSESYM,FORSYM,STEPSYM,UNTILSYM,RETURNSYM,TIMESBECOMES,SLASHBECOMES,ANDSYM,ORSYM,NOTSYM}SYMBOL;char*SYMOUT[]={NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,PROGSYMELSESYM,FORSYM,STEPSYM,UNTILSYM,RETURNSYM,TIMESBECOMES,SLASHBECOMES,ANDSYM,ORSYM,NOTSYM};strcpy(KWORD[1],BEGIN);strcpy(KWORD[2],CALL);strcpy(KWORD[3],CONST);strcpy(KWORD[4],DO);strcpy(KWORD[5],ELSE);//增加字1strcpy(KWORD[6],END);strcpy(KWORD[7],FOR);//增加字2strcpy(KWORD[8],IF);strcpy(KWORD[9],ODD);strcpy(KWORD[10],PROCEDURE);strcpy(KWORD[11],PROGRAM);strcpy(KWORD[12],READ);strcpy(KWORD[13],RETURN);//增加字5strcpy(KWORD[14],STEP);//增加字3strcpy(KWORD[15],THEN);strcpy(KWORD[16],UNTIL);//增加字4strcpy(KWORD[17],VAR);strcpy(KWORD[18],WHILE);strcpy(KWORD[19],WRITE);WSYM[1]=BEGINSYM;WSYM[2]=CALLSYM;WSYM[3]=CONSTSYM;WSYM[4]=DOSYM;WSYM[5]=ELSESYM;WSYM[6]=ENDSYM;WSYM[7]=FORSYM;WSYM[8]=IFSYM;WSYM[9]=ODDSYM;WSYM[10]=PROCSYM;WSYM[11]=PROGSYM;WSYM[12]=READSYM;WSYM[13]=RETURNSYM;WSYM[14]=STEPSYM;WSYM[15]=THENSYM;WSYM[16]=UNTILSYM;WSYM[17]=VARSYM;WSYM[18]=WHILESYM;WSYM[19]=WRITESYM;在voidSTATEMENT(SYMSETFSYS,intLEV,int&TX){}函数中增加:caseELSESYM:GetSym();Form1-printfs(====ELSESYM====);break;caseSTEPSYM:GetSym();Form1-printfs(====STEPSYM====);break;caseUNTILSYM:GetSym();Form1-printfs(====UNTILSYM====);break;caseFORSYM:GetSym();Form1-printfs(====FORSYM====);break;caseRETURNSYM:GetSym();Form1-printfs(====RETURNSYM====);break;caseTIMESBECOMES:GetSym();Form1-printfs(~~~~*=~~~~);break;caseSLASHBECOMES:GetSym();Form1-printfs(~~~~/=~~~~);break;caseANDSYM:GetSym();Form1-printfs(~~~~&~~~~);break;caseORSYM:GetSym();Form1-printfs(~~~~||~~~~);break;caseNOTSYM:GetSym();Form1-printfs(~~~~!~~~~);break;2)修改GetSym()方法elseif(CH=='*'){GetCh();if(CH=='='){SYM=TIMESBECOMES;GetCh();}elseSYM=TIMES;}elseif(CH=='/'){GetCh();if(CH=='='){SYM=SLASHBECOMES;GetCh();}elseSYM=SLASH;}elseif(CH=='&'){GetCh();SYM=ANDSYM;}elseif(CH=='|'){GetCh();if(CH=='|'){SYM=ORSYM;GetCh();}elseError(19);}elseif(CH=='!'){GetCh();SYM=NOTSYM;}else{SYM=SSYM[CH];GetCh();}第二部分:修改单词(将不等号#改为)elseif(CH==''){GetCh();if(CH=='='){SYM=LEQ;GetCh();}elseif(CH==''){SYM=NEQ;GetCh();}elseSYM=LSS;}第三部分:增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。设计细节,包括:相关文法、语法图、语义规则1)语法图2)修改STATEMENT()方法(只需要写出caseIFSYM:部分的代码)caseIFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);if(SYM==THENSYM)GetSym();elseError(16);CX1=CX;GEN(JPC,0,0);STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);if(SYM==SEMICOLON)GetSym();elseError(5);//漏掉分号if(SYM!=ELSESYM)CODE[CX1].A=CX;else{GetSym();CX2=CX;GEN(JMP,0,0);CODE[CX1].A=CX;STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);CODE[CX2].A=CX;}break;四:测试部分1.扩充单词的测试PL0源码:PROGRAMEX01;VARA,B,C;BEGINA:=88;READ(B);ELSE;FOR;STEP;UNTIL;RETURN;*=;/=;&;||;!;C:=A+B*(3+B);WRITE(C);END.测试结果:2.修改单词的测试(需给出测试的PL0源码)PL0源码:PROGRAMEX01;VARA,B,C;BEGINA:=88;READ(B);IFBATHENWRITE(B);END.测试结果:3.扩充else的测试(需给出测试的PL0源码)PL0源码:PROGRAMEX01;VARA,B,C;BEGINA:=88;READ(B);IFBATHENWRITE(B);ELSEWRITE(A);END.测试结果:五:总结总的来说,我体会到的觉得不仅仅是说对编译器进行了什么修改完成了什么功能了收获感,觉得更多的是在理解编译原理这门课程的基础上,对编译器执行代码编译的过程有了一个全新的认识。其中增进了对PL0程序编译过程的理解,包括如何进行词法分析,语法分析,语义分析等过程。但是对整个程序的详细运行过程及函数块功能还不是太理解,所以在完成的过程中,心中还是存在很多疑惑,尽管通过向同学请教解决了一些小问题,但还是缺乏深入的学习和研究。接下来会花多点时间学习,尽量达到能够了解整个程序的原理及详细运行过程。源码下载地址:
本文标题:2015广工编译原理实验报告(文档最后含源码下载地址)
链接地址:https://www.777doc.com/doc-5044036 .html