收藏 分享(赏)

编译原理课程设计终结版.doc

上传人:dreamzhangning 文档编号:2702115 上传时间:2018-09-25 格式:DOC 页数:34 大小:599.57KB
下载 相关 举报
编译原理课程设计终结版.doc_第1页
第1页 / 共34页
编译原理课程设计终结版.doc_第2页
第2页 / 共34页
编译原理课程设计终结版.doc_第3页
第3页 / 共34页
编译原理课程设计终结版.doc_第4页
第4页 / 共34页
编译原理课程设计终结版.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、 基于算符优先分析方法 的表达式语法分析器年 级: 2007班 级: 级计算机科学与技术 4 班组 长: 刘思佳组 员: 欧 垚 毛群晖 袁小仨 徐碧红邓文杰 孙苗苗 顿 硕 伍小军曾 洁 孙 梁 吉顺昌指导老师: 段明秀二一八二一八年九月二十五日湖南吉首大学编译原理课程设计文档1目 录前 言 1第 1 章 课程设计计划 41.1 员与工作分配 .41.2 课程计划 .41.3 资源需求 .4第 2 章 功能需求分析 52.1 功能需求清单 .5第 3 章 设计、分析与编码 63.1 总体设计 .63.1.1 模块划分 63.1.2 程序分包 .63.2 详细设计 .73.2.1 类图 73.

2、3 程序流程图 .93.4 分析与编码实现 .103.4.1 表达式文法 GE构造算符优先关系表 .103.4.2 根据算符优先表用栈结构来实现算符优先分析 133.4.3 辅助工具类设计 18第 4 章 测试用例及程序截图 214.1 第一版测试214.1 第二版测试254.2 第三版测试 .28第 5 章 用户使用说明 325.1 使用步骤 .32附录 1. 参考文献 33附录 2. 总结 33湖南吉首大学编译原理课程设计文档1前 言1摘要编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储

3、管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。算符优先分析法是一种简单直观、特别方便于表达式分析,易于手式实现的方法。算符优先法只考虑算符(广义为终结符号)之间的优先关系,它是一种自底向上的归约过程,但这种归约未必严格按照句柄归约。它是一种不规范归约法。算符优先分析法的关键是比较两个相继出现的终结符号的优先级而决定应采取的动作。要完成算符间的优先级比较,就要先定义各种可能出相继出现的运算符的优先级,并将其表示成矩阵形式,在分析过程中通过查

4、询矩阵元素而得出算符间的优先关系。2问题描述给出该文法E # E #E E + Q | QQ Q - T | TT T * F | F湖南吉首大学编译原理课程设计文档1F F/ MMM M PPP ( E )i用算符优先分析法实现对表达式的计算。3项目开发平台语言:Java开发平台:MyEclipse湖南吉首大学编译原理课程设计文档0第 1 章 课程设计计划1.1 组员与工作分配组长:刘思佳资料组:毛群晖,邓文杰,曾洁代码组:刘思佳,孙梁,孙苗苗,顿硕测试组:欧垚,吉顺昌,徐碧红,袁小仨,伍小军1.2 课程计划表 1.2.1 课程设计计划清单序号 内容 需求 计划时间 实际时间 状态1 问题定

5、义 对课程设计要求分析6 月 15 日 6 月 15 日 已完成2 查询资料 对课程设计做必要的资料查询6 月 16 日-6月 17 日6 月 17 日 已完成3 概要设计 确定课程设计的总体框架与分包6 月 18 日 6 月 18 日 已完成4 详细设计 具体分析设计每个类与接口6 月 19 日-6月 20 日6 月 20 日 已完成5 编码 实现程序 6 月 21 日 6 月 21 日 已完成6 测试并修改 测试程序BUG 并进行修改6 月 22 日-6月 26 日6 月 26 日 已完成1.3 资源需求表 1.3.1 开发资源序号 资源 作用 占用时间 当前可用状态 获得途径1 MyEc

6、lipse平台设计平台 贯穿整个设计阶段可用 网上下载湖南吉首大学编译原理课程设计文档1第 2 章 功能需求分析2.1 功能需求清单表 2.1.1 需求清单功能编号 功能名称 备注1 键盘输入 用户能从键盘输入字符串2 表达式切分 切分算术表达式,结果存入字符串数组,如: 字符串:1.5+3*2# 将被切分为 1.5,+,3,*,2,#3 扫描表达式 检测是否符合给定的文法4 出错处理 不符合文法的给出错误提示5 计算表达式 合法的算术表达式将计算出结果6 输出 将计算结果输出给用户湖南吉首大学编译原理课程设计文档2第 3 章 设计、分析与编码3.1 总体设计3.1.1 模块划分该语法分析器可

7、分为以下几个主要模块:1. 词法分析并计算模块其中应有一个操作符栈和一个操作数栈,用于分析输入的文法和句子,并提供方法检验该表达式是否为给出的文法,如果是则运算出结果,否则提示错误2. 算符优先表构建模块用于构建输入文法的算符优先表,并对其中的算符优先表进行各种操作。3. 输入功能模块提供从键盘输入功能。3.1.2 程序分包com.op.core 该包下为核心类,完成核心功能com.op.util 该报为工具包,包含一些输入,字符串处理等程序之间应该保持低耦合,高内聚。包之间的依赖关系为 core-util,核心包依赖于 util, util 不依赖其他包。湖南吉首大学编译原理课程设计文档33

8、.2 详细设计3.2.1 类图com.op.core.OperatorPrority 类:该类为核心类,实现所有核心功能。com.op.core.ProrityTable 类:该类为存放算符优先级表,以及对算符优先级表查询等操作。com.op.core.StringUtil 类:该类实现必要的字符串操作。com.op.core.IOUtil 类:该类实现输入输出等常用操作湖南吉首大学编译原理课程设计文档4类之间的依赖关系:OperatorPriority 将依赖于其他三个类,而其他的类互不依赖。湖南吉首大学编译原理课程设计文档53.3 程序流程图输入待分析的表达式切分表达式扫描表达式中的项是否

9、为运算符优先级是否大于操作符栈栈顶元素优先级YY当前操作符进入操作符栈N是否小于操作符栈栈顶元素优先级操作数栈弹出两个元素,操作符栈弹出一个元素,进行运算,计算结果存入操作数栈Y符号栈弹出栈顶元素N压入操作数栈是否为#N入口出口N湖南吉首大学编译原理课程设计文档63.4 分析与编码实现3.4.1 表达式文法 GE构造算符优先关系表计算算符优先只针对于终结符,终结符之间的优先关系有三种,在计算优先关系之前我们先定义两个集合,对于任意两个终结符(a,b)FIRSTVT(B)=b|B=b或 B=Cb,其中表示 V中的符号串。LASTVT(B)=a|B=a 或 B=aC三种优先关系:(1)等于关系:可

10、直接查看产生式的右部,对如下形式的产生式 A-ab A- aBb则有 a=b 成立。(2)小于关系:求出每个非终结符 B 的 FIRSTVT(B) ,观察如下 形式的产生式 A-aB对每一 bFIRSTVT(B)有 ab 成立(3)大于关系:计算每个非终结符 B 的 LASTVT(B) ,观察如下形 式的产生式 A-Bb对每一 aLASTVT(B)有 ab 成立关系表:通常用矩阵的形式存放文法中各种可能的优先关系。大小:矩阵是 nn 的,其中 n 是文法中终结符的个数。表达式文法 G E:E # E #E E + Q | QQ Q - T | TT T * F | FF F/ MM湖南吉首大学

11、编译原理课程设计文档7M M PPP ( E )i根据上面的规则手工构造上述文法的算符优先表如下:+ - * / ( ) i #+ - * / ( = ) i # =代码清单package com.op.core;public class PriorityTable private static char table = / + * / i ( ) # , , , , , , , , , , , , , , , , $, $, , , , / i , , , $, $, , , , / ) , , , , , a SK optrStack; /符号栈private Stack opndStac

12、k; /操作数栈private String input; /待分析的算术表达式/* 构造函数* param input*/public OperatorPriority(String input) super();optrStack = new Stack();opndStack = new Stack();optrStack.push(#);this.input = input;/* 操作两个数湖南吉首大学编译原理课程设计文档12* param a 操作数1* param b 操作数2* param op 操作符* return 运算结果*/public float operateTwoN

13、um(float a, float b, char op) BigDecimal da = new BigDecimal(Float.toString(a); BigDecimal db = new BigDecimal(Float.toString(b); switch (op) case *:return da.multiply(db).floatValue();case +:return da.add(db).floatValue();case -:return db.subtract(da).floatValue();case /:return db.divide(da,7,BigDe

14、cimal.ROUND_HALF_UP).floatValue(); /除不尽的情况取7位精确值。case :return db.pow(int)a).floatValue();return 0;/* 判断是否为操作符* param ch 被判断字符* return 布尔值*/public boolean isOperator(char ch) if (ch = + | ch = - | ch = * | ch = / | ch = (| ch = ) | ch = #|ch=)return true;elsereturn false;/* 扫描字符串,判断是否对应文法,并计算出结果* ret

15、urn 计算结果* throws Exception 如果不符合文法,或者除数等于 0,都将抛出异常*/public String scanner() throws Exception 湖南吉首大学编译原理课程设计文档13int postion = 0; / 字符串上指示的指针char operator = 0; / 操作符float a = 0, b = 0; / 操作数String exp = StringUtil.splitExp(input);while (true) / 判断是否为运算符if (exppostion.length()=1b = opndStack.pop();oper

16、ator = optrStack.pop().charValue();opndStack.push(operateTwoNum(a, b, operator);continue; else if (PriorityTable.getPriority(optrStack.peek().charValue(), exppostion.charAt(0) = =) optrStack.pop();if (exppostion.charAt(0) = #) return opndStack.pop().toString(); elseoptrStack.push( exppostion.charAt(

17、0);/ 为运算数时else opndStack.push(Float.valueOf(exppostion).floatValue();湖南吉首大学编译原理课程设计文档14postion+;if (postion = exp.length)break;throw new Exception();/* 程序入口,启动函数* param args*/public static void main(String args) OperatorPriority op = new OperatorPriority(IOUtil.getStringFromKeyBoard(); /实例化 构造函数参数从键

18、盘获得try System.out.println(“您输入的表达式:“ + op.input + “=“ + op.scanner(); catch (Exception e) / TODO Auto-generated catch block/e.printStackTrace();System.out.println(“您输入的表达式“ + op.input + “有误!“ );3.4.3 辅助工具类设计a. 通过键盘输入表达式。程序清单package com.op.util;import java.io.BufferedReader;import java.io.IOException

19、;import java.io.InputStreamReader;public class IOUtil /* 得到从键盘输入的字符串湖南吉首大学编译原理课程设计文档15* return 字符串*/public static String getStringFromKeyBoard() try BufferedReader reader=new BufferedReader(new InputStreamReader(System.in);System.out.print(“请输入一个表达式以#号结束:“ );String str=reader.readLine(); /获取字符串 / Sy

20、stem.out.println(“您输入的字符串是:“+str);return str; catch (IOException e) e.printStackTrace(); return null; b. 字符串处理类将从键盘输入的字符串表达式进行简单的切分,存入字符串数组。这个类是为了在扫描表达式时能对其中的操作数与操作符进行方便的操作。程序清单package com.op.util;import java.util.Vector;public class StringUtil /* 切分算术表达式,结果存入字符串数组,如: 字符串:1.5+3*2# 将被切分为 1.5,+,3,*,2,

21、#* param str* return*/public static String splitExp(String str) Vector v = new Vector();int beginIndex = 0;湖南吉首大学编译原理课程设计文档16for (int i = 0; i 32 v.add( String.valueOf(str.charAt(i);beginIndex = i + 1;if(beginIndex!=str.length()v.add(str.substring(beginIndex, str.length();String result=new Stringv.s

22、ize();for(int i=0;iv.size();i+)resulti=v.get(i);return result;湖南吉首大学编译原理课程设计文档17第 4 章 测试用例及程序截图本次设计经过三次测试形成最终版本4.1 第一版测试1、如果正确输入表达式应能正确得出结果当输入 10+15*4#后,预计结果为 70,实际结果为:70.0之所以会出现 70.0 是因为输出结果的精度不一样。提示“请按任意键继续” ,当按下任意键时,退出了程序。程序应该跳到开始处,提醒用户再次输入表达式并以#号结束。2、如果输入一个错误的表达式应能给出错误信息从图中所输入的表达式跟文法进行分析可以得出 10

23、不是文法的句子,故输出的结果为:您输入的表达式 10+*15+有误!湖南吉首大学编译原理课程设计文档183、对负号的处理经过对文法的分析并没有对负数的处理,在这里他会认为是减号,而在减号的左边缺少一个元素,故输出的结果为:您输入的表达式(-10 )*2 有误!4、对于单个的整数5、测试除法优先操作测试结果与预计的结果不符合,经过分析得出,之所以上图的结果会是 11 是因为他的算法步骤为:(1) 、2*4=8 (2) 、 (6/2)=3 (3) 、3/2=1 (4) 、8+3*1=11 在这里出现了两个错误:第一个错误湖南吉首大学编译原理课程设计文档19在计算整数除的时候 3/2=1 出现错误;

24、第二个错误为在计算(6/2)*3/2 的问题上出现处理错误,他这里计算除法优先于乘法运算了,在乘法与除法之间的优先为谁先出现就先计算谁。正确的算法为:(1) 、2*4=8 (2) 、 (6/2)=3 (3) 、3*3=9 (4) 、9/2=4.5 (5) 、8+4.5=12.56、乘方的测试测试结果与预计的结果不符合,经过对文法的分析得出此语句为方法的句子,这时可以确定为在编写程序代码时没有完成此功能。7、对于不是方法句子的表达式情况下8、在输入时不加“#”湖南吉首大学编译原理课程设计文档20测试报告测试人姓名: 测试组 测试时间: 2010/6/20 错误个数: 0序号 路径 输入 预计输出

25、 实际结果1.如果正确输入表达式应能正确得出结果 10+15*4# 7070.02.如果输入一个错误的表达式应能给出错误信息 10+*15+# 给出错误提示您输入的表达式 10+*15+有误!3 对负号的处理 (-10)*(-5)# 给出错误提示您输入的表达式(-10)*(-5)有误!4 对于单个的整数 10# 10 10.05 测试除法优先操作 2*4+(6/2)*3/2# 12.5 116 对乘方的测试 27# 128您输入的表达式 27 有误!7 多“(“括号的情况下 (9-6)*3# 给出错误提示您输入的表达式(9-6)*3 有误!8输入时没有输入“#“号 3+4+5错误提示您输入的表

26、达式 3+4+5 有误!湖南吉首大学编译原理课程设计文档21本次测试中发现设计中并未涉及到乘方运算,且除法运算的并非是自左向右而是自右向左的,且除法运算优先级大于乘法运算,需作修改维护4.2 第二版测试根据第一版中的问题进行测试测试报告测试人姓名: 测试组 测试时间: 2010/6/28 错误个数: 6序号 任务 输入 预计输出 实际结果1. 对于单个的浮点数 10# 10 1.02. 浮点运算 1+2*3/6 2 13 测试除法优先操作2*4+(6/2)*3/2#12.5 12.54 对乘方的测试 27# 128您输入的表达式 27 有误!湖南吉首大学编译原理课程设计文档221、对于版本 1

27、 中没有解决的问题己经解决了,主要是对浮点数的处理。2 针对于符点操作与浮点优先测试3、针对乘除法优先操作的测试湖南吉首大学编译原理课程设计文档234、针对乘方问题的测试,依旧没有解决需要进一步改进程序湖南吉首大学编译原理课程设计文档244.3 第三版测试(根据上述版本错误进行测试且对全部进入回溯测试)根据右边流程图进行路径测试1110987654321输入待分析的表达式切分表达式扫描表达式中的项是否为运算符优先级是否大于操作符栈栈顶元素优先级YY当前操作符进入操作符栈N是否小于操作符栈栈顶元素优先级操作数栈弹出两个元素,操作符栈弹出一个元素,进行运算,计算结果存入操作数栈Y符号栈弹出栈顶元素

28、N压入操作数栈是否为#N入口出口N湖南吉首大学编译原理课程设计文档25测试报告测试人姓名: 测试组 测试时间: 2010/6/28 错误个数: 3序号 路径 输入 预期结果 实际结果1.123469101315-3+8 5 如图 1 所示2.123469101314-6+18# 12 如图 2 所示3 1235 本路径不能独立测试(放于路径 6 或 7 中测试)4 123478 本路径不能独立测试(放于路径 6 或 7 中测试)51234691112=8+7 你输入的表达式=8+7 有误!如图 3 所示8+3# 110 110(如图 4 所示)88-70# 180 180(-9)+3 -6 如图 5 所示82 640 640612534783534691013159/3# 30 30712534783534783534 69101315 6+4*6# 300 300(如图 6 所示)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报