private NospaceExpression(Expression expressionLeft, InfixOperator infixOperator, Expression expressionRight) : base(expressionLeft, infixOperator, expressionRight) { ExpressionLeft = expressionLeft; InfixOperator = infixOperator; ExpressionRight = expressionRight; }
private static NospaceExpression ProduceInfixOperation(IEnumerable<Symbol> symbols) { var z = symbols.Rollup(0, (t, d) => { if (t is OpenParenthesis) return d + 1; if (t is CloseParenthesis) return d - 1; return d; }); var symbolsWithIndex = symbols.Select((s, i) => new { Symbol = s, Index = i, }); var z2 = symbolsWithIndex.Zip(z, (v1, v2) => new { SymbolWithIndex = v1, Depth = v2, }); var operatorList = z2 .Where(x => x.Depth == 0 && x.SymbolWithIndex.Index != 0 && InfixOperator.Produce(x.SymbolWithIndex.Symbol) != null) .ToList(); if (operatorList.Any()) { var minPrecedence = operatorList .Select(o2 => OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()]).Min(); var op = operatorList .Last(o2 => OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()] == minPrecedence); if (op != null) { var expressionTokenList1 = symbols.TakeWhile(t => t != op.SymbolWithIndex.Symbol); var expressionLeft = Expression.Produce(expressionTokenList1); if (expressionLeft == null) throw new ParserException("Invalid expression"); var expressionTokenList2 = symbols .SkipWhile(t => t != op.SymbolWithIndex.Symbol).Skip(1); var expressionRight = Expression.Produce(expressionTokenList2); if (expressionRight == null) throw new ParserException("Invalid expression"); var infixOperator = new InfixOperator(op.SymbolWithIndex.Symbol); return new NospaceExpression(expressionLeft, infixOperator, expressionRight); } } return null; }