fincsys_cpp.c

来自「FinC编译器源代码」· C语言 代码 · 共 1,930 行 · 第 1/5 页

C
1,930
字号
};

FinCStruct* finc_struct_new(String* p_name);
void finc_struct_destroy(Object* self);

Vector* finc_struct_init_data(FinCStruct* self, ADT p_raw);

void finc_struct_add_field (FinCStruct* self, FinCField* p_field);






int finc_struct_get_field_offset (FinCStruct* self, String* p_name);
int finc_struct_get_field_index (FinCStruct* self, String* p_name);
# 15 "../include/finc/finccontext.h" 2

typedef struct _FinCContext FinCContext;
struct _FinCContext
{
        Object parent;

        Bool script_return;
        Bool script_continue;
        Bool script_break;
        Bool script_in_cycle;

        HashTable* hash_global;
        HashTable* hash_local;
        HashTable* hash_functions;
        HashTable* hash_struct;

        int error;
};

extern FinCContext* g_finc_context;

FinCContext* finc_context_new ();
void finc_context_destroy (Object* self);




FinCFunc* finc_context_add_func_sys (FinCContext* self, unsigned char* p_name, FinCFuncSys p_sys);
FinCFunc* finc_context_add_func_sys_api (FinCContext* self, unsigned char* p_name, void* p_func);
FinCFunc* finc_context_add_func_native (FinCContext* self, unsigned char* p_name, void* p_native);
FinCFunc* finc_context_add_func_node (FinCContext* self, unsigned char* p_name, FinCNode* p_node);



void finc_context_add_var (FinCContext* self, FinCVar* p_var, Bool p_global);
FinCVar* finc_context_get_var (FinCContext* self, String* p_name);






HashTable* finc_context_func_enter (FinCContext* self);
void finc_context_func_leave (FinCContext* self, HashTable* p_hash);
# 4 "fincsys.c" 2

# 1 "../include/finc/finclib.h" 1




# 1 "D:/Bernard/DDE/mingw/include/stdarg.h" 1 3





# 1 "D:/Bernard/DDE/mingw/lib/gcc-lib/mingw32/3.2.3/include/stdarg.h" 1 3
# 111 "D:/Bernard/DDE/mingw/lib/gcc-lib/mingw32/3.2.3/include/stdarg.h" 3
typedef __gnuc_va_list va_list;
# 7 "D:/Bernard/DDE/mingw/include/stdarg.h" 2 3
# 6 "../include/finc/finclib.h" 2
# 14 "../include/finc/finclib.h"
# 1 "../include/finc/fincparser.h" 1
# 13 "../include/finc/fincparser.h"
typedef struct _FinCParser FinCParser;
struct _FinCParser
{
    Object parent;
    FinCNode* tree_root;
    FinCTokenEnv* lex;

    String* parse_string;

    FinCLangEnv* lang_env;

    Stack* stack_call;
    Stack* stack_block;

    FinCNode* current_func;
    FinCNode* current_block;
    FinCNode* current_call;
    FinCNode* current_type;
    FinCNode* current_pkg;
    FinCNode* current_struct;
        FinCNode* current_class;
};

FinCParser* finc_parser_new();
void finc_parser_destroy(Object* self);
void finc_parser_set_env (FinCParser* self, FinCLangEnv* env);

void finc_parser_parser(FinCParser* self, String* stream);
void finc_parser_parser_string(FinCParser* self, String* str);


void finc_parser_parser_file(FinCParser* self, const char* filename);
# 15 "../include/finc/finclib.h" 2





typedef struct _FinC FinC;
struct _FinC
{
        Object parent;

        FinCLangEnv* env;
        FinCSys* sys_func;

        FinCContext* context;
};

typedef struct _FinCMethodItem FinCMethodItem;
typedef struct _FinCMethodItem* FinCMethodTable;
struct _FinCMethodItem
{
        const char* method_name;
        void* method_ptr;
};

typedef struct _FinCFieldItem FinCFieldItem;
typedef struct _FinCFieldItem* FinCFieldTable;
struct _FinCFieldItem
{
        const char* field_name;
        void* field_ptr;
        char size;
};

FinC* finc_init();
void finc_exit(FinC* self);

void finc_insert_var(FinC* self, unsigned char* type, unsigned char* name, ADT data);
void finc_remove_var(FinC* self, unsigned char* name);
ADT finc_get_var(FinC* self, unsigned char* name);

void finc_insert_func(FinC* self, unsigned char* p_name, void* p_func, unsigned char* p_rettype, ...);
void finc_insert_sys_api(FinC* self, unsigned char* p_name, void* p_func, unsigned char* p_rettype);
ADT finc_call_func(FinC* self, unsigned char* func);

void finc_proc_method_table(FinC* self, FinCMethodTable table, int size);


void finc_run_script(FinC* self, unsigned char* filename);


void finc_run_string(FinC* self, unsigned char* str);
# 6 "fincsys.c" 2





void finc_sys_global (FinCNode* p_node);
void finc_sys_local (FinCNode* p_node);



void finc_sys_addr_of (FinCNode* p_node);
void finc_sys_value_of (FinCNode* p_node);
void finc_sys_access (FinCNode* p_node);



void finc_sys_assign (FinCNode* p_node);
void finc_sys_cast (FinCNode* p_node);



void finc_sys_logic_or (FinCNode* p_node);
void finc_sys_logic_and (FinCNode* p_node);

void finc_sys_not ( FinCNode* p_node );

void finc_sys_or (FinCNode* p_node);
void finc_sys_and (FinCNode* p_node);
void finc_sys_xor (FinCNode* p_node);
void finc_sys_bitwise (FinCNode* p_node);
void finc_sys_shl (FinCNode* p_node);
void finc_sys_shr (FinCNode* p_node);



void finc_sys_add (FinCNode* p_node);
void finc_sys_sub (FinCNode* p_node);
void finc_sys_mul (FinCNode* p_node);
void finc_sys_div (FinCNode* p_node);
void finc_sys_mod (FinCNode* p_node);
void finc_sys_inc (FinCNode* p_node);
void finc_sys_dec (FinCNode* p_node);

void finc_sys_preinc (FinCNode* p_node);
void finc_sys_predec (FinCNode* p_node);



void finc_sys_block (FinCNode* p_node);
void finc_sys_if (FinCNode* p_node);
void finc_sys_for (FinCNode* p_node);
void finc_sys_while (FinCNode* p_node);
void finc_sys_return (FinCNode* p_node);
void finc_sys_break (FinCNode* p_node);
void finc_sys_continue (FinCNode* p_node);



void finc_sys_cmp_l (FinCNode* p_node);
void finc_sys_cmp_g (FinCNode* p_node);
void finc_sys_cmp_le (FinCNode* p_node);
void finc_sys_cmp_ge (FinCNode* p_node);
void finc_sys_cmp_ne (FinCNode* p_node);
void finc_sys_cmp_e (FinCNode* p_node);



void finc_sys_import (FinCNode* p_node);
void finc_sys_array (FinCNode* p_node);
void finc_sys_condition (FinCNode* p_node);
void finc_sys_comma (FinCNode* p_node);

void finc_sys_negative( FinCNode* p_node );

FinCSys* finc_sys_new()
{
        FinCSys* self;

        self = (FinCSys*)mem_new(sizeof(FinCSys));

        self->env = ((void *)0);

        object_init_object((Object*)self, finc_sys_destroy);

        return self;
}

void finc_sys_destroy(Object* self)
{
        object_unref ((Object*) ((FinCSys*)self)->env);

        mem_destroy(self);
}

void finc_sys_init (FinCSys* self)
{


        finc_context_add_func_sys ( g_finc_context, "global", finc_sys_global );
        finc_context_add_func_sys ( g_finc_context, "local", finc_sys_local );

        finc_context_add_func_sys ( g_finc_context, "cast", finc_sys_cast );
        finc_context_add_func_sys ( g_finc_context, "addr_of", finc_sys_addr_of );
        finc_context_add_func_sys ( g_finc_context, "value_of", finc_sys_value_of );

        finc_context_add_func_sys ( g_finc_context, ".", finc_sys_access );

        finc_context_add_func_sys ( g_finc_context, "||", finc_sys_logic_or );
        finc_context_add_func_sys ( g_finc_context, "&&", finc_sys_logic_and );

        finc_context_add_func_sys ( g_finc_context, "!", finc_sys_not );

        finc_context_add_func_sys ( g_finc_context, "|", finc_sys_or );
        finc_context_add_func_sys ( g_finc_context, "&", finc_sys_and );
        finc_context_add_func_sys ( g_finc_context, "^", finc_sys_xor );
        finc_context_add_func_sys ( g_finc_context, "~", finc_sys_bitwise );

        finc_context_add_func_sys ( g_finc_context, "<<", finc_sys_shl );
        finc_context_add_func_sys ( g_finc_context, ">>", finc_sys_shr );

        finc_context_add_func_sys ( g_finc_context, ",", finc_sys_comma );
        finc_context_add_func_sys ( g_finc_context, "?", finc_sys_condition );

        finc_context_add_func_sys ( g_finc_context, "+", finc_sys_add );
        finc_context_add_func_sys ( g_finc_context, "-", finc_sys_sub );
        finc_context_add_func_sys ( g_finc_context, "*", finc_sys_mul );
        finc_context_add_func_sys ( g_finc_context, "/", finc_sys_div );
        finc_context_add_func_sys ( g_finc_context, "%", finc_sys_mod );

        finc_context_add_func_sys ( g_finc_context, "negative", finc_sys_negative );

        finc_context_add_func_sys ( g_finc_context, "++", finc_sys_inc );
        finc_context_add_func_sys ( g_finc_context, "--", finc_sys_dec );

        finc_context_add_func_sys ( g_finc_context, "preinc", finc_sys_preinc );
        finc_context_add_func_sys ( g_finc_context, "predec", finc_sys_predec );

        finc_context_add_func_sys ( g_finc_context, "[]", finc_sys_array );

        finc_context_add_func_sys ( g_finc_context, "if", finc_sys_if );
        finc_context_add_func_sys ( g_finc_context, "for", finc_sys_for );
        finc_context_add_func_sys ( g_finc_context, "while", finc_sys_while );
        finc_context_add_func_sys ( g_finc_context, "return", finc_sys_return );
        finc_context_add_func_sys ( g_finc_context, "continue", finc_sys_continue );
        finc_context_add_func_sys ( g_finc_context, "break", finc_sys_break );

        finc_context_add_func_sys ( g_finc_context, "<", finc_sys_cmp_l );
        finc_context_add_func_sys ( g_finc_context, ">", finc_sys_cmp_g );
        finc_context_add_func_sys ( g_finc_context, "<=", finc_sys_cmp_le );
        finc_context_add_func_sys ( g_finc_context, ">=", finc_sys_cmp_ge );
        finc_context_add_func_sys ( g_finc_context, "!=", finc_sys_cmp_ne );
        finc_context_add_func_sys ( g_finc_context, "==", finc_sys_cmp_e );

        finc_context_add_func_sys ( g_finc_context, "=", finc_sys_assign );

        finc_context_add_func_sys ( g_finc_context, "++", finc_sys_inc );
        finc_context_add_func_sys ( g_finc_context, "--", finc_sys_dec );

        finc_context_add_func_sys ( g_finc_context, "@", finc_sys_block );
}

void finc_sys_global ( FinCNode* p_node )
{
        FinCNode* l_node;
        FinCNode* node_var;
        FinCType* l_type;
        String* l_name;
        FinCData* l_data;
        FinCVar* l_var;
        FinCNode* l_init_node;
        int l_size, i;

        l_node = (FinCNode*) vector_at ( p_node->vector_node, 0 ) ;
        l_type = l_node->type;

        l_size = ((l_node)->vector_node)->size;

        for ( i=0; i<l_size; i++)
        {
                node_var = (FinCNode*) vector_at ( l_node->vector_node, i );
                l_name = node_var->identifier;

                l_data = finc_data_new ( l_type, ((void *)0) );
                if ( (node_var->vector_node)->size!=0 )
                {
                        l_init_node = (FinCNode*) vector_at( node_var->vector_node, 0);
                        finc_node_evaluate (l_init_node);
                        finc_data_assign (l_data, l_init_node->data);
                        object_unref ((Object*) l_init_node);
                }
                object_unref ((Object*) node_var);

                l_var = finc_var_new ( l_name, l_data );

                finc_context_add_var ( g_finc_context, l_var, 1 );

                object_unref ((Object*) l_data);
                object_unref ((Object*) l_var);
        }
        object_unref ((Object*) l_node);
}

void finc_sys_local ( FinCNode* p_node )
{
        FinCNode* l_node;
        FinCNode* node_var;
        FinCType* l_type;
        String* l_name;
        FinCData* l_data;
        FinCVar* l_var;
        FinCNode* l_init_node;
        int l_size, i;

        l_node = (FinCNode*) vector_at ( p_node->vector_node, 0 ) ;
        l_type = l_node->type;

        l_size = ((l_node)->vector_node)->size;

        for ( i=0; i<l_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?