private IExpression GetExpression(SubExpression s) { var subs = s.GetSubExpressions(); if (subs == null) { return(null); } if (subs.Length == 1) { if (!subs[0].ExpressionString.HasMathSymbols()) { if (subs[0].ExpressionString.All(char.IsLetter)) { if (!Variables.ContainsKey(subs[0].ExpressionString)) { Variables.Add(subs[0].ExpressionString, 0); } return(new VariableValueExpression(subs[0].ExpressionString, Variables)); } return(new StaticValueExpression(subs[0].ExpressionString)); } else { var ct = GetCalcType(subs[0].ExpressionString[0]); if (ct != null) { return(new StaticCalcExpression(ct.Value)); } else { throw new InvalidExpressionException(subs[0].ExpressionString); } } } var es = new List <IExpression>(); for (var i = 0; i < subs.Length; i++) { var ex = GetExpression(subs[i]); if (ex != null) { es.Add(ex); } } if (es.Count > 0) { if (es.Count < 3) { throw new InvalidExpressionException(s.ExpressionString); } if (es.Any(e => e is StaticCalcExpression)) { do { var index = IndexOfCalc(es); var calc = (StaticCalcExpression)es[index]; var v1 = es[index - 1]; var v2 = es[index + 1]; var e = new CalcExpression(v1, v2, calc.Type); es.RemoveRange(index - 1, 3); es.Insert(index - 1, e); } while (es.Count > 1); } return(es.First()); } return(null); }