130242014017
一、实验目的
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=".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>
五、实验总结
熟悉体系结构的风格的概念,理解解释器的原理
转载于:.html
更多推荐
130242014017
发布评论