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 林梦远 第二次实验的主要内容,如果未能解决你的问题,请参考以下文章

130242014048--《电商系统某功能模块》的需求分析与设计的课程小结

数据采集第二次实验

第二次实验报告

第二次实验报告

第二次实验

130242014047+徐晓敏+第二次实验