130242014017-蔡志峰-第2次实验

一、实验目的

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

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

3、理解解释器的原理

4、理解编译器模型

二、实验环境

硬件: 

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

三、实验内容

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

结果要求:

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

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

3)处理空格

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

  图1    实验结果示例

四、实验步骤:

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

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

算法结构图参照如下:

代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    输入表达式计算,例如:5+9=
    <br>
输入:<input id="input"/>
结果:<input id="output"/>
</body>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<script>


 


    $("#input").bind('input porpertychange',function(){
        if($(this).val().substr($(this).val().length-1) == '='){
                var oIn = document.getElementById("input");
                var oOut = document.getElementById("output");

                var numArr = [];
                var opArr = [];
                var numStr = "";

                //字符串去空格和等于号
                var val = oIn.value.substr(0,oIn.value.length-1).replace(/\s+/g,"");

                if(!checkOperator(val)||!checkFloat(val)){
                    oOut.value="格式错误,请重新输入";
                    return;
                }

                for(var i in val){

                    var str = val[i];

                    if(isNaN(str)){

                        opArr.push(str);
                        numStr+=" ";

                    }
                    else{
                        numStr+=str;
                    }


                }

                numArr = numStr.split(' ');


                //计算乘除法
                for(var i = opArr.length;i>=0;i--){
                    if(opArr[i] == '*'){
                        numArr[i] = numArr[i] * numArr[i+1];

                        numArr.splice(i+1,1);
                        opArr.splice(i,1);

                    }
                    else if(opArr[i] == '/'){
                        numArr[i] = numArr[i] / numArr[i+1];
                        numArr.splice(i+1,1);
                        opArr.splice(i,1);

                    }
                }


                //计算加减法
                for(var i = opArr.length;i>=0;i--){
                    if(opArr[i] == '+'){
                        numArr[i] = numArr[i]*1.0 + numArr[i+1]*1.0;

                        numArr.splice(i+1,1);
                        opArr.splice(i,1);

                    }
                    else if(opArr[i] == '-'){
                        numArr[i] = numArr[i] - numArr[i+1];
                        numArr.splice(i+1,1);
                        opArr.splice(i,1);

                    }
                }

                oOut.value = numArr[0];
        }
    });


    // 检查运算符是否合法,第一个字符是除“-”意外的运算符都是非法的,最后一个字符是运算符,也是非法的;
    // 检查是否含有不合法的多运算符 “**”,“*\/”,"*+","*-","+*","++","+\/"以及两以上的连续运算符都是不允许的
    // 在多运算符里面除了 “--”,“+-”都是不合法的多运算符
    //
    function checkOperator(expression) {
        /**
         * (^[\+\*\/])|([\+\-\*\/\^\√]$) 匹配首字符或是最后一个字符是不是运算符
         * ([\+\-\*\/][\+\*\/]+) [+,*,-,/]搭配一个或是多个[+,*,/]
         * ([\*\/](\-)+) [*,/]搭配一个或是多个[-]
         * ([\+\-](\-){2,}) [+,-]搭配两个以上的[-]
         * (\√[^\d\(]+) 表示后面不能有除了数数字及括号意外的东西
         * ((?:[^\d\)]+)\^)
         * (\^[^\d\(]+)
         * ((?:[^\d\)]+)\^[^\d\(]+) 表示前面和后面不能有数字及括号意外的字符
         * ([\√\^]{2,}) 这个两个符号不可以连续
         * ([\√\^]\d+[\√\^]) √2^,^22√222这样也是不允许的
         * @type RegExp
         */
      var reg = /(^[\+\*\/])|([\+\-\*\/\^\√]$)|([\+\-\*\/][\+\*\/]+)|([\*\/](\-)+)|([\+\-](\-){2,})|((?:[^\d\+\-\*\/])\√)|(\√[^\d\(]+)|((?:[^\d\)]+)\^)|(\^[^\d\(]+)|([\√\^]{2,})|([\√\^]\d+[\√\^])/;
      if(reg.test(expression)) {
          return false;
      }
      return true;
    };
    /**
     * 
     * 检查“.”是否在正确位置,".+","+.","^.",".$","2.2.3.4.5","..","..."都是不允许的。
     */
    function checkFloat(expression) {
        /**
         * (^\.)|(\.$) expression以.开头或结尾
         * ([\+\-\*\/]\.)|(\.[\+\-\*\/]) expression出现".+","+."等情况
         * ((\d+\.+){2,}\d*) expression出现"2.2.3.4.5","..","..."等情况
         */
        var reg = /(^\.)|(\.$)|([\+\-\*\/\^\√]\.)|(\.[\+\-\*\/\^\√])|((\d+\.+){2,}\d*)/;
        if (reg.test(expression)) {
            return false;
        }
        return true;
    };

  

</script>
</html>

 

五、实验总结

熟悉体系结构的风格的概念,理解解释器的原理

posted @ 2017-10-26 16:02  zz_theDawn  阅读(229)  评论(0编辑  收藏  举报