版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课程实验报告实验3:语义分析姓名赵璐媛院系软件学院学号1143710516任课教师陈鄞指导教师实验地点软件学院三楼机房实验时间实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、需求分析得分要求:阐述语义分析系统所要完成的功能。(1)能分析以下几类语句,并生成中间代码(三地址指令和四元式形式): 声明语句(包括变量声明、数组声明、记录声明和过程声明) 表达式及赋值语句(包括数组元素的引用和赋值) 分支语句:if_then_else 循环语句:do_while 过程调用语句(2)具备语义错误处理能力,包括变量或函数重复声明、变量或函数引用前未声明、运算符和运算分量之间的类型不匹配(如整型变量与数组变量相加减)等错误,能准确给出错误所在位置,并采用可行的错误恢复策略。(3)系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖第(1)条中列出的各种类型的语句,以及第(2)条中列出的各种类型的错误。(4)系统的输出分为两部分:一部分是打印输出符号表。另一部分是打印输出三地址指令和四元式序列(5)除此之外,可以实现一些额外功能,例如自动类型转换,识别其它类型语义错误,如过程返回类型与声明类型不匹配;过程调用时实参与形参数目或类型不匹配;对非数组型变量使用数组访问操作符“[…]”;对普通变量使用过程调用操作符“call”;数组访问操作符“[…]”中出现非整数等。二、文法设计得分要求:给出如下语言成分所对应的语义动作声明语句(包括变量声明、数组声明、记录声明和过程声明)表达式及赋值语句(包括数组元素的引用和赋值)分支语句:if_then_else循环语句:do_while过程调用语句声明语句:P→{offset=0}DD→Tid;{enter(id.lexeme,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→↑T1{T.type=pointer(T1.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]C1{C.type=array(num.val,C1.type);C.width=num.val*C1.width;}赋值语句:Sid=E;{p=lookup(id.lexeme);ifp==nilthenerror;gen(p‘=’E.addr);}EE1+E2{E.addr=newtemp();gen(E.addr‘=’E1.addr‘+’E2.addr);}EE1*E2{E.addr=newtemp();gen(E.addr‘=’E1.addr‘*’E2.addr);}EE1{E.addr=newtemp();gen(E.addr‘=’‘uminus’E1.addr);}E(E1){E.addr=E1.addr;}Eid{E.addr=lookup(id.lexeme);ifE.addr==nilthenerror;}Lid[E]{L.array=lookup(id.lexeme);ifL.array==nilthenerror; L.type=L.array.type.elem; L.offset=newtemp(); gen(L.offset‘=’E.addr‘*’L.type.width);} |L1[E]{L.array=L1.array; L.type=L1.type.elem; t=newtemp(); gen(t‘=’E.addr‘*’L.type.width); L.offset=newtemp(); gen(L.offset‘=’L1.offset‘+’t);}分支语句:Sif{B.true=newlabel();B.false=newlabel();}B then{label(B.true);S1.next=S.next;}S1{gen(‘goto’S.next)} else{label(B.false);S2.next=S.next;}S2Sif{B.true=newlabel();B.false=S.next;}B then{label(B.true);S1.next=S.next;}S1循环语句:Swhile{S.begin=newlabel(); label(S.begin); B.true=newlabel(); B.false=S.next;}B do{label(B.true);S1.next=S.begin;}S1 {gen(‘goto’S.begin);}布尔值:B→E1relopE2{gen('if'E1.addrrelopE2.addr'goto'B.true);gen('goto'B.false);}B→true{gen('goto'B.true);}B→false{gen('goto'B.false);}B→({B1.true=B.true;B1.false=B.false;}B1)B→not{B1.true=B.false;B1.false=B.true;}B1B→{B1.true=B.true;B1.false=newlabel();}B1 or{label(B1.false);B2.true=B.true;B2.false=B.false;}B2B→{B1.true=newlabel();B1.false=B.false;}B1 and{label(B1.true);B2.true=B.true;B2.false=B.false;}B2过程调用:S→callid(Elist) { n=0; forq中的每个tdo { gen(‘param’t); n=n+1; } gen(‘call’id.addr‘,’n); }Elist→E { 将q初始化为只包含E.addr; }Elist→Elist1,E { 将E.addr添加到q的队尾; }三、系统设计得分要求:分为系统概要设计和系统详细设计。(1)系统概要设计:给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块结构图等以及相应的文字说明。(2)系统详细设计:对如下工作进行展开描述核心数据结构的设计主要功能函数说明程序核心部分的程序流程图系统概要设计系统设计类图如下,建议放大查看。系统详细设计语义分析部分关键类为IntermediateCode类,主要功能为对声明语句进行分析并生成符号表,对调用语句进行分析,生成三地址码和四元式。符号表:makeD、makePlist、makeT、makeC等方法分别对以语法变量D/D’,Plist/Plist’,T,C为根的语法子树进行语义分析,生成符号表,同时处理函数、记录、变量、数组等重复声明的错误。符号表格式及内容见第四部分(3)。三地址码和四元式:makeS、makeElist、makeL、makeL_、makeE、makeE_、makeF、makeF_、makeG、makeB、makeB_等方法分别对以语法变量S/S’,Elist/Elist’,L,L’,E,E’,F,F’,G,B,B’为根的语法子树进行语义分析,生成三地址码和四元式,并在需要时进行回填,同时处理函数、记录、变量、数组等未声明或类型不相符的错误,并且实现了变量类型自动转换的功能。四、系统实现及结果分析得分要求:对如下内容展开描述。系统实现过程中遇到的问题;针对一测试程序输出其语义分析结果;输出针对此测试程序经过语义分析后的符号表;输出针对此测试程序对应的语义错误报告;对实验结果进行分析。注:其中的测试样例需先用已编写的词法分析程序进行处理。遇到的问题:对于有嵌套的过程声明,里层的函数应该可以使用外层函数内的值,而符号表只记录了当前函数内的变量。解决办法:对于有嵌套的函数,里层的函数在parent字段记录外层函数所对应的符号表,查找变量时便可以对上层进行查找。测试用例、符号表分析结果、错误报告0: [+,k,j[0],t0] t0=k+j[0]1: [=,t0,-,k] k=t02: [=,1,-,k] k=13: [=,1,-,i] i=14: [*,100,i,t1] t1=100*i5: [=,t1,-,j] j=t16: [=,0,-,t2] t2=07: [*,t2,6,t3] t3=t2*68: [=,1,-,t5] t5=19: [*,t5,2,t6] t6=t5*210: [+,t4,t6,t7] t7=t4+t611: [=,100,-,k[t7]] k[t7]=10012: [j<,i,j,14] ifi<jgoto1413: [j,-,-,20] goto2014: [j>,i,0,16] ifi>0goto1615: [j,-,-,20] goto2016: [*,1,j,t9] t9=1*j17: [+,i,t9,t8] t8=i+t918: [=,t8,-,i] i=t819: [j,-,-,21] goto2120: [=,j,-,i] i=j21: [+,i,2,t10] t10=i+222: [=,t10,-,i] i=t1023: [+,j,1,t11] t11=j+124: [=,t11,-,j] j=t1125: [j<,i,j,21] ifi<jgoto2126: [j,-,-,27] goto2727: [param,1,-,-] param128: [call,error,1,-] callerror,1ErroratLine3:重复的变量声明iErroratLine6:j不是变量类型ErroratLine7:k不是数组类型E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阳光学院《灾难护理学》2023-2024学年第一学期期末试卷
- 2024年离婚复婚再离双方权益分配具体合同
- 2025汽车销售人员劳动合同范例
- 2025资金监管的合同范本
- 2025服装服饰加盟合同
- 2025解除劳动合同证明书例文
- 2024年度健康医疗产业合作框架协议封面素材3篇
- 2024年知识产权许可使用合同样本及注意事项
- 2024年02月绍兴银行2024年社会招考笔试历年参考题库附带答案详解
- 2024年电气安装工程知识产权保护合同
- 部队物业服务投标方案
- 销售单 代合同范例
- 2024年3月天津第一次高考英语试卷真题答案解析(精校打印)
- 2024译林版七年级英语上册单词(带音标)
- 品管圈PDCA案例-普外科提高甲状腺手术患者功能锻炼合格率
- GB/T 44351-2024退化林修复技术规程
- FANUC机器人培训教程(完成版)
- 220千伏线路工程内悬浮抱杆分解组立铁塔施工方案
- 2025年蛇年春联带横批-蛇年对联大全新春对联集锦
- 21ZJ111 变形缝建筑构造
- 2023年永州市农村信用社(农村商业银行)招聘员工参考题库附答案解析
评论
0/150
提交评论