附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx

上传人:b****6 文档编号:5176514 上传时间:2022-12-13 格式:DOCX 页数:39 大小:27.54KB
下载 相关 举报
附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx_第1页
第1页 / 共39页
附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx_第2页
第2页 / 共39页
附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx_第3页
第3页 / 共39页
附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx_第4页
第4页 / 共39页
附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx

《附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx》由会员分享,可在线阅读,更多相关《附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx(39页珍藏版)》请在冰豆网上搜索。

附录一第二篇第5章语义分析中语义子程序的设计C型程序.docx

附录一第二篇第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,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;

else

front=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(act>0)

{tops=tops+1;分析栈[tops]={act,k};

/*由构造法,k即结点序号*/

Rcontinue=0;/*false*/

continue;/*转向Rwhile循环开始处*/

}

if(act==0)

{输出“出错,当前输入符号为:

”;输出VT[R];

Scontinue=0;Rcontinue=0;/*false*/

continue;/*转向Rwhile循环开始处*/

}

/*act<0归约*/

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);

PEcode=Dpointer({NEcode,NULL});

PEplace=Dpointer({NEplace,PEcode});

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,″code″);

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);

PE2place=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]={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=Ipointer({″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]={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].属性值,NULL});

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=search(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=分析栈[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(intN)

{d=N;k=0;

while(d!

=0)

{s[k++]=d%10+'0';d=d/10;}

for(j=k-1;j>k/2;j--)

{t=s[j];s[j]=s[k-1-j];s[k-1-j]=t;}

s[k]='\0';

returns;

}

实习题5.5条件语句目标代码生成

关于条件语句翻译方案的部分语义子程序_j(j=1,2,…,11)(C型)可设计如下:

void_1()/*S:

:

=if(B)S1elseS2*/

{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});/*指向属性结点*/

Nlabel=Nlabel+1;NB=分析栈[tops-4].结点序号; 

A=A+1;/*B.true:

=newlable*/

属性信息表[A]={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=分析栈[tops-2].结点序号;

A=A+1;/*S1.next:

=S.next*/

属性信息表[A]={A,注释分析树[NS1].文法符号序号,"next″,

'S′,属性信息表[A-3].属性值,PSnext,NS1};

PA=Apointer({A,NULL});

注释

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1