130242014040 软2 林梦远 第二次实验
Posted 软2-林梦远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了130242014040 软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++
2、采用管道-过滤器(Pipes and Filters)风格实现解释器
图2 管道-过滤器风格
图 3 编译器模型示意图
本实验,实现的是词法分析和语法分析两个部分。
四、实验步骤:
要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图。
总体结构图参照体系结构风格。
代码:
package com.fuju.test; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import com.fjnu.utils.Calculator; /** * * 1)实现加减乘除四则运算,允许同时又多个操作数,如:2+3*5-6 结果是11 * 2)被操作数为整数,整数可以有多位 * 3)处理空格 * 4)输入错误显示错误提示,并返回命令状态“CALC” * * */ public class Tester { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(true){ System.out.print("calc > "); String strIn = scanner.nextLine(); strIn = deleteSpace(strIn); try{ System.out.println(calculateResult(strIn)); }catch(Exception e){ System.out.println("输入有误"); } } } /* * 将表达式的符号与数字进行分离 * 提取数字集合 * */ public static List<Integer> getNum(String str){ String []strs = str.split("\\\\+|\\\\-|\\\\*|\\\\/"); List <Integer> numList = new ArrayList<Integer>(); for(String temp:strs){ //转换为数字存入集合 numList.add(Integer.parseInt(temp)); //System.out.println(temp); } return numList; } /* * 提取运算符集合 */ public static List<String> getStr(String str){ String []strs = str.split("\\\\d"); List <String> strList = new ArrayList<String>(); for(String temp:strs){ if (!temp.equals("")) strList.add(temp); } return strList; } /* * 计算结果返回结果 * 主要看下一位是乘除继续运算 ,是加减则和前面一位进行原先挂起的加减运算 * */ public static int calculateResult(String strIn){ //获取集合 List <Integer> numList = getNum(strIn); List <String> strList = getStr(strIn); System.out.println(numList); System.out.println(strList); int count = 0; int sum = numList.get(count); int temp = 0; while(true){ if(count>=strList.size()) break; //判断是否末尾 if(!(count+1==strList.size())){ if(strList.get(count).equals("+")||strList.get(count).equals("-")){ if(strList.get(count+1).equals("+")||strList.get(count+1).equals("-")){ if(strList.get(count).equals("+")) sum += numList.get(count+1); else sum -= numList.get(count+1); } else temp = sum;//本次加减下一次乘除运算,暂时跳过一次 } else{ if(strList.get(count).equals("*")) sum = numList.get(count)*numList.get(count+1); else sum = numList.get(count)/numList.get(count+1); if(temp!=0&&(strList.get(count+1).equals("+")||strList.get(count+1).equals("-"))){ if(strList.get(count).equals("+")) sum += numList.get(count-1); else sum = numList.get(count-1)-sum; temp=0; } } } //末尾 else{ if(temp!=0){ if(strList.get(count-1).equals("-")) if(strList.get(count).equals("*")) sum -= numList.get(count)*numList.get(count+1); else sum -= numList.get(count)/numList.get(count+1); else{ if(strList.get(count).equals("*")) sum += numList.get(count)*numList.get(count+1); else sum += numList.get(count)/numList.get(count+1); } } else{ if(strList.get(count).equals("+")) sum += numList.get(count+1); else if(strList.get(count).equals("-")) sum -= numList.get(count+1); else if(strList.get(count).equals("*")) sum *= numList.get(count+1); else if(strList.get(count).equals("/")) sum /= numList.get(count+1); } } // sum += numList.get(count+1); count++; } return sum; } /** * 去除空格 * */ public static String deleteSpace(String str){ return str.replaceAll(" ", ""); } }
截图:
五、实验总结
这次实验使用java,拆分出运算符和数值两个集合进行后续运算。
以上是关于130242014040 软2 林梦远 第二次实验的主要内容,如果未能解决你的问题,请参考以下文章