编译原理实验报告-语义分析

上传人:yh****1 文档编号:127151774 上传时间:2020-03-30 格式:DOC 页数:9 大小:192KB
返回 下载 相关 举报
编译原理实验报告-语义分析_第1页
第1页 / 共9页
编译原理实验报告-语义分析_第2页
第2页 / 共9页
编译原理实验报告-语义分析_第3页
第3页 / 共9页
编译原理实验报告-语义分析_第4页
第4页 / 共9页
编译原理实验报告-语义分析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《编译原理实验报告-语义分析》由会员分享,可在线阅读,更多相关《编译原理实验报告-语义分析(9页珍藏版)》请在金锄头文库上搜索。

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

2、s.type = type.type; vars.length = type.length vars ;vars ,id array.type = vars.type; array.name = id.name; 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; array1.name = arr

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

4、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(id.name); 分支S if B then S1 else S2B.true := newlabel();B.false := newlabel();S1.next := S.next;S2.next := S.n

5、ext;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是错误的词法单元实体类;Symbol是句法分析中符号的实体类;Producti

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

8、基本类型private int offset;/起始地址private int length;/长度public List arr_length;/该数组各维的长度/变量的维度可以根据arr_length.size()得出Node是语法生成树的节点,Node的属性如下:private String name;/节点名private Node father;/父节点public List sons;/子节点public Map attribute;/属性其中atrribute的类型是哈希Map。这是因为各个节点的属性不是统一的,使用哈希表可以方便地创建、使用属性。(2) 主要功能函数说明此次试验

9、的语义分析部分并没有新的功能函数,因为语义分析过程与语法分析同步进行的,代码都是在第二次第二次实验的基础上,在LL(l)文法符号匹配的过程中,插入语义操作代码。所以,只有句法分析函数analysis(List token_list)的功能发生了变化,添加了语义分析的功能,其他函数功能基本与实验二相同。(3) 程序核心部分的程序流程图图3-1四、实验结果及分析得分要求:对实验结果进行描述和分析,基本内容包括:(1) 针对一测试程序输出其语义分析结果;(2) 输出针对此测试程序对应的语义错误报告;(3) 输出针对此测试程序经过语义分析后的符号表;(4) 对实验结果进行分析。注:其中的测试样例需先用

10、已编写的词法分析程序进行处理。测试程序:void main () double d; int a23; d = 0; a01 = 2; if (d = 0) a01 = d; else a11 = 0; while (a013) +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位真时,跳到6,进入if语句块,;当b0为假时,跳到9,进入else语句块。在第11句之后的循环语句中,当b1为真时,跳到15,进入循环体;当b1为假时,跳到18,循环结束。正常循环一遍之后,会跳到11,进行循环判断。在第7句中,出现了将double类型的值赋给int型变量的情况,程序也给出了正确的警告。指导教师评语:日期: 专业资料

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

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