1 / 13
文档名称:

语义分析实验报告(实验三).doc

格式:doc   大小:102KB   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

语义分析实验报告(实验三).doc

上传人:gxngqvk 2020/8/30 文件大小:102 KB

下载得到文件列表

语义分析实验报告(实验三).doc

文档介绍

文档介绍:编译原理语义分析实验报告软工082班兰洁4实验内容实验目的实验要求程序流程图程序代码与主要过程说明测试用例输出结果实验心得实验内容定义模拟的简单语言的语义成分,将语义分析程序编制成一个子程序,在实验2分析出个语法单位后,分析其含义,并将可执行语句或表达式翻译成四元式输出,并将错误信息输出。实验目的通过上机实验,加深对语义制导翻译原理的理解,掌握将语法分析所识别的语法成分变换成为中间代码的语义翻译方法。实验要求采用递归下降语法制导翻译方法,对算术表达式、赋值语句进行语义分析并生成四元式序列。例如:对于语句串Functiona=2+3*4;x=(a+b)/c;endfunc#输出的三地址指令如下t1=3*4t2=2+t1a=t2t3=a+bt4=t3/cx=t4程序流程图由于语义分析的的方法就是在语法分析过程中,根据每个产生式所对应的语义子程序进行翻译,为每个产生式配上一个翻译子程序,并在语法分析的同时执行这些子程序。所有对应的流程图与语法分析流程图大同小异,关于各类函数的流程图我已经在词法分析报告与语法分析报告中详细画出,所以这里只说明程序主要流程。程序代码与主要过程说明/*语义分析源代码*/#include<>#include<>#include<>#include<>#include<>structquad//四元式表{ charresult[12]; charag1[12]; charop[12]; charag2[12];};structquadquad[30];intcount=0;char*expression(void);charprog[200],token[9];charch;intsyn,p,m,n,sum=0;intkk=0,k=0;char*rwtab[6]={"function","if","then","while","do","endfunc"};voidscaner(){ m=0; for(n=0;n<8;n++) token[n]='\0'; ch=prog[p++]; while(ch=='') ch=prog[p++]; if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) { token[m++]=ch; ch=prog[p++]; }//endofwhile token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++){ if(strcmp(token,rwtab[n])==0) { syn=n+1; break;} }//endoffor } elseif(ch>='0'&&ch<='9') { sum=0; while(ch>='0'&&ch<='9') {sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=11; } else { switch(ch) { case'<':m=0;token[m++]=ch; ch=prog[++p]; if(ch=='=') { syn=22; token[m+1]=ch; } else { syn=20; ch=prog[--p];} break; case'>':m=0;token[m++]=ch; ch=prog[++p]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; ch=prog[--p]; } break; case'=':m=0,token[m++]=ch; ch=prog[++p]; if(ch=='=') { syn=25; token[m++]=ch; } else { syn=18; ch=prog[--p]; } break; case'!':m=0;token[m++]=ch;ch=prog[++p]; if(ch=='=') { syn=22; token[m+1]=ch;} else { syn=-1;} break; case'+':syn=13;token[0]=ch;break; case'-':syn=14;token[0]=ch;break; case'*':syn=15;token[0]=ch;break; case'/':syn=16;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28