还剩4页未读,继续阅读
文本内容:
编译原理课程实验报告实验语义分析3姓名赵璐媛院系软件学院学号1143710516任课教师陈勤指导教师实验地点软件学院三楼机房实验时间出勤、表现得分实验报告得实验课表现实验总分分操作结果得分
一、需求分析得分要求阐述语义分析系统所要完成的功能
(1)能分析以下几类语句,并生成中间代码(三地址指令和四元式形式)声明语句(包括变量声明、数组声明、记录声明和过程声明)表达式及赋值语句(包括数组元素的引用和赋值)分支语句if_then_else循环语句do_while过程调用语句
(2)具备语义错误处理能力,包括变量或函数重复声明、变量或函数引用前未声明、运算符和运算分量之间的类型不匹配(如整型变量与数组变量相加减)等错误,能准确给出错误所在位置,并采用可行的错误恢复策略
(3)系统的输入形式要求能够通过文件导入测试用例测试用例要涵盖第
(1)条中列出的各种类型的语句,以及第
(2)条中列出的各种类型的错误
(4)系统的输出分为两部分一部分是打印输出符号表另一部分是打印输出三地址指令和四元式序列
(5)除此之外,可以实现一些额外功能,例如自动类型转换,识别其它类型语义错误,如过程返回类型与声明类型不匹配;过程调用时实参与形参数目或类型不匹配;对非数组型变量使用数组访问操作符[…]”;对普通变量使用过程调用操作符“call”;数组访问操作符中出现非整数等
二、文法设计得分要求给出如下语言成分所对应的语义动作声明语句(包括变量声明、数组声明、记录声明和过程声明)表达式及赋值语句(包括数组元素的引用和赋值)分支语句ifLthen_else循环语句do_while过程调用语句声明语句P一{offset=0}DD—T id;{enter id.Iexeme,T.type,offset;offset=offset+T.width;}DD—£T—B{t=B.type;w=B.width;}C{T.type=C.type;T.width=C.width;}T-TTi{T.type=pointer Ti.type;T.width=4;}B-int{B.type=int;B.width=4;}B—real{B.type=real;B.width=8;}C—£{C.type=t;C.width=w;}C一[num]Ci{C.type=array num.val,Ci.type;C.width=num.val*Ci.width;}赋值语句S fid=E;{p=lookupid.lexeme;if p==nil thenerror;gen pE.addr;}E fEl+E2{E.addr=newtemp;genE.addr6=,El.addr E
2.addr;},,E—El*E2{E.addr=newtemp;genE.addr=El.addrE
2.addr;}E—-El{E.addr=newtemp;genE.addr=uminiis El.addr;}E fEl{E.addr=El.addr;}E—id{E.addr=lookupid.lexeme;if E.addr==nil thenerror;}L fid[E]{L.array=lookupid.lexeme;if L.array==nil thenerror;L.type=L.array.type.elem;L.offset=newtempO;,gen L.offset=E.addr L.type.width;}|L1[E]{L.array=LL array;L.type=Ll.type.elem;t=newtempO;gen tE.addr L.type.width;L.offset=newtempO;gen L.offset6=9LLoffset+1;分支语句S fif{B.true=newlabel;B.false=newlabel;}Bthen{labelB.true;Si.next=S.next;}Si{gen gotoS.next}else{labelB.false;Si.next=S.next;}SzS fif{B.true=newlabel;B.false=S.next;}B then{labelB.true;Si.next=S.next;}Si循环语句S fwhile{S.begin=newlabel;labelS.begin;B.true=newlabel;B.false=S.next;}Bdo{labelB.true;Si.next=S.begin;}Si{genCgoto S.begin;}布尔值B-El relopE2{genfif1El.addr relopE
2.addr gotoB.true;gengoto B.false;}B-true{gengoto B.true;}B-false{genfgotof B.false;B一{Bl.tnie=B.true;Bl.false=B.false;}BlB—not{Bl.true=B.false;Bl.false=B.true;}BlB—{Bl.true=B.true;BLfalse=newlabel;}B1or{labelBl.false;Bl.true=B.true;B
2.false=B.false;}B2;B―{Bl.true=newlabelQ Bl.false=B.false;}Bland{labelBl.true;B
2.true=B.true;B
2.false=B.false;}B2过程调用S一call idElist{n=0;for q中的每个t do{gen6param,t;;n=n+1}gen6calF id.addr n;}Elist一E{将q初始化为只包含E.addr;}Elist一Elistl,E{将E.addr添加到q的队尾;}
三、系统设计得分__________________要求分为系统概要设计和系统详细设计1系统概要设计给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块结构图等以及相应的文字说明系统详细设计对如下工作进行展开描述2/核心数据结构的设计/主要功能函数说明/程序核心部分的程序流程图1系统概要设计系统设计类图如下,建议放大查看2系统详细设计语义分析部分关键类为类,主要功能为对声明语句进行分析并生成符号表,对调用语句Intermediatecode进行分析,生成三地址码和四元式符号表等方法分别对以语法变量为根的语法子树进行语makeD makePlistmakeT makeCD/D=Plist/Plisf,T,C义分析,生成符号表,同时处理函数、记录、变量、数组等重复声明的错误符号表格式及内容见第四部分3o三地址码和四元式、、、、等方法makeS makeElistmakeL makeL_makeE makeE_makeF makeF_makeG makeBmakeB_分别对以语法变量S/S,Elist/Elisf,L,L\E,E F,F\G,B,B,为根的语法子树进行语义分析,生成三地址码和四元式,并在需要时进行回填,同时处理函数、记录、变量、数组等未声明或类型不相符的错误,并且实现了变量类型自动转换的功能
四、系统实现及结果分析得分要求对如下内容展开描述
(1)系统实现过程中遇到的问题;
(2)针对一测试程序输出其语义分析结果;
(3)输出针对此测试程序经过语义分析后的符号表;
(4)输出针对此测试程序对应的语义错误报告;
(5)对实验结果进行分析注其中的测试样例需先用已编写的词法分析程序进行处理
(1)遇到的问题对于有嵌套的过程声明,里层的函数应该可以使用外层函数内的值,而符号表只记录了当前函数内的变量解决办法对于有嵌套的函数,里层的函数在字段记录外层函数所对应的符号表,查parent找变量时便可以对上层进行查找
(2)测试用例、符号表3分析结果、错误报告周语义分析0:[+,k,j
[0],t0]tO=k+j[O]k匚,1:t0,k][=,1,=tO k=12:k][=,1,i]3:[*,100,i,tl]匚,4:tl,j][=,0,tl=100*i j=H t2=5:t2]r,t2,6,t3]0t3=t2*6t5=1[二,6:t5][*,t5,t6=t5*2t7=t4+7:2,t6][+,t4,t6,t68:t71k[t7]=100if9:ij goto1410:11:[=100,-,k[t7]]12:U,ij,14]0:[+,k,j
[0],CO]tO=k-Aglobal:1:[=,tO,k]k=tOerror函数null02[-,T,k k=1inc函数null443[=,1,i]i=14:[*,100,i,tl]tl=100•ierror:e变量inc05[=,Cl,j]j=procerrorinte;A i变量real86:[=,0,t2]t2=0inti;reali;int
[2]
[3]j;intk;k=k+j;k[l]=j数组inc167:[*,Z2,6,t3]t3-C2*61;callfunc;k变量inc408:[=,1,t5]C5=19[*r t5,2,t6]t6=C5*2procincinti;intj;real
[2]
[3]k;i-1;j=100*i;k
[0]
[1]=inc:+100;i变量int4410[+,C4,6,t7]t7=6j变量me4811:[=,100,Jc[t7]]k[c7]=ifijandi0theni=i+1*j;elsei=j;k数组real5212:[j,i,j,14]ifi j goto1•13:[j,20]goto20doi=1+2;j=3+1;whileij14:[j,i,0,16]ifi0goto1«15:[j,20]goto20callerror1;v16:[*,1,3,t9]C9=1*j17[+,i,t8]t8=i+t918:[=,Z8,i]i=t819:[j,21]goto2120:[-,j,i]i-j21:[+,i,2,CIO]Z10=i+222:=,CIO,i]i=tlOJsers\xilingmli\Desktop\sTitax.txt选择文法23:[+,j,1,til]til=j+1C\Users\xilingyuli\Desktop\dfa.txt选将FA24:[=,til,j]j=til___________________________________[选择源码2L5:s^__[i_,j,_21_]___________if_i_jg_oto_2____分析13:U,20]goto2014:if i0goto16U,i,0,16]15:U,20]goto20t9=1*j16:[MJ,t9]17:[+,i,t9,t8]t8=i+t9[二,18:t8,i]i=t819:goto2120:匚•Ji]i二J21:tl0=i+2[+,i,2,tlO]22:[=310,i]i=tl023:tH=j+l24:j=til[=311,-J]25:if ijgoto2126:U,27]goto2727:[param,1,param128:[call,error,1,-]call error,1Error atLine3重复的变量声明iError atLine6j不是变量类型Error atLine7k不是数组类型未声明的函数Error atLine8func
(4)分析符号表可以看出,针对过程和过程分别生成了对应的符号表,记录了符号的名称、inc error类型、值类型、偏移量三元式和四地址码函数中的赋值语句对应分析结果Inc3-11分支语句对应分析结果2-10循环语句对应分析结果21-26过程调用对应分析结果27-28错误报告Error函数中第3行的重复声明i;第6行对数组j进行+操作;第7行对变量k进行口操作;第8行未声明而调用函数均给出了错误报告func指导教师评语:日期:。
个人认证
优秀文档
获得点赞 0