示例#1
0
 private NospaceExpression(Expression expressionLeft, InfixOperator infixOperator, Expression expressionRight)
     : base(expressionLeft, infixOperator, expressionRight)
 {
     ExpressionLeft = expressionLeft;
     InfixOperator = infixOperator;
     ExpressionRight = expressionRight;
 }
示例#2
0
 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;
 }