private Stack <IExpression> opStack = new Stack <IExpression>(); //堆栈 //解析表达式,返回后缀表达式 private bool Parse(string text) { string expression = text.Trim(); string literal = string.Empty; //变量/常数/函数名等 IExpression op = null; //操作符 bool isStringToken = false; int pos = 0; while (pos < expression.Length) { isStringToken = false; string token = GetToken(expression, ref pos, ref isStringToken); if (RegsitryManager.ISOperator(token)) { InsertPostfixExpression(new OperatorExprssion(token)); } else if (RegsitryManager.IsFunction(token)) { //函数其实是一种特殊的运算符 InsertPostfixExpression(new FuncExpression(token)); } else { //值 postExpression.Add(new VariableExpression(token, isStringToken)); } } //AddPostExpressionLiteral(); //最后stack中的所有数据弹出加入到对应中 while (opStack.Count > 0) { op = opStack.Pop(); if (op.Identity == RegsitryManager.TOKEN_LEFT) { //括号不匹配 throw new AddinException(text + "Expression invalid!"); } else { postExpression.Add(op); } } //去掉逗号运算符 postExpression.RemoveAll(item => item.Identity == RegsitryManager.TOKEN_COMMA); return(true); }
public static OperatorType OpType(string text) { if (text == RegsitryManager.TOKEN_LEFT) { return(OperatorType.LEFT); } if (text == RegsitryManager.TOKEN_RIGHT) { return(OperatorType.RIGHT); } if (text == RegsitryManager.TOKEN_ADD) { return(OperatorType.ADD); } if (text == RegsitryManager.TOKEN_SUB) { return(OperatorType.SUB); } if (text == RegsitryManager.TOKEN_MUL) { return(OperatorType.MUL); } if (text == RegsitryManager.TOKEN_DIV) { return(OperatorType.DIV); } if (text == RegsitryManager.TOKEN_AND) { return(OperatorType.AND); } if (text == RegsitryManager.TOKEN_OR) { return(OperatorType.OR); } if (text == RegsitryManager.TOKEN_LT) { return(OperatorType.LT); } if (text == RegsitryManager.TOKEN_GT) { return(OperatorType.GT); } if (text == RegsitryManager.TOKEN_LE) { return(OperatorType.LE); } if (text == RegsitryManager.TOKEN_GE) { return(OperatorType.GE); } if (text == RegsitryManager.TOKEN_ET) { return(OperatorType.ET); } if (text == RegsitryManager.TOKEN_UT) { return(OperatorType.UT); } //返回函数 if (RegsitryManager.IsFunction(text)) { return(OperatorType.FUNC); } return(OperatorType.ERR); }