一、实验目的
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>
五、实验总结
熟悉体系结构的风格的概念,理解解释器的原理