📄 expression.as
字号:
//Class:Expression Author:Swfdong Date:2007-7-1package { import Fraction; import AdvancedMath; public class Expression { private var EXPRESSION_SOURCE:String; private static var EXPRESSION_OPERATOR:Array=new Array("arcsin",3,"arccos",3,"arctan",3,"sin",3,"cos",3,"tan",3,"cot",3,"^",3,"*",2,"/",2,"+",1,"-",1); private static var EXPRESSION_OPERATORLENGTH:Number; private static var EXPRESSION_STEPCACHE:Array; private static var EXPRESSION_STEPDATA:Array; function Expression(str:String) { } //无步骤解析 public static function parse(str:String):String { return mainparse(str,false); } //带步骤解析 public static function step(str:String):Array { EXPRESSION_STEPCACHE=new Array(3); EXPRESSION_STEPDATA=new Array ; EXPRESSION_STEPDATA.push(mainparse(str,true)); return EXPRESSION_STEPDATA; } //内部解析,包括字符串 private static function mainparse(str:String,step:Boolean):String { EXPRESSION_OPERATORLENGTH=EXPRESSION_OPERATOR.length / 2; var startIndex:Number=0; while (str.indexOf("(",startIndex) != -1 & str.indexOf(")",startIndex) != -1 && str.split("(").length == str.split(")").length) { var nowIndex:Number=str.indexOf("(",startIndex) + 1; var backIndex:Number=str.indexOf(")",nowIndex); if (backIndex < str.indexOf("(",nowIndex) || str.indexOf("(",nowIndex) == -1) { if (step) { EXPRESSION_STEPCACHE[0]=str.substr(0,nowIndex); EXPRESSION_STEPCACHE[2]=str.substring(backIndex,str.length); } str=str.substr(0,nowIndex - 1) + calculate(str.substring(nowIndex,backIndex),step) + str.substring(backIndex + 1,str.length); startIndex=0; } else { startIndex=nowIndex; } } if (step) { EXPRESSION_STEPCACHE[0]=EXPRESSION_STEPCACHE[2]=""; } return calculate(str,step); } //无括号内容的计算 private static function calculate(str:String,step:Boolean):String { while (String(parseFloat(str)) != str && new Fraction(str).value != str) { var topIndex:Number=str.length; var topOperator:Number=0; var topLevel:Number=0; for (var i:Number=0; i < EXPRESSION_OPERATORLENGTH; i++) { var tIndex:Number=str.indexOf(EXPRESSION_OPERATOR[i * 2],i < 7?0:1); var tLevel:Number=EXPRESSION_OPERATOR[i * 2 + 1]; if (tIndex != -1 && (tLevel == topLevel && tIndex < topIndex || tLevel > topLevel)) { topIndex=tIndex; topLevel=tLevel; topOperator=i * 2; } } var OperatorLength:Number=EXPRESSION_OPERATOR[topOperator].length; if (step) { EXPRESSION_STEPDATA.push((EXPRESSION_STEPCACHE[0] != undefined?EXPRESSION_STEPCACHE[0]:"")+ str + (EXPRESSION_STEPCACHE[2] != undefined?EXPRESSION_STEPCACHE[2]:"")); } var prevO:Number=prevOperator(str,topIndex - 1); var nextO:Number=nextOperator(str,topIndex + OperatorLength); str=str.substring(0,prevO) + operation(str.substring(prevO,topIndex),str.substring(topIndex + OperatorLength,nextO),str.substr(topIndex,OperatorLength)) + str.substring(nextO,str.length); } return str; } //单步计算 private static function operation(n1:String,n2:String,operator:String):String { var frc1:Fraction= !isNaN(parseFloat(n1))|| n1.indexOf("|") != -1?new Fraction(n1):new Fraction("0|1"); var frc2:Fraction= !isNaN(parseFloat(n2))|| n2.indexOf("|") != -1?new Fraction(n2):new Fraction("0|1"); operator=n1 == "-"?"+":operator; switch (operator) { case "+" : return AdvancedMath.plus(frc1,frc2); case "-" : return AdvancedMath.minus(frc1,frc2); case "*" : return AdvancedMath.multiply(frc1,frc2); case "/" : return AdvancedMath.divide(frc1,frc2); case "^" : return AdvancedMath.pow(frc1,frc2); case "sin" : return AdvancedMath.sin(frc2); case "cos" : return AdvancedMath.cos(frc2); case "tan" : return AdvancedMath.tan(frc2); case "cot" : return AdvancedMath.cot(frc2); case "arcsin" : return AdvancedMath.arcsin(frc2); case "arccos" : return AdvancedMath.arccos(frc2); case "arctan" : return AdvancedMath.arctan(frc2); default : return frc2.value; } } //上一个运算符 private static function prevOperator(str:String,startIndex:Number):Number { var OperatorIndexData:Array=new Array; var tIndex:Number=0; for (var i:Number=0; i < EXPRESSION_OPERATORLENGTH; i++) { tIndex=str.lastIndexOf(EXPRESSION_OPERATOR[i * 2],startIndex); tIndex=EXPRESSION_OPERATOR[i * 2] == "-" && tIndex == 0?-199186:tIndex; OperatorIndexData.push(tIndex != -1?tIndex:-199186); } OperatorIndexData.sort(Array.NUMERIC); tIndex=(OperatorIndexData[OperatorIndexData.length - 1] != -199186)?(OperatorIndexData[OperatorIndexData.length - 1] + 1):0; return tIndex; } //下一个运算符 private static function nextOperator(str:String,startIndex:Number):Number { var OperatorIndexData:Array=new Array; var tIndex:Number=0; for (var i:Number=0; i < EXPRESSION_OPERATORLENGTH; i++) { tIndex=str.indexOf(EXPRESSION_OPERATOR[i * 2],startIndex); tIndex=EXPRESSION_OPERATOR[i * 2] == "-" && tIndex == startIndex?str.indexOf("-",tIndex + 1):tIndex; OperatorIndexData.push(tIndex != -1?tIndex:199186); } OperatorIndexData.sort(Array.NUMERIC); tIndex=(OperatorIndexData[0] != 199186)?OperatorIndexData[0]:str.length; return tIndex; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -