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 + -
显示快捷键?