130242014050-池国雄-实验二

一、实验目的

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)风格实现解释器

 

图 3  编译器模型示意图

 

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

四、实验步骤:

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

总体结构图参照体系结构风格。

算法结构图参照如下:

源代码:

import java.math.BigDecimal;

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Operate {

 public static void main(String args[]){

       while(true){

       System.out.print("请输入你要计算的表达式:");

       Scanner sc = new Scanner(System.in);

       String calc = sc.nextLine();

       System.out.println("="+arithmetic(calc));

       }

 }

 public static double arithmetic(String exp){

 String result = parseExp(exp).replaceAll("[\\[\\]]", "");

 return Double.parseDouble(result);

 }

 

 public static String parseExp(String expression){

 //String numberReg="^((?!0)\\d+(\\.\\d+(?<!0))?)|(0\\.\\d+(?<!0))$";

 expression=expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1");

 String checkExp="\\d";

 String minExp="^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$";

 //最小表达式计算

 if(expression.matches(minExp)){

  String result=calculate(expression);

  

  return Double.parseDouble(result)>=0?result:"["+result+"]";

 }

 //计算不带括号的四则运算

 String noParentheses="^[^\\(\\)]+$";

 String priorOperatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";

 String operatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";

 if(expression.matches(noParentheses)){

  Pattern patt=Pattern.compile(priorOperatorExp);

  Matcher mat=patt.matcher(expression);

  if(mat.find()){

  String tempMinExp=mat.group();

  expression=expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp));

  }else{

  patt=Pattern.compile(operatorExp);

  mat=patt.matcher(expression);

  

  if(mat.find()){

   String tempMinExp=mat.group();

   expression=expression.replaceFirst(operatorExp, parseExp(tempMinExp));

  }

  }

  return parseExp(expression);

 }

 //计算带括号的四则运算

 String minParentheses="\\([^\\(\\)]+\\)";

 Pattern patt=Pattern.compile(minParentheses);

 Matcher mat=patt.matcher(expression);

 if(mat.find()){

  String tempMinExp=mat.group();

  expression=expression.replaceFirst(minParentheses, parseExp(tempMinExp));

 }

 return parseExp(expression);

 }

 

 public static String calculate(String exp){

 exp=exp.replaceAll("[\\[\\]]", "");

 String number[]=exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(",");

 BigDecimal number1=new BigDecimal(number[0]);

 BigDecimal number2=new BigDecimal(number[1]);

 BigDecimal result=null;

 

 String operator=exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1");

 if("+".equals(operator)){

  result=number1.add(number2);

 }else if("-".equals(operator)){

  result=number1.subtract(number2);

 }else if("*".equals(operator)){

  result=number1.multiply(number2);

 }else if("/".equals(operator)){

  result=number1.divide(number2);

 }

 

 return result!=null?result.toString():null;

 }

}

 

 

posted @ 2017-10-28 21:45  机器人狸猫  阅读(188)  评论(0编辑  收藏  举报