#ifndef PRIVATE_CALC_H_INCLUDED #define PRIVATE_CALC_H_INCLUDED #include <stdio.h> #include <setjmp.h> #include "MEM.h" #include "CLC.h" #define smaller(a, b) ((a) < (b) ? (a) : (b)) #define larger(a, b) ((a) > (b) ? (a) : (b)) typedef enum { PARSE_ERR = 1, CHARACTER_INVALID_ERR, FUNCTION_MULTIPLE_DEFINE_ERR, COMPILE_ERROR_NUM } CompileError; typedef enum { VARIABLE_NOT_FOUND_ERR = 1, FUNCTION_NOT_FOUND_ERR, BOOLEAN_EXPECTED_ERR, ARGUMENT_TOO_MANY_ERR, ARGUMENT_TOO_FEW_ERR, RUNTIME_ERROR_NUM } RuntimeError; typedef struct Expression_tag Expression; typedef enum { INT_EXPRESSION = 1, DOUBLE_EXPRESSION, IDENTIFIER_EXPRESSION, EXPRESSION_LIST_EXPRESSION, ASSIGN_EXPRESSION, ADD_EXPRESSION, SUB_EXPRESSION, MUL_EXPRESSION, DIV_EXPRESSION, MOD_EXPRESSION, EQ_EXPRESSION, NE_EXPRESSION, GT_EXPRESSION, GE_EXPRESSION, LT_EXPRESSION, LE_EXPRESSION, MINUS_EXPRESSION, IF_EXPRESSION, WHILE_EXPRESSION, FUNCTION_CALL_EXPRESSION, EXPRESSION_TYPE_NUM } ExpressionType; typedef struct { Expression *expression; Expression *next; } ExpressionList; typedef struct { char *variable; Expression *operand; } AssignExpression; typedef struct { Expression *left; Expression *right; } BinaryExpression; typedef struct { Expression *condition; Expression *then_expression; Expression *else_expression; } IfExpression; typedef struct { Expression *condition; Expression *expression_list; } WhileExpression; typedef struct { char *identifier; Expression *argument; } FunctionCallExpression; struct Expression_tag { ExpressionType type; union { int int_value; double double_value; char *identifier; ExpressionList expression_list; AssignExpression assign_expression; BinaryExpression binary_expression; Expression *minus_expression; IfExpression if_expression; FunctionCallExpression function_call_expression; WhileExpression while_expression; } u; }; typedef struct ParameterList_tag { char *name; struct ParameterList_tag *next; } ParameterList; typedef struct FunctionDefinition_tag { char *name; ParameterList *parameter; Expression *expression_list; MEM_Storage storage; struct FunctionDefinition_tag *next; } FunctionDefinition; typedef enum { INT_VALUE = 1, DOUBLE_VALUE, NULL_VALUE } ValueType; typedef struct { ValueType type; union { int int_value; double double_value; } u; } Value; typedef struct Variable_tag { char *name; Value value; struct Variable_tag *next; } Variable; typedef struct { Variable *variable; } LocalEnvironment; struct CLC_Interpreter_tag { CLC_InputMode input_mode; FILE *input_fp; MEM_Storage global_storage; MEM_Storage current_storage; Variable *variable; FunctionDefinition *function_list; jmp_buf error_recovery_environment; }; #ifdef GLOBAL_VARIABLE_DEFINE #define GLOBAL #else #define GLOBAL extern #endif GLOBAL CLC_Interpreter clc_current_interpreter; /* calc.l */ void clc_initialize_readline_buffer(void); /* create.c */ void clc_function_define(char *identifier, ParameterList *parameter_list, Expression *expression_list); ParameterList *clc_create_parameter(char *identifier); ParameterList *clc_chain_parameter(ParameterList *list, char *identifier); Expression *clc_alloc_expression(ExpressionType type); Expression *clc_create_expression_list(Expression *expression); Expression *clc_chain_expression_list(Expression *list, Expression *add); Expression *clc_create_assign_expression(char *variable, Expression *operand); Expression *clc_create_binary_expression(ExpressionType operator, Expression *left, Expression *right); Expression *clc_create_minus_expression(Expression *operand); Expression *clc_create_identifier_expression(char *identifier); Expression *clc_create_if_expression(Expression *condition, Expression *then_expression, Expression *else_expression); Expression *clc_create_while_expression(Expression *condition, Expression *expression); Expression *clc_create_function_call_expression(char *func_name, Expression *expression); /* eval.c */ void clc_eval_expression(Expression *expr); Value clc_eval_binary_expression(LocalEnvironment *env, ExpressionType operator, Expression *left, Expression *right); Value clc_eval_minus_expression(LocalEnvironment *env, Expression *operand); /* util.c */ void clc_print_expression(Expression *expression); void *clc_malloc(size_t size); Value *clc_search_local_variable(LocalEnvironment *env, char *identifier); Value *clc_search_global_variable(char *identifier); Value *clc_search_local_variable(LocalEnvironment *env, char *identifier); Value *clc_search_global_variable(char *identifier); void clc_add_local_variable(LocalEnvironment *env, char *identifier, Value *value); void clc_add_global_variable(char *identifier, Value *value); FunctionDefinition *clc_search_function(char *name); void clc_reopen_current_storage(void); /* error.c */ void clc_compile_error(CompileError id, char *fmt, ...); void clc_runtime_error(RuntimeError id, char *fmt, ...); #endif /* PRIVATE_CALC_H_INCLUDED */