#include <stdio.h>
#include "DBG.h"
#include "calc.h"
void
clc_function_define(char *identifier, ParameterList *parameter_list,
Expression *expression_list)
{
FunctionDefinition *f;
if (clc_search_function(identifier)) {
clc_compile_error(FUNCTION_MULTIPLE_DEFINE_ERR, "(%s)\n", identifier);
clc_reopen_current_storage();
return;
}
f = clc_malloc(sizeof(FunctionDefinition));
f->name = identifier;
f->parameter = parameter_list;
f->expression_list = expression_list;
f->storage = clc_current_interpreter->current_storage;
clc_current_interpreter->current_storage = MEM_open_storage(0);
f->next = clc_current_interpreter->function_list;
clc_current_interpreter->function_list = f;
}
ParameterList*
clc_create_parameter(char *identifier)
{
ParameterList *p;
p = clc_malloc(sizeof(ParameterList));
p->name = identifier;
p->next = NULL;
return p;
}
ParameterList *
chain_parameter(ParameterList *list, ParameterList *add)
{
ParameterList *pos;
for (pos = list; pos->next; pos = pos->next)
;
pos->next = add;
return list;
}
ParameterList*
clc_chain_parameter(ParameterList *list, char *identifier)
{
ParameterList *add;
add = clc_create_parameter(identifier);
return chain_parameter(list, add);
}
Expression *
clc_alloc_expression(ExpressionType type)
{
Expression *exp;
exp = clc_malloc(sizeof(Expression));
exp->type = type;
return exp;
}
Expression *
clc_create_expression_list(Expression *expression)
{
Expression *exp;
exp = clc_alloc_expression(EXPRESSION_LIST_EXPRESSION);
exp->u.expression_list.expression = expression;
exp->u.expression_list.next = NULL;
return exp;
}
Expression *
clc_chain_expression_list(Expression *list, Expression *add)
{
Expression *exp;
Expression *pos;
exp = clc_alloc_expression(EXPRESSION_LIST_EXPRESSION);
exp->u.expression_list.expression = add;
exp->u.expression_list.next = NULL;
for (pos = list; pos->u.expression_list.next;
pos = pos->u.expression_list.next)
;
pos->u.expression_list.next = exp;
return list;
}
Expression *
clc_create_assign_expression(char *variable,
Expression *operand)
{
Expression *exp;
exp = clc_alloc_expression(ASSIGN_EXPRESSION);
exp->u.assign_expression.variable = variable;
exp->u.assign_expression.operand = operand;
return exp;
}
static Expression
convert_value_to_expression(Value *v)
{
Expression expr;
if (v->type == INT_VALUE) {
expr.type = INT_EXPRESSION;
expr.u.int_value = v->u.int_value;
} else {
DBG_assert(v->type == DOUBLE_VALUE, ("v->type..%d\n", v->type));
expr.type = DOUBLE_EXPRESSION;
expr.u.double_value = v->u.double_value;
}
return expr;
}
Expression *
clc_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)) {
Value v;
v = clc_eval_binary_expression(NULL, operator, left, right);
/* Overwriting left hand expression. */
*left = convert_value_to_expression(&v);
return left;
} else {
Expression *exp;
exp = clc_alloc_expression(operator);
exp->u.binary_expression.left = left;
exp->u.binary_expression.right = right;
return exp;
}
}
Expression *
clc_create_minus_expression(Expression *operand)
{
if (operand->type == INT_EXPRESSION
|| operand->type == DOUBLE_EXPRESSION) {
Value v;
v = clc_eval_minus_expression(NULL, operand);
/* Notice! Overwriting operand expression. */
*operand = convert_value_to_expression(&v);
return operand;
} else {
Expression *exp;
exp = clc_alloc_expression(MINUS_EXPRESSION);
exp->u.minus_expression = operand;
return exp;
}
}
Expression *
clc_create_identifier_expression(char *identifier)
{
Expression *exp;
exp = clc_alloc_expression(IDENTIFIER_EXPRESSION);
exp->u.identifier = identifier;
return exp;
}
Expression *
clc_create_if_expression(Expression *condition,
Expression *then_expression,
Expression *else_expression)
{
Expression *exp;
exp = clc_alloc_expression(IF_EXPRESSION);
exp->u.if_expression.condition = condition;
exp->u.if_expression.then_expression = then_expression;
exp->u.if_expression.else_expression = else_expression;
return exp;
}
Expression *
clc_create_while_expression(Expression *condition,
Expression *expression)
{
Expression *exp;
exp = clc_alloc_expression(WHILE_EXPRESSION);
exp->u.while_expression.condition = condition;
exp->u.while_expression.expression_list = expression;
return exp;
}
Expression *
clc_create_function_call_expression(char *func_name,
Expression *argument)
{
Expression *exp;
exp = clc_alloc_expression(FUNCTION_CALL_EXPRESSION);
exp->u.function_call_expression.identifier = func_name;
exp->u.function_call_expression.argument = argument;
return exp;
}