130242014005-樊镇霄-第2次实验

一、实验目的

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

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

3、理解解释器的原理

4、理解编译器模型

二、实验环境

硬件: 

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

三、实验内容

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

结果要求:

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

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

3)处理空格

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

130242014005-樊镇霄-第2次实验_第1张图片

  图1    实验结果示例

加强练习:

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

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

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

130242014005-樊镇霄-第2次实验_第2张图片

                        图2  管道-过滤器风格

130242014005-樊镇霄-第2次实验_第3张图片

                     图 3  编译器模型示意图

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

四、实验步骤:

     要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图。

package jsq;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Cal {

  public static void main(String[] args) {

    BufferedReader reader = null;
    InputStreamReader inputStreamReader = null;
    try {
        System.out.print("calc >");
        inputStreamReader = new InputStreamReader(System.in);// 获得算数式
        reader = new BufferedReader(inputStreamReader);
        String str = reader.readLine();
      while (true) {// 循环这个过程
        if (!match(str)) {//判断没有其他字母(输入错误
          System.out.println("="+opt(str) + "");// 输出计算结果
        }
        else{//错了
          System.out.println("error");
        }
        System.out.print("calc >");
        str = reader.readLine();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static float opt(String s) throws Exception {// 计算
    if (s == null || "".equals(s.trim())) {
      return 0f;
    }
    int a1 = s.indexOf("+");
    int a2 = s.indexOf("-");
    int a3 = s.indexOf("*");
    int a4 = s.indexOf("/");
    if (a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1) {
        if (s.trim() == null || "".equals(s.trim())) {
          throw new Exception("operate error");
        }
        return Float.parseFloat(s.trim());
    }

    if (a1 != -1) {
        return opt(s.substring(0, a1))+ opt(s.substring(a1 + 1, s.length()));
    }
    if (a2 != -1) {
      return opt(s.substring(0, a2))- opt(s.substring(a2 + 1, s.length()));
    }
    if (a3 != -1) {
      return opt(s.substring(0, a3))* opt(s.substring(a3 + 1, s.length()));
    }
    if (a4 != -1) {
      return opt(s.substring(0, a4))/ opt(s.substring(a4 + 1, s.length()));
    }
    return Integer.parseInt(s.trim());
  }

  public static boolean match(String cardNum) { // 检测表达式是否正确
    String regex = ".*[a-zA-Z]+.*";
    Matcher m = Pattern.compile(regex).matcher(cardNum);
    return m.matches();
  }

}

运算截图:

130242014005-樊镇霄-第2次实验_第4张图片

 

你可能感兴趣的:(130242014005-樊镇霄-第2次实验)