Expression * crb_create_binary_expression(ExpressionType operator, Expression *left, Expression *right) { if ((left->type == INT_EXPRESSION || left->type == DOUBLE_EXPRESSION) && (right->type == INT_EXPRESSION || right->type == DOUBLE_EXPRESSION)) { CRB_Value v; v = crb_eval_binary_expression(crb_get_current_interpreter(), NULL, operator, left, right); /* Overwriting left hand expression. */ *left = convert_value_to_expression(&v); return left; } else { Expression *exp; exp = crb_alloc_expression(operator); exp->u.binary_expression.left = left; exp->u.binary_expression.right = right; return exp; } }
static CRB_Value eval_expression(CRB_Interpreter *inter, LocalEnvrioment *env, Expression *expr) { CRB_Value v; switch(expr->type){ case BOOLEAN_EXPRESSION: v = eval_boolean_expression(expr->u.boolean_value); break; case INT_EXPRESSION: v = eval_int_expression(expr->u.int_value); break; case DOUBLE_EXPRESSION: v = eval_double_expression(expr->u.double_value); break; case STRING_EXPRESSION: v = eval_string_expression(inter, expr->u.string_value); break; case IDENTIFIER_EXPRESSION: v = eval_identifier_expression(inter, env, expr); break; case ASSIGN_EXPRESSION: v = eval_assign_expression(inter, env, expr->u.assign_expression.variable, expr->u.assign_expression.operand); break; case ADD_EXPRESSION: case SUB_EXPRESSION: case MUL_EXPRESSION: case DIV_EXPRESSION: case MOD_EXPRESSION: case EQ_EXPRESSION: case NE_EXPRESSION: case GT_EXPRESSION: case GE_EXPRESSION: case LT_EXPRESSION: case LE_EXPRESSION: v = crb_eval_binary_expression(inter, env, expr->type, expr->u.binary_expression.left, expr->u.binary_expression.right); break; case LOGICAL_AND_EXPRESSION: case LOGICAL_OR_EXPRESSION: v = crb_eval_and_or_expression(inter ,env, expr->type, expr->u.binary_expression.left, expr->u.binary_expression.right); break; case MINUS_EXPRESSION: v = crb_eval_minus_expression(inter, env, expr->u.minus_expression); break; case FUNCTION_CALL_EXPRESSION: v = eval_function_call_expression(inter, env, expr); break; case NULL_EXPRESSION: v = eval_null_expression(); break; case EXPRESSION_TYPE_COUNT_PLUS_1: default: DBG_panic(("bad case.type..%d\n", expr->type)); } return v; }