您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 附录一第二篇第5章语义分析中语义子程序的设计(C型程序)
附录一第二篇第5章语义分析中语义子程序的设计(C型程序)实习题5.2基于自顶向下方式翻译方案的属性值计算关于所给翻译方案的各个语义子程序(C型)可设计如下:void_1()/*{R.i:=T.val}*/{NR=分析栈[tops].结点序号;U=注释分析树[NR].文法符号序号;NT=注释分析树[NR].左兄结点序号;NTval=search(NT,val);/*实现参看实习题5.1,下同*/Tval=属性信息表[NTval].属性值;PTval=Dpointer({NTval,NULL});/*实现参看实习题5.1,下同*/A=A+1;属性信息表[A]={A,U,i,I,Tval,PTval,NR};/*实现参看实习题5.1,下同*/注释分析树[NR].属性信息链=Apointer({A,NULL});/*由下面两行实现,下同*//*pA=Apointer({A,NULL});//指向属性结点注释分析树[NR].属性信息链=pA;*/}void_2()/*{E.val:=R.s}*/{NR=CurR;/*CurR是全局变量*/NRs=search(NR,s);Rsval=属性信息表[NRs].属性值;PRs=Dpointer({NRs,NULL});NE=注释分析树[NR].父结点序号;U=注释分析树[NE].文法符号序号;A=A+1;属性信息表[A]={A,U,val,I,Rsval,PRs,NE};注释分析树[NE].属性信息链=Apointer({A,NULL});}void_3()/*{R1.i:=R.i+T.val}*/{NR1=分析栈[tops].结点序号;U=注释分析树[NR1].文法符号序号;NR=注释分析树[NR1].父结点;NRi=search(NR,i);NT=注释分析树[NR].左兄结点序号;NTval=search(NT,val);PTval=Dpointer({NTval,NULL});PRi=Dpointer({NRi,PTval});R1ival=属性信息表[NRi].属性值+属性信息表[NTval].属性值;A=A+1;属性信息表[A]={A,U,i,I,R1ival,PRi,NR1};注释分析树[NR1].属性信息链=Apointer({A,NULL});}void_4()/*{R.s:=R1.s}*/{NR1=CurR;NR1s=search(NR1,s);R1sval=属性信息表[NR1s].属性值;PR1sval=Dpointer({NR1s,NULL});NR=注释分析树[NR1].父结点序号;CurR=NR;U=注释分析树[NR].文法符号序号;A=A+1;属性信息表[A]={A,U,s,I,R1sval,PR1sval,NR};/*把属性信息表序号A链入注释分析树中结点NR的属性信息链*/pA=Apointer({A,NULL});/*指向属性结点*/注释分析树[NR].属性信息链=AppendAlink(pA,注释分析树[NR].属性信息链);}void_5()/*{R1.i:=R.i-T.val}*/{NR1=分析栈[tops].结点序号;U=注释分析树[NR1].文法符号序号;NR=注释分析树[NR1].父结点;NRi=search(NR,i);NT=注释分析树[NR].左兄结点序号;NTval=search(NT,val);R1ival=属性信息表[NRi].属性值-属性信息表[NTval].属性值;PTval=Dpointer({NTval,NULL});PRi=Dpointer({NRi,PTval});A=A+1;属性信息表[A]={A,U,i,I,R1ival,PRi,NR1};注释分析树[NR1].属性信息链=Apointer({A,NULL});}void_6()/*R::={R.s:=R.i}*/{NR=注释分析树[N].父结点序号;CurR=NR;U=注释分析树[NR].文法符号序号;NRi=search(NR,i);Rsval=属性信息表[NRi].属性值;PRi=Dpointer({NRi,NULL});A=A+1;属性信息表[A]={A,U,s,I,Rsval,PRi,NR};注释分析树[NR].属性信息链=Apointer({A,NULL});}void_7()/*T::=(E{T.val:=E.val})*/{NE=注释分析树[N].左兄结点序号;NEval=search(NE,val);Eval=属性信息表[NEval].属性值;PEval=Dpointer({NEval,NULL});NT=注释分析树[NE].父结点序号;U=注释分析树[NT].文法符号序号;A=A+1;属性信息表[A]={A,U,val,I,Eval,PEval,NT};注释分析树[NT].属性信息链=Apointer({A,NULL});}void_8()/*T::=n{T.val:=n.lexval}*/{nval=STOI(Input[k]);/*STOI进行数字字符串到整值的转换*/U=n在VT中的序号;A=A+1;属性信息表[A]={A,U,lexval,I,nval,NULL,N};NT=注释分析树[N].父结点;U=注释分析树[NT].文法符号序号;Pnval=Dpointer({A,NULL});A=A+1;属性信息表[A]={A,U,val,I,nval,Pnval,NT};注释分析树[NT].属性信息链=Apointer({A,NULL});}其中函数AppendAlink可定义如下:属性结点类型*AppendAlink(属性结点类型*back,属性结点类型*front){/*把属性信息链back链入front的最后结点之后*/p=front;q=NULL;while(p!=NULL){q=p;p=p-下一属性结点;}if(q)q-下一属性结点=back;elsefront=back;returnfront;}实习题5.4赋值语句目标代码生成赋值语句目标代码生成的C型伪代码程序如下:void基于LR(1)分析技术生成赋值语句目标代码(){/*输入符号串在读入缓冲区Input中*/置初值;/*从输入符号串建立语法分析树末端结点符号串,并填属性信息表*/m=0;N=0;for(j=1;j=输入符号串长度;j++){m=m+1;N=N+1;注释分析树[N]={N,Input[m]在VT中的序号,0,0,0,NULL};/*实现参看实习题5.1,其中Input[m]在VT中的序号如下求得:for(k=1;k=VT中元素总数;k++)if(Input[m]==VT[k]){Input[m]在VT中的序号=k;break;}*/if(Input[m]是i){A=A+1;属性信息表[A]={A,i在VT中的序号,name,S,Input[m],NULL,N};/*实现参看实习题5.1*/注释分析树[N].属性信息链=Apointer({A,NULL});/*实现参看实习题5.1*/}}tops=0;分析栈[tops]={状态0,#结点序号0};/*#无相应结点*/Scontinue=1;/*true;移入时继续*/Rcontinue=1;/*true;归约时继续*/k=0;/*k是输入符号串位置指针*/while(Scontinue){k=k+1;R=Input[k]在VT中的序号;S=分析栈[tops].状态;while(Rcontinue)/*Rwhile循环*/{act=ACTION[S][R];if(act==999)/*acc成功*/{输出“成功结束,输出所生成的目标代码”;Scontinue=0;Rcontinue=0;/*false*/continue;/*转向Rwhile循环开始处*/}if(act0){tops=tops+1;分析栈[tops]={act,k};/*由构造法,k即结点序号*/Rcontinue=0;/*false*/continue;/*转向Rwhile循环开始处*/}if(act==0){输出“出错,当前输入符号为:”;输出VT[R];Scontinue=0;Rcontinue=0;/*false*/continue;/*转向Rwhile循环开始处*/}/*act0归约*/act=-act;/*建立分支名字结点,并建立父子兄弟结点关系*/U=翻译方案[act].左部符号序号;m=翻译方案[act].右部长度;/*若可能规则右部长度等于零,执行下列if语句*/if(m==0){N=N+1;注释分析树[N]={N,0,0,0,0,NULL};tops=tops+1;分析栈[tops]={0,N};m=1;}右子结点序号=分析栈[tops].结点序号;N=N+1;/*分支名字结点*/注释分析树[N]={N,U,0,0,右子结点序号,NULL};bro=0;for(j=1;j=m;j++){分支结点序号=分析栈[tops-(m-j)].结点序号;注释分析树[分支结点序号].父结点序号=N;注释分析树[分支结点序号].左兄结点序号=bro;bro=分支结点序号;}语义子程序(act);tops=tops-m;NewS=GOTO[分析栈[tops].状态][U-100];/*U=VN中序号+100*/tops=tops+1;分析栈[tops]={NewS,N};}/*Rcontinue;*/}/*Scontinue*/输出注释分析树;}按规则归约时所执行的语义子程序(C型)如下:void语义子程序(intact){switch(act){case1:_1();break;case2:_2();break;case3:_3();break;case4:_4();break;case5:_5();break;case6:_6();break;}}各语义子程序可设计如下:void_1()/*A::=i=E*/{NE=分析栈[tops].结点序号;NEcode=search(NE,″code″);Ecode=属性信息表[NEcode].属性值;NEplace=search(NE,″place″);if(Ecode==NULL)/*判E.code=″″*/{Ntemp=Ntemp+1;t=r||ITOS(Ntemp);/*||表示串并置(连接)运算符,实现如下行*//*strcpy(t,r);strcat(t,ITOS(Ntemp));*/Epalce=属性信息表[NEplace].属性值;Ecode=Ipointer({MOV||属性信息表[Eplace].属性值||t,NULL});/*Ecode=(目标指令类型*)malloc(sizeof(目标指令类型));strcpy(C.OP,MOV);strcpy(C.源,属性信息表[Eplace].属性值);strcpy(C.目标,t);Ecode虚拟机指令=C;Ecode-下一目标指令=NULL;*/strcpy(属性信息表[NEplace].属性值,t);属性信息表[NEcode].属性值=Ecode;}Ni=分析栈[tops-2].结点序号;Niplace=search(Ni,″name″);Acode=copycode(Ecode,Acode);C1=Ipointer({″MOV″||属性信息表[NEplace].属性值||属性信息表[Niplace].属性值,NULL});/*C1=(目标指令类型*)malloc(sizeof(目标指令类型));strcpy(C.OP,MOV);strcpy(C.源,属性信息表[NEplace].属性值);strcpy(C.目标,属性信息表[Niplace].属性值);C1-虚拟机指令=C;C1-下一目标指令=NULL;*/Acode=AppendCode(C1,Acode);PEco
本文标题:附录一第二篇第5章语义分析中语义子程序的设计(C型程序)
链接地址:https://www.777doc.com/doc-2000998 .html