/// <summary> /// 将表达式中的操作数和运算符分割出来 /// </summary> /// <param name="expression">文本表达式</param> /// <returns>操作数与运算符表</returns> internal static List <IOperatorOrOperand> SplitExpression(string expression) { List <IOperatorOrOperand> output = new List <IOperatorOrOperand>(); StringBuilder operandbuf = new StringBuilder(); StringBuilder operatorbuf = new StringBuilder(); // 记录刚才最后输出的表达式项 IOperatorOrOperand lastItem = null; // 在尾部添加一个空格,帮助分离最后一个操作数或运算符 expression = expression + " "; double result = 0; for (int i = 0; i < expression.Length; i++) { if (char.IsDigit(expression[i]) == true || expression[i] == '.') { // 如果是数字或小数点(操作数成份) // 结束前一个运算符 if (operatorbuf.Length > 0) { // 尝试获取运算符 OperatorBase opr = TryGetOperator(operatorbuf.ToString(), lastItem); if (opr != null) { output.Add(opr); lastItem = opr; operatorbuf.Length = 0; } else { throw new InvalidCastException(operatorbuf.ToString() + " 无法解析为合法的运算符。"); } } // 合并入当前操作数项 operandbuf.Append(expression[i]); } else { // 不是数字或小数点(运算符成份) // 结束前一个操作数 if (operandbuf.Length > 0) { if (double.TryParse(operandbuf.ToString(), out result) == false) { throw new FormatException(operandbuf.ToString() + " 无法解析为合法的操作数。"); } // 输出操作数 OperandInfo operand = new OperandInfo(double.Parse(operandbuf.ToString())); output.Add(operand); lastItem = operand; operandbuf.Length = 0; } // 合并非空白字符到当前运算符项 if (char.IsWhiteSpace(expression[i]) == false) { operatorbuf.Append(expression[i]); } // 分析并输出运算符 if (operatorbuf.Length > 0) { // 尝试获取运算符 OperatorBase opr = TryGetOperator(operatorbuf.ToString(), lastItem); if (opr != null) { output.Add(opr); lastItem = opr; operatorbuf.Length = 0; } } } } return(output); }
/// <summary> /// 尝试返回一个运算符对象 /// </summary> /// <param name="exp">要测试的字符串</param> /// <param name="leftItem"></param> /// <returns>如果成功,返回一个运算符对象实例;否则返回空</returns> private static OperatorBase TryGetOperator(string exp, IOperatorOrOperand leftItem) { // 判断左侧是否是操作数 bool hasLeftOperand = false; if (leftItem == null) { // 没有左项 hasLeftOperand = false; } else if (leftItem.IsOperand) { // 左项是操作数 hasLeftOperand = true; } else if (leftItem.GetType() == typeof(OperatorCloseBracket)) { // 左项是闭括号 hasLeftOperand = true; } else { // 其它情况 hasLeftOperand = false; } // 根据符号文本判断 string symbol = exp.ToUpper(); switch (symbol) { case "(": return(new OperatorOpenBracket()); case ")": return(new OperatorCloseBracket()); } // 根据左操作数情况判断 if (hasLeftOperand == true) { // 有左操作数者 switch (exp.ToUpper()) { case "+": return(new OperatorPlus()); case "-": return(new OperatorMinus()); case "*": return(new OperatorMultiply()); case "/": return(new OperatorDivide()); case "%": return(new OperatorMod()); case "^": return(new OperatorPower()); case "AND": return(new OperatorBitAnd()); case "OR": return(new OperatorBitOr()); case "XOR": return(new OperatorBitXor()); case "<<": return(new OperatorBitShiftLeft()); case ">>": return(new OperatorBitShiftRight()); } } else { // 没有左操作数 switch (exp.ToUpper()) { case "+": return(new OperatorPositive()); case "-": return(new OperatorNegative()); case "~": return(new OperatorBitReverse()); } } // 不可判断者,返回空 return(null); }
/// <summary> /// ���Է���һ����������� /// </summary> /// <param name="exp">Ҫ���Ե��ַ���</param> /// <param name="leftItem"></param> /// <returns>����ɹ�������һ�����������ʵ�������ؿ�</returns> private static OperatorBase TryGetOperator(string exp, IOperatorOrOperand leftItem) { // �ж�����Ƿ��Dz����� bool hasLeftOperand = false; if (leftItem == null) { // û������ hasLeftOperand = false; } else if (leftItem.IsOperand) { // �����Dz����� hasLeftOperand = true; } else if (leftItem.GetType() == typeof(OperatorCloseBracket)) { // �����DZ����� hasLeftOperand = true; } else { // ������� hasLeftOperand = false; } // ���ݷ����ı��ж� string symbol = exp.ToUpper(); switch (symbol) { case "(": return new OperatorOpenBracket(); case ")": return new OperatorCloseBracket(); } // ���������������ж� if (hasLeftOperand == true) { // ����������� switch (exp.ToUpper()) { case "+": return new OperatorPlus(); case "-": return new OperatorMinus(); case "*": return new OperatorMultiply(); case "/": return new OperatorDivide(); case "%": return new OperatorMod(); case "^": return new OperatorPower(); case "AND": return new OperatorBitAnd(); case "OR": return new OperatorBitOr(); case "XOR": return new OperatorBitXor(); case "<<": return new OperatorBitShiftLeft(); case ">>": return new OperatorBitShiftRight(); } } else { // û��������� switch (exp.ToUpper()) { case "+": return new OperatorPositive(); case "-": return new OperatorNegative(); case "~": return new OperatorBitReverse(); } } // �����ж��ߣ����ؿ� return null; }