📄 finclang.c
字号:
#include <finclang.h>/*node root*/FinCNode* g_lang_node = NULL;unsigned char* g_lang_filename = NULL;unsigned int g_lang_line = 1;unsigned int g_lang_nberr;FinCNode* g_lang_call_stack[1000];unsigned int g_lang_call_num = 0;FinCNode* g_lang_block_stack[1000];unsigned int g_lang_block_num = 0;static FinCNode* g_lang_func = NULL;static FinCNode* g_lang_block = NULL;static FinCNode* g_lang_call = NULL;static FinCNode* g_lang_struct = NULL;static FinCNode* g_lang_type = NULL;static FinCNode* g_lang_pkg = NULL;FinCNode* finc_lang_load(String* p_filename){ g_lang_node = finc_node_new (); finc_node_set_block (g_lang_node); g_lang_nberr = 0; g_lang_line = 1; g_lang_filename = string_get_str (p_filename); if (!freopen (string_get_str (p_filename), "r", stdin)) { printf ("ERROR: Invalid filename\n"); exit (-1); } c_parse (); if (g_lang_nberr) { printf ("\n\t%d errors founded\n", g_lang_nberr); return NULL; } else return g_lang_node;}void finc_lang_error (char* msg){ g_lang_nberr++; fprintf (stderr, "%s:%d: %s\n", g_lang_filename, g_lang_line, msg);}void c_error (char *s){}int c_wrap (){ return 1;}void finc_lang_decl_add (FinCNode* p_node){ finc_node_add (g_lang_node, p_node); unref (p_node);}FinCNode* finc_lang_type_create (FinCTypeType p_type, FinCArrayType p_array, unsigned int p_size){ FinCNode* l_node; FinCType* l_type; l_type = finc_type_new (p_type, p_array, p_size); l_node = finc_node_new (); finc_node_set_type (l_node, l_type); unref (l_type); return l_node;}FinCNode* finc_lang_type_create_name (FinCNode* p_identifier, FinCArrayType p_array, unsigned int p_size){ FinCNode* l_node; FinCType* l_type; l_type = finc_type_new_name ( string_get_str (p_identifier->identifier), p_array, p_size); l_node = finc_node_new (); finc_node_set_type (l_node, l_type); unref (l_type); unref (p_identifier); return l_node;}FinCNode* finc_lang_data_string_create (unsigned char* p_text){ FinCNode* l_node; FinCData* l_data; l_data = finc_data_new_string (p_text); l_node = finc_node_new (); finc_node_set_constant (l_node); finc_node_set_data (l_node, l_data); unref (l_data); return l_node;}FinCNode* finc_lang_data_integer_create (unsigned int p_int){ FinCNode* l_node; FinCType* l_type; FinCData* l_data; l_type = finc_type_new (FinCType_Int, FinCArrayType_None, 0); l_data = finc_data_new (l_type, NULL); access (finc_data_get_raw_data (l_data), 0, unsigned int) = p_int; l_node = finc_node_new (); finc_node_set_constant (l_node); finc_node_set_data (l_node, l_data); unref (l_type); unref (l_data); return l_node;}FinCNode* finc_lang_data_float_create (float p_value){ FinCNode* l_node; FinCType* l_type; FinCData* l_data; l_type = finc_type_new (FinCType_Float, FinCArrayType_None, 0); l_data = finc_data_new (l_type, NULL); access (finc_data_get_raw_data (l_data), 0, float) = p_value; l_node = finc_node_new (); finc_node_set_constant (l_node); finc_node_set_data (l_node, l_data); unref (l_type); unref (l_data); return l_node;}FinCNode* finc_lang_data_bool_create (Bool p_bool){ FinCNode* l_node; FinCType* l_type; FinCData* l_data; l_type = finc_type_new (FinCType_Bool, FinCArrayType_None, 0); l_data = finc_data_new (l_type, NULL); access (finc_data_get_raw_data (l_data), 0, Bool) = p_bool; l_node = finc_node_new (); finc_node_set_constant (l_node); finc_node_set_data (l_node, l_data); unref (l_type); unref (l_data); return l_node;}FinCNode* finc_lang_data_pointer_create (void* p_ptr){ FinCNode* l_node; FinCType* l_type; FinCData* l_data; l_type = finc_type_new (FinCType_Pointer, FinCArrayType_None, 0); l_data = finc_data_new (l_type, NULL); access (finc_data_get_raw_data (l_data), 0, void*) = p_ptr; l_node = finc_node_new (); finc_node_set_constant (l_node); finc_node_set_data (l_node, l_data); unref (l_type); unref (l_data); return l_node;}void finc_lang_pkg_begin(unsigned char* p_package){ g_lang_pkg = finc_node_new_name(p_package);}FinCNode* finc_lang_pkg_func_add(){ FinCNode* l_func; finc_node_add ( g_lang_pkg, g_lang_func); l_func = g_lang_func; g_lang_func = NULL; return l_func;}FinCNode* finc_lang_pkg_end(){ FinCNode* l_pkg; l_pkg = g_lang_pkg; g_lang_pkg = NULL; return l_pkg;}FinCNode* finc_lang_var_create (FinCNode* p_type){ FinCNode* l_node; l_node = g_lang_type; finc_node_set_type (l_node, p_type->type); g_lang_type = NULL; unref(p_type); return l_node;}void finc_lang_var_list_add (FinCNode* p_identifier){ if (!g_lang_type) g_lang_type = finc_node_new();//if an empty type node! finc_node_add (g_lang_type, p_identifier); unref(p_identifier);}void finc_lang_var_list_add_init (FinCNode* p_identifier, FinCNode* p_assign){ if (!g_lang_type) g_lang_type = finc_node_new();//if an empty type node! finc_node_add (p_identifier, p_assign); unref(p_assign); finc_node_add (g_lang_type, p_identifier); unref(p_identifier);}FinCNode* finc_lang_array_create (FinCNode* p_type, FinCNode* p_identifier){ finc_node_add (p_type, p_identifier); unref(p_identifier); return p_type;}FinCNode* finc_lang_efunc_create (unsigned char* p_func){ FinCNode* l_node; l_node = finc_node_new_func (p_func); return l_node;}FinCNode* finc_lang_efunc_create1 (unsigned char* p_func, FinCNode* p_node1){ FinCNode* l_node; l_node = finc_node_new_func (p_func); finc_node_add (l_node, p_node1); unref (p_node1); return l_node;}FinCNode* finc_lang_efunc_create2 (unsigned char* p_func, FinCNode* p_node1, FinCNode* p_node2){ FinCNode* l_node; l_node = finc_node_new_func (p_func); finc_node_add (l_node, p_node1); unref (p_node1); finc_node_add (l_node, p_node2); unref (p_node2); return l_node;}FinCNode* finc_lang_efunc_create3 (unsigned char* p_func, FinCNode* p_node1, FinCNode* p_node2, FinCNode* p_node3){ FinCNode* l_node; l_node = finc_node_new_func (p_func); finc_node_add (l_node, p_node1); unref (p_node1); finc_node_add (l_node, p_node2); unref (p_node2); finc_node_add (l_node, p_node3); unref (p_node3); return l_node;}FinCNode* finc_lang_efunc_create4 (unsigned char* p_func, FinCNode* p_node1, FinCNode* p_node2, FinCNode* p_node3, FinCNode* p_node4){ FinCNode* l_node; l_node = finc_node_new_func (p_func); finc_node_add (l_node, p_node1); unref (p_node1); finc_node_add (l_node, p_node2); unref (p_node2); finc_node_add (l_node, p_node3); unref (p_node3); finc_node_add (l_node, p_node4); unref (p_node4); return l_node;}void finc_lang_struct_begin(FinCNode* p_identifier){ g_lang_struct = finc_node_new_func ("struct"); finc_node_add (g_lang_struct, p_identifier); unref (p_identifier);}/** add field to global struct node;*/void finc_lang_struct_field_create (FinCNode* p_type){ FinCNode* l_node; l_node = g_lang_type; finc_node_set_type (l_node, p_type->type); g_lang_type = NULL; unref(p_type); finc_node_add (g_lang_struct, l_node); unref(l_node);}/** add id to global type node;*/void finc_lang_struct_field_add(FinCNode* p_node){ if (!g_lang_type) g_lang_type = finc_node_new();//if an empty type node! finc_node_add (g_lang_type, p_node); unref(p_node);}FinCNode* finc_lang_struct_end(){ return g_lang_struct;}void finc_lang_func_create (FinCNode* p_type, FinCNode* p_identifier){ g_lang_func = finc_node_new_func ("func"); finc_node_add (g_lang_func, p_type); unref (p_type); finc_node_add (g_lang_func, p_identifier); unref (p_identifier);}void finc_lang_func_add_param (FinCNode* p_type, FinCNode* p_name){ finc_node_add (g_lang_func, p_type); unref (p_type); finc_node_add (g_lang_func, p_name); unref (p_name);}void finc_lang_func_opt_param (){ finc_node_add (g_lang_func, NULL);}FinCNode* finc_lang_func_finish (FinCNode* p_code){ FinCNode* l_func; finc_node_add (g_lang_func, p_code); unref (p_code); l_func = g_lang_func; g_lang_func = NULL; return l_func;}void finc_lang_block_begin (){ if (g_lang_block) { g_lang_block_stack[g_lang_block_num] = g_lang_block; g_lang_block_num++; } g_lang_block = finc_node_new_func ("@");}void finc_lang_block_add (FinCNode* p_node){ finc_node_add (g_lang_block, p_node); unref (p_node);}FinCNode* finc_lang_block_end (){ FinCNode* l_block; if (g_lang_block_num > 0) { l_block = g_lang_block; g_lang_block_num--; g_lang_block = g_lang_block_stack[g_lang_block_num]; } else { l_block = g_lang_block; g_lang_block = NULL; } return l_block;}void finc_lang_call_begin (unsigned char* p_identifier){ if (g_lang_call) { g_lang_call_stack[g_lang_call_num] = g_lang_call; g_lang_call_num++; } g_lang_call = finc_node_new_func (p_identifier);}void finc_lang_call_add (FinCNode* p_node){ finc_node_add (g_lang_call, p_node); unref (p_node);}FinCNode* finc_lang_call_end (){ FinCNode* l_call; if (g_lang_call_num > 0) { l_call = g_lang_call; g_lang_call_num--; g_lang_call = g_lang_call_stack[g_lang_call_num]; } else { l_call = g_lang_call; g_lang_call = NULL; } return l_call;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -