Пример #1
0
        internal static BitsValue GetValue(ref CaseContext ctx, Expression expr)
        {
            switch (expr.Type)
            {
            case ExpressionType.FunctionCall:
                return(DoFunctionCall(ref ctx, (FunctionCallExpression)expr));

            case ExpressionType.Indexer:
                var indexer = (IndexerExpression)expr;
                if (indexer.Operand.Type == ExpressionType.Slot)
                {
                    return(DoSlotExpression(ref ctx, (SlotExpression)indexer.Operand, indexer));
                }
                return(DoIndexerExpression(ref ctx, (IndexerExpression)expr));

            case ExpressionType.List:
                return(DoListExpression(ref ctx, (ListExpression)expr));

            case ExpressionType.NumberLiteral:
                return(((NumberLiteralExpression)expr).Value);

            case ExpressionType.Operator:
                return(DoOperator(ref ctx, (OperatorExpression)expr));

            case ExpressionType.Slot:
                return(DoSlotExpression(ref ctx, (SlotExpression)expr, null));

            case ExpressionType.UnaryOperator:
                return(DoUnaryOperator(ref ctx, (UnaryOperatorExpression)expr));

            case ExpressionType.VariableAccess:
                return(ctx.Get(((VariableAccessExpression)expr).Name, expr));
            }

            throw new LogicEngineException("Expected multi-bit value", expr);
        }