linux io测试陈旭,130242014076+陈旭+第2次实验(示例代码)
软件体系结构的第二次实验(解释器风格与管道过滤器风格)
一、实验目的
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次实验(示例代码)相关推荐
- Linux IO 测试工具 fio命令
fio是测试IO的非常好的工具,用来对磁盘进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类.fio是一个可以产生很多线程或进程并执行用户指定的特定类 ...
- linux io测试陈旭,陈旭方案论证及器件选择.doc
陈旭方案论证及器件选择 陈旭方案论证及器件选择 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路 管脚说明 下面按其引脚功能分为四部分叙述这40条引脚的功能 1主电源引脚VSS和VS ...
- linux io测试陈旭,陈旭展
(2012-06-23 00:40) 标签: 杂谈 雄波曾经跟我说,有人告诉他说:"既然很久没有联系了,那就不要联系了." 或许,很多感情都会在时间的洗涤中淡漠.该试着去释怀. 回 ...
- linux sit0 wifi,I.MX6 AW-NB177NF wifi HAL 调试修改(示例代码)
/************************************************************************* * I.MX6 AW-NB177NF wifi H ...
- linux搭建虚拟化平台报告,部署KVM虚拟化平台------搭建(示例代码)
一 .部署KVM虚拟化平台 hyper-v是windows中的虚拟化 1.KVM模块直接整合在Linux内核中,kvm是内核模块,虚拟机与kvm模块之间为管理工具 2.KVM组成 1.KVM Driv ...
- linux postgresql默认安装目录,postgresql - 三种安装方式(示例代码)
最近接触了postgresql的安装,和大家分享一下. 一.简 介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数 ...
- 怎样在linux系统上安装r,Linux系统之路——如何在CentOS7.2安装R(示例代码)
使用ubuntu的小伙伴们直接使用命令sudo apt-get installr-base-dev或者r-base搞定.然而对于使用centos的我却一直卡在安装这一步,十分的悲催,只有羡慕的份,但也 ...
- linux netty udp服务端,Netty实现简单UDP服务器(示例代码)
本文参考<Netty权威指南> 文件列表: ├── ChineseProverbClientHandler.java ├── ChineseProverbClient.java ├── C ...
- linux下安装nginx1.10,Linux(RHEL7.0)下安装nginx-1.10.2(示例代码)
查看当前系统版本是否支持 当前,nginx发布包支持以下Linux操作系统版本: RHEL/CentOS: Version Supported Platforms 5.x x86_64, i386 6 ...
最新文章
- kernel logo到开机动画之间闪现黑屏(android 5.X)
- 计算机视觉编程——图像到图像的映射
- 【项目管理】各种常用工具图表说明和示例
- 【转载】css3 content 生成内容
- CodeForces - 1450E Capitalism(差分约束)
- Unity SRP自定义渲染管线 -- 4.Spotlight Shadows
- 数字证书注册审批机构(RA)
- Java中使用try-with-resource优雅的关闭io流
- 部署Hadoop集群
- 十三种寂寞 你有过吗?『最无奈的是第13种』
- Hadoop面试题整理(1)
- C#编程,byte 与 int 相互转换
- 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)
- 电容有哪些用途?常见的九大作用
- halcon 相似度_怎样用深度学习判断两张图片的相似度?
- C 龟兔赛跑题目:T分钟后乌龟和兔子谁跑得快?
- C# 颜色的梯度渐变
- 清华大学LaTeX模板:参考文献的上标引用和水平引用
- 手把手教你用Arduino接入阿里云物联网平台,ESP8266连接阿里云物联网平台必看教程...
- 领袖的七个非常重要的根性-余世维
热门文章
- 20172307 2017-2018-2 《程序设计与数据结构》实验5报告
- Day05 egrep正则表达式sed
- 2_C语言中的数据类型 (六)浮点数
- CentOS 6.5高可用集群LVS+Keepalived
- 财富信息不需要传userID后台会根据保存的session提供数据
- php 匿名评论,关于php:PHP匿名类的用法
- ole2高级编程技术 pdf_别不信,21天就可以学会python,《21天学通Python》pdf免费领取...
- mysql索引类型和区别是什么意思_mysql主键索引和普通索引之间的区别是什么
- Mycat实现Mysql的一主一从和双主双从读写分离
- Python机器学习:逻辑回归005决策边界