130242014013+黄超+第2次实验

Posted 朝阳超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了130242014013+黄超+第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  编译器模型示意图

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

四、实验步骤:

 代码如下:

package fjnu.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Arithmetic {
public static void main(String args[]){
//System.out.println(arithmetic("2.2+((3+4)*2-22)/2*3.2"));
//System.out.println(arithmetic("2+333 *5-6"));
/* try {
System.out.println(arithmetic("1+"));
}catch(Error e){
System.out.println("输入的格式有问题请重新输入");
}*/

Scanner input=new Scanner(System.in);

while(true){
String entry = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

while (true) {
try {
System.out.print("calc > ");
entry = reader.readLine();
if(entry==null ||entry.length()==0)
{
System.out.println("没有输入就回车!");
continue;
}
System.out.println(arithmetic(entry));
} catch (Error e) {
System.out.println("输入的格式和形式是有误的有问题,重新输入正确的格式!");
}catch (Exception e) {
System.out.println("输入的格式和形式是有误的有问题,重新输入正确的格式!");
}

}
}
}
public static double arithmetic(String exp){

String result = parseExp(exp).replaceAll("[\\\\[\\\\]]", "");
return Double.parseDouble(result);
}
/**
* 解析计算四则运算表达式,例:2+((3+4)*2-22)/2*3
* @param expression
* @return
*/
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);
}
/**
* 计算最小单位四则运算表达式(两个数字)
* @param exp
* @return
*/
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;
}
}

 

以上是关于130242014013+黄超+第2次实验的主要内容,如果未能解决你的问题,请参考以下文章

130242014074+林泽民+第2次实验

130242014067+李清灿+第2次实验

130242014045 林承晖 第2次实验

数据采集第二次实验

130242014058+吴伟铭+第2次实验

130242014048-谢添华-第2次实验