软件体系结构的第二次实验(解释器风格与管道过滤器风格)

一、实验目的

1.熟悉体系结构的风格的概念

2.理解和应用管道过滤器型的风格。

3、理解解释器的原理

4、理解编译器模型

二、实验环境

硬件:

软件:Python或任何一种自己喜欢的语言

三、实验内容

1、实现“四则运算”的简易翻译器。

结果要求:

1)实现加减乘除四则运算,允许同时又多个操作数,如:2+3*5-6 结果是11

2)被操作数为整数,整数可以有多位

3)处理空格

4)输入错误显示错误提示,并返回命令状态“CALC”

图1    实验结果示例

加强练习:

1、有能力的同学,可以尝试实现赋值语句,例如x=2+3*5-6,返回x=11。(注意:要实现解释器的功能,而不是只是显示)

2、尝试实现自增和自减符号,例如x++

3、采用管道-过滤器(Pipes and Filters)风格实现解释器

图2  管道-过滤器风格

图 3  编译器模型示意图

本实验,实现的是词法分析和语法分析两个部分。

四、实验步骤:

代码如下:

1 packagecom.brainstrong.uamis.util;2

3 importjava.io.InputStream;4 importjava.util.ArrayList;5 importjava.util.List;6 importjava.util.Scanner;7 importjava.util.StringTokenizer;8

9 /**

10 * JAVA实现四则运算解释器11 *12 *@author旭旭13 * @create 2017-10-27 19:4314 **/

15 public classCalc {16

17 public static voidmain(String[] args) {18 Scanner scanner = newScanner(System.in);19 String exp =scanner.nextLine();20 System.out.println(calc(exp));21 }22

23 /**

24 *25 *@paramexp 四则表达式26 *@return

27 */

28 public static doublecalc(String exp){29 //1.把表示负数的-号换成@号

30 exp =negativeToAtChar(exp);31 //2.数字的分类

32 List numbers =splitNumExp(exp);33 //3.运算符的分离

34 List ops =splitOpfromExp(exp);35 //4.先乘除

36 for (int i = 0; i < ops.size(); i++) {37 //判断,运算符是否是乘除

38 char op =ops.get(i);39 //是,取出,运算

40 if (op == ‘*‘ || op == ‘/‘) {41 //取出来,运算

42 ops.remove(i);//后面的数据往前顺序移动43 //运算44 //从数字容器中取出对应运算符的两个数字

45 double d1 =numbers.remove(i);46 double d2 =numbers.remove(i);47

48 if (op == ‘*‘) {49 d1 *=d2;50 }else{51 d1 /=d2;52 }53

54 //把运算结果放入数字容器中i的位置

55 numbers.add(i, d1);//原来i位置(包括)后面的数据依次往后顺移

56 i--;57 }58 }59 //5.后加减

60 while (!ops.isEmpty() ) {61 char op = ops.remove(0);62 double d1 = numbers.remove(0);63 double d2 = numbers.remove(0);64 //运算

65 if (op == ‘+‘) {66 d1 +=d2;67 } else{68 d1 -=d2;69 }70 //把运算结果插入到数字容器中0的位置

71 numbers.add(0, d1);72 }73 //6.容器中的第一个数据就是结果

74 return numbers.get(0);75 }76

77 /**

78 * 从表达式中分离表达式和运算符79 *@paramexp80 *@return

81 */

82 private static ListsplitOpfromExp(String exp) {83 List ops = new ArrayList();84 StringTokenizer st = new StringTokenizer(exp, "[email protected]");85 while(st.hasMoreTokens()) {86 char c = st.nextElement().toString().trim().charAt(0);87 ops.add(c);88 }89 returnops;90 }91

92 /**

93 * 分离出数字94 *@paramexp95 *@return

96 */

97 private static ListsplitNumExp(String exp) {98 List numbers = new ArrayList();99 StringTokenizer st = new StringTokenizer(exp, "+-*/");100 while(st.hasMoreTokens()) {101 String numStr =st.nextElement().toString().trim();102 if (numStr.charAt(0) == ‘@‘) {103 numStr = "-" + numStr.substring(1);104 }105 numbers.add(Double.parseDouble(numStr));106 }107 returnnumbers;108 }109

110 /**

111 * 把-号换成@号112 *@paramexp113 *@return

114 */

115 private staticString negativeToAtChar(String exp) {116 for (int i = 0; i < exp.length(); i++) {117 char c =exp.charAt(i);118 if (c == ‘-‘) {119 //判断是否是负数

120 if (i == 0) {121 //第一个位置肯定是负数

122 exp = "@"+exp.substring(1);123 }else{124 //不是第一个位置125 //判断前一个位置是否是运算符

126 char cprev = exp.charAt(i - 1);127 if (cprev == ‘+‘ || cprev == ‘-‘ || cprev == ‘*‘ || cprev == ‘/‘) {128 exp = exp.substring(0, i)+"@"+exp.substring(i+1);129 }130 }131 }132 }133 returnexp;134 }135

136 }

linux io测试陈旭,130242014076+陈旭+第2次实验(示例代码)相关推荐

  1. Linux IO 测试工具 fio命令

    fio是测试IO的非常好的工具,用来对磁盘进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类.fio是一个可以产生很多线程或进程并执行用户指定的特定类 ...

  2. linux io测试陈旭,陈旭方案论证及器件选择.doc

    陈旭方案论证及器件选择 陈旭方案论证及器件选择 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路 管脚说明 下面按其引脚功能分为四部分叙述这40条引脚的功能 1主电源引脚VSS和VS ...

  3. linux io测试陈旭,陈旭展

    (2012-06-23 00:40) 标签: 杂谈 雄波曾经跟我说,有人告诉他说:"既然很久没有联系了,那就不要联系了." 或许,很多感情都会在时间的洗涤中淡漠.该试着去释怀. 回 ...

  4. linux sit0 wifi,I.MX6 AW-NB177NF wifi HAL 调试修改(示例代码)

    /************************************************************************* * I.MX6 AW-NB177NF wifi H ...

  5. linux搭建虚拟化平台报告,部署KVM虚拟化平台------搭建(示例代码)

    一 .部署KVM虚拟化平台 hyper-v是windows中的虚拟化 1.KVM模块直接整合在Linux内核中,kvm是内核模块,虚拟机与kvm模块之间为管理工具 2.KVM组成 1.KVM Driv ...

  6. linux postgresql默认安装目录,postgresql - 三种安装方式(示例代码)

    最近接触了postgresql的安装,和大家分享一下. 一.简 介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数 ...

  7. 怎样在linux系统上安装r,Linux系统之路——如何在CentOS7.2安装R(示例代码)

    使用ubuntu的小伙伴们直接使用命令sudo apt-get installr-base-dev或者r-base搞定.然而对于使用centos的我却一直卡在安装这一步,十分的悲催,只有羡慕的份,但也 ...

  8. linux netty udp服务端,Netty实现简单UDP服务器(示例代码)

    本文参考<Netty权威指南> 文件列表: ├── ChineseProverbClientHandler.java ├── ChineseProverbClient.java ├── C ...

  9. linux下安装nginx1.10,Linux(RHEL7.0)下安装nginx-1.10.2(示例代码)

    查看当前系统版本是否支持 当前,nginx发布包支持以下Linux操作系统版本: RHEL/CentOS: Version Supported Platforms 5.x x86_64, i386 6 ...

最新文章

  1. kernel logo到开机动画之间闪现黑屏(android 5.X)
  2. 计算机视觉编程——图像到图像的映射
  3. 【项目管理】各种常用工具图表说明和示例
  4. 【转载】css3 content 生成内容
  5. CodeForces - 1450E Capitalism(差分约束)
  6. Unity SRP自定义渲染管线 -- 4.Spotlight Shadows
  7. 数字证书注册审批机构(RA)
  8. Java中使用try-with-resource优雅的关闭io流
  9. 部署Hadoop集群
  10. 十三种寂寞 你有过吗?『最无奈的是第13种』
  11. Hadoop面试题整理(1)
  12. C#编程,byte 与 int 相互转换
  13. 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)
  14. 电容有哪些用途?常见的九大作用
  15. halcon 相似度_怎样用深度学习判断两张图片的相似度?
  16. C 龟兔赛跑题目:T分钟后乌龟和兔子谁跑得快?
  17. C# 颜色的梯度渐变
  18. 清华大学LaTeX模板:参考文献的上标引用和水平引用
  19. 手把手教你用Arduino接入阿里云物联网平台,ESP8266连接阿里云物联网平台必看教程...
  20. 领袖的七个非常重要的根性-余世维

热门文章

  1. 20172307 2017-2018-2 《程序设计与数据结构》实验5报告
  2. Day05 egrep正则表达式sed
  3. 2_C语言中的数据类型 (六)浮点数
  4. CentOS 6.5高可用集群LVS+Keepalived
  5. 财富信息不需要传userID后台会根据保存的session提供数据
  6. php 匿名评论,关于php:PHP匿名类的用法
  7. ole2高级编程技术 pdf_别不信,21天就可以学会python,《21天学通Python》pdf免费领取...
  8. mysql索引类型和区别是什么意思_mysql主键索引和普通索引之间的区别是什么
  9. Mycat实现Mysql的一主一从和双主双从读写分离
  10. Python机器学习:逻辑回归005决策边界