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); }