1113710304_张玉_编译原理实验报告-语义分析_第1页
1113710304_张玉_编译原理实验报告-语义分析_第2页
1113710304_张玉_编译原理实验报告-语义分析_第3页
1113710304_张玉_编译原理实验报告-语义分析_第4页
1113710304_张玉_编译原理实验报告-语义分析_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理课程实验报告实验3:语义分析姓名张玉院系软件学院学号1113710304任课教师陈鄞指导教师实验地点软件学院三楼机房实验时间2013年11月19日实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、需求分析得分要求:阐述语义分析系统所要完成的各个功能,并给出如下语言成分所对应的语义动作· 变量说明def_stmttype id array.type = type.type; =; array.length = type.length; array.dimension = 0; array.arri = new Set(int) arr

2、ay vars.type = type.type; vars.length = type.length vars ;vars ,id array.type = vars.type; = ; array.length = vars.length; array.dimension = 0; array.arri = new Set(int) array vars1.type=vars.type; vars1.length = vars.length vars1vars array int array1.type = array.type;

3、 = ; array1.length = array.length; array1.dimension = array1.dimension +1; array1.arri = array.arri U int.value array1array new Record(array.type, , array.length, offset, array.arri ); offset += array.lengh· 赋值S id := E p := lookup();gen( p := E.addr)E E1 + E2 E. addr

4、 := newtemp;gen(E.addr := E1.addr + E2.addr)E E1 * E2 E.addr := newtemp;gen(E.addr := E1.addr * E2.addr)E E1 E.addr := newtemp;gen(E.addr := uminus E1.addr)E (E1) E.addr := E1.addr E id E.addr := lookup();· 分支S if B then S1 else S2B.true := newlabel();B.false := newlabel();S1.next := S.n

5、ext;S2.next := S.next;S.code :=B.code | label(B.true) | S1.code |gen(goto,S.next) | label(B.false) | S2.code· 循环S while B do S1S.begin:= newlabel();B.true := newlabel();B.false := S.next;S1.next := S.begin;S.code:=label(S.begin)|B.code|label(B.true)|S1.code|gen(goto, S.begin)二、概要设计得分要求:给出系统概要设计

6、,以及必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块结构图等以及相应的文字说明。注意符号表的相关处理以及错误处理。 我的语义分析器包括工具栏,代码输入框,标识符表和语义分析结果四个部分。图2-1本程序根据之前两个实验的结果进一步进行语义分析,主要是通过在第二个实验句法分析过程中添加语义分析功能完成的。在代码编写之前,我将程序的功能模块分为界面及主控程序,实体类和工具类三大部分。MyCompiler是整个程序运行的入口,是主控程序;ComplierFrame完成程序的界面,以及界面里事件的响应;Token是词法分析中词法单元的实体类;ErrorToken是错误的词法单元实体类;Sym

7、bol是句法分析中符号的实体类;Production是产生式的实体类;ErrorProduction是句法分析中产生错误的时候使用的产生式实体类;Id是标示符实体类,保存了语义分析后的标识符表;Node是语法分析树的节点类,帮助完成语法分析树的构造;LL类使用LL(1)分析法完成句法分析,同时完成语义分析;MyScanner完成了词法分析。图2-2三、详细设计及实现得分要求:对如下工作进行展开描述(1) 核心数据结构的设计本程序使用了两个新的实体类,分别是Id和Node。Id是标识符,里面也包含了该标识符在本程序中存储的地址和长度等信息。Id的属性如下:private String name;

8、 /名private String type;/基本类型private int offset;/起始地址private int length;/长度public List<Integer> arr_length;/该数组各维的长度/变量的维度可以根据arr_length.size()得出Node是语法生成树的节点,Node的属性如下:private String name;/节点名private Node father;/父节点public List<Node> sons;/子节点public Map<String,String> attribute;/属性

9、其中atrribute的类型是哈希Map。这是因为各个节点的属性不是统一的,使用哈希表可以方便地创建、使用属性。(2) 主要功能函数说明此次试验的语义分析部分并没有新的功能函数,因为语义分析过程与语法分析同步进行的,代码都是在第二次第二次实验的基础上,在LL(l)文法符号匹配的过程中,插入语义操作代码。所以,只有句法分析函数analysis(List<Token> token_list)的功能发生了变化,添加了语义分析的功能,其他函数功能基本与实验二相同。(3) 程序核心部分的程序流程图图3-1四、实验结果及分析得分要求:对实验结果进行描述和分析,基本内容包括:(1) 针对一测试程

10、序输出其语义分析结果;(2) 输出针对此测试程序对应的语义错误报告;(3) 输出针对此测试程序经过语义分析后的符号表;(4) 对实验结果进行分析。注:其中的测试样例需先用已编写的词法分析程序进行处理。测试程序:void main () double d; int a23; d = 0; a01 = 2; if (d = 0) a01 = d; else a11 = 0; while (a01<3) +a01; 分析结果以及错误报告:图4-1标识符表:图4-2实验结果分析:程序首先识别出double型变量d和int型二维数组a,得出符号表,并计算出d的起始地址为0,长度为8;a的起始地址为8,长度为2*3*4=24。在赋值语句中a01的地址是以a为基准四个单位长度的地方,程序正确识别为a4,也识别出a11为a16,其他的赋值语句也都正确地转化为三地址码。在第4句分支语句中,当b0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论