1、附录一第二篇第5章语义分析中语义子程序的设计C型程序附录一-第二篇第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,NU
2、LL);/*实现参看实习题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=
3、注释分析树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.属性值+属
4、性信息表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的属
5、性信息链*/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
6、(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( ) /*
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(Inputk); /*STOI进行数字字符串到整值的转换*/ U=n在V
8、T中的序号;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!=
9、NULL) q=p; p=p-下一属性结点;if(q)q-下一属性结点=back;else front=back;return front;实习题5.4 赋值语句目标代码生成赋值语句目标代码生成的C型伪代码程序如下:void 基于LR(1)分析技术生成赋值语句目标代码( ) /*输入符号串在读入缓冲区Input中*/置初值;/*从输入符号串建立语法分析树末端结点符号串,并填属性信息表*/m=0; N=0;for(j=1; j=输入符号串长度; j+) m=m+1; N=N+1; 注释分析树N=N,Inputm在VT中的序号, 0,0,0, NULL;/* 实现参看实习题5.1,其中Inputm
10、在VT中的序号如下求得:for(k=1; k0) tops=tops+1; 分析栈tops=act, k;/*由构造法,k即结点序号*/Rcontinue=0; /*false*/continue; /*转向Rwhile循环开始处*/ if(act=0) 输出“出错,当前输入符号为:”;输出VTR;Scontinue=0; Rcontinue=0; /*false*/continue; /*转向Rwhile循环开始处 */* act0 归约*/act=-act; /* 建立分支名字结点,并建立父子兄弟结点关系*/U=翻译方案act.左部符号序号;m=翻译方案act.右部长度; /* 若可能规则
11、右部长度等于零,执行下列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下一目标指令=NULL; */strcpy(属性信息表NEplace.属性值, t); 属性信息表NEcode.属性值=Ecode;Ni=分析栈tops-2.结点序号;Niplace=search(Ni,name); Acode=copycode(Ecode,A
12、code);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);PEcode=Dpointer(NEcode,NULL); PEplace=Dpointer(NEplace,PEcode)
13、; Piplace=Dpointer(Niplace,PEplace);A=A+1;属性信息表A=A,U,code, M,Acode, Piplace, N;注释分析树N.属性信息链=Apointer(A,NULL);/*实现参看实习题5.2 */void _2( ) /* E:=E1+E2 */ Ntemp=Ntemp+1; A=A+1; 属性信息表A=A,U,place,S, r|ITOS(Ntemp),NULL,N;NEl=分析栈tops-2.结点序号; NE1code=search(NEl, code);NE2=分析栈tops.结点序号; NE2code=search(NE2, cod
14、e);E1code=属性信息表NE1code.属性值; E2code=属性信息表NE2code.属性值;Ecode=copycode(E1code,Ecode); Ecode=mergecode(E2code,Ecode);NE1place=search(NEl, place); NE2place=search(NE2, place);C2=Ipointer(ADD|属性信息表NE2place.属性值|属性信息表A.属性值, NULL);C1=Ipointer(MOV|属性信息表NE1place.属性值|属性信息表A.属性值, C2);Ecode=AppendCode(C1, Ecode);P
15、E2place=Dpointer(NE2place,NULL);PE1place=Dpointer(NE1place,PE2place);PE2code=Dpointer(NE2code, PE1place ); PE1code=Dpointer(NE1code,PE2code);PA1=Apointer(A,NULL);/*指向属性结点*/A=A+1; 属性信息表A=A,U,code, M,Ecode, PE1code,N;注释分析树N.属性信息链=Apointer(A,PA1); void _3( ) /* E:=E1*E2 */ Ntemp=Ntemp+1; A=A+1; 属性信息表A=
16、A,U,place,S, r|ITOS(Ntemp),NULL,N; NEl=分析栈tops-2.结点序号; NE1code=search(NEl, code); NE2=分析栈tops.结点序号; NE2code=search(NE2, code); E1code=属性信息表NE1code.属性值; E2code=属性信息表NE2code.属性值;Ecode=copycode(E1code,Ecode); Ecode=mergecode(E2code,Ecode);NE1place=search(NEl, place); NE2place=search(NE2, place);C2=Ipoi
17、nter(MPY|属性信息表NE2place.属性值|属性信息表A.属性值, NULL);C1=Ipointer(MOV|属性信息表NE1place.属性值|属性信息表A.属性值, C2);Ecode=AppendCode(C1,Ecode); PE2place=Dpointer(NE2place,NULL); PE1place=Dpointer(NE1place,PE2place);PE2code =Dpointer(NE2code,PE1place);PE1code=Dpointer(NE1code,PE2code);PA1=Apointer(A,NULL); A=A+1; 属性信息表A=
18、A,U,code,M,Ecode, PE1code, N;注释分析树N.属性信息链=Apointer(A,PA1);void _4( ) /* E:=-E1 */ Ntemp=Ntemp+1; A=A+1;属性信息表A=A,U,place,S, r|ITOS(Ntemp),NULL,N;NE1=分析栈tops.结点序号; NE1code=search(NE1, code);E1code=属性信息表NE1code.属性值;Ecode=copycode(E1code, Ecode); NE1place=search(NE1,place);C2=Ipointer(NEG|属性信息表A.属性值, NU
19、LL);C1=Ipointer(MOV|属性信息表NE1place.属性值|属性信息表A.属性值,C2);Ecode=AppendCode(C1,Ecode);PE1place=Dpointer(NE1place,NULL); PE1code=Dpointer(NE1code,PE1place);PA1=Apointer(A, NULL); A=A+1; 属性信息表A=A,U,code,M, Ecode, PE1code, N;注释分析树N.属性信息链=Apointer(A,PA1);void _5( ) /* E:=(E1) */ NE1=分析栈tops-1.结点序号; NE1place=s
20、earch(NE1, place);PE1place=Dpointer(NE1place,NULL);A=A+1;属性信息表A=A,U,place, S, 属性信息表NE1place.属性值,PE1place, N;PA1=Apointer(A, NULL);NE1code=search(NE1, code); PE1code=Dpointer(NE1code,NULL); A=A+1;属性信息表A=A,U,code, M, 属性信息表NE1code.属性值,PE1code, N;注释分析树N.属性信息链=Apointer(A,PA1);void _6( ) /* E:= i */ Ni=分析
21、栈tops.结点序号; Niplace=search(Ni, name);Piplace=Dpointer(Niplace, NULL); A=A+1; 属性信息表A=A,U,place,S, 属性信息表Niplace.属性值,Piplace, N;PA1=Apointer(A, NULL);A=A+1;属性信息表A=A,U,code, M, NULL,NULL, N;注释分析树N.属性信息链=Apointer(A,PA1);其中,函数ITOS可定义如下:char * ITOS (int N) d=N; k=0; while(d!=0) sk+=d%10+0; d=d/10; for(j=k-
22、1; jk/2; j-) t=sj; sj=sk-1-j; sk-1-j=t; sk=0;return s;实习题5.5 条件语句目标代码生成关于条件语句翻译方案的部分语义子程序_j(j=1,2,11)(C型)可设计如下:void _1( ) /* S:=if(B)S1 else S2 */ Nlabel=Nlabel+1; A=A+1; /* S.next:=newlabel */属性信息表A= A,U,next,S, L|ITOS(Nlabel), NULL, N; PSnext=Dpointer(A, NULL);/*指向依赖属性结点*/PA1=Apointer(A,NULL); /*指
23、向属性结点*/Nlabel=Nlabel+1; NB=分析栈tops-4.结点序号;A=A+1; /* .true:=newlable */属性信息表=A,注释分析树NB.文法符号序号,true,S, L|ITOS(Nlabel), NULL, NB;PA=Apointer(A,NULL); 注释分析树NB.属性信息链=AppendAlink(PA,注释分析树NB.属性信息链);Nlabel=Nlabel+1; A=A+1; /* B.false:=newlabel */属性信息表A=A,注释分析树NB.文法符号序号,false, S, L|ITOS(Nlabel), NULL, NB;PA=Apointer(A,NULL); 注释分析树NB.属性信息链=AppendAlink(PA,注释分析树NB.属性信息链);NS1=分析栈tops2.结点序号; A=A+1; /* S1.next:=S.next*/属性信息表= A,注释分析树NS1.文法符号序号,next, S, 属性信息表A3.属性值,PSnext,NS1;PA=Apointer(A,NULL); 注释
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1