附录一第二篇第章语义分析中语义子程序的设计(c型程序)

上传人:marr****208 文档编号:117076588 上传时间:2019-11-18 格式:DOC 页数:25 大小:157.50KB
返回 下载 相关 举报
附录一第二篇第章语义分析中语义子程序的设计(c型程序)_第1页
第1页 / 共25页
附录一第二篇第章语义分析中语义子程序的设计(c型程序)_第2页
第2页 / 共25页
附录一第二篇第章语义分析中语义子程序的设计(c型程序)_第3页
第3页 / 共25页
附录一第二篇第章语义分析中语义子程序的设计(c型程序)_第4页
第4页 / 共25页
附录一第二篇第章语义分析中语义子程序的设计(c型程序)_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《附录一第二篇第章语义分析中语义子程序的设计(c型程序)》由会员分享,可在线阅读,更多相关《附录一第二篇第章语义分析中语义子程序的设计(c型程序)(25页珍藏版)》请在金锄头文库上搜索。

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

2、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;注释分析

3、树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;注释分析树

4、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.属性信息链=Appen

5、dAlink(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;注释

6、分析树NR1.属性信息链=Apointer(A,NULL); void _6( ) /* R:=e 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(N

7、E,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在VT中的序号;A=A+1; 属性信息表A= A,U,lexval, I,nval, NULL, N ;NT=注

8、释分析树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=ba

9、ck;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在VT中的序号如下求得:for(k=1; k0) tops=tops+1; 分析栈tops=act, k;/

10、*由构造法,k即结点序号*/Rcontinue=0; /*false*/continue; /*转向Rwhile循环开始处*/ if(act=0) 输出“出错,当前输入符号为:”;输出VTR;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, N

11、ULL;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=topsm; NewS=GOTO分析栈tops.状态U-100;/* U=VN中序号+100 */tops=tops+1; 分析栈tops=NewS,N; /*Rcontinue; */ /* Scontinue */输出注释分析树;按规则归约时所执行的语义子程序(C型)如下:void 语义子程序(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号