finclang.c
来自「FinC编译器源代码」· C语言 代码 · 共 290 行
C
290 行
#include <finc/finclang.h>#include <finc/fincstruct.h>#include <finc/finccontext.h>#include <finc/fincparser.h>int g_lang_nberr=0;FinCLangEnv* g_finc_lang_env=NULL;FinCLangEnv* finc_lang_new(){ FinCLangEnv* self; self = (FinCLangEnv*)mem_new(sizeof(FinCLangEnv)); self->tree_root = NULL; self->nb_error = 0; self->list_pkg = list_new(); #ifdef USING_PACKAGE self->libfactory = lib_factory_new();#endif object_init_object((Object*)self, finc_lang_destroy); return self;}void finc_lang_destroy(Object* self){ unref( ((FinCLangEnv*)self)->tree_root ); unref( ((FinCLangEnv*)self)->list_pkg ); #ifdef USING_PACKAGE unref( ((FinCLangEnv*)self)->libfactory );#endif mem_destroy(self);}void finc_lang_error_line (FinCTokenEnv* lex, char* msg){ g_lang_nberr++; printf ("%d:%d: %s\n", lex->line, lex->position, msg);}Bool finc_lang_check_type (FinCLangEnv* self, String* p_type){ FinCStruct* type; Bool result; type = finc_context_get_struct ( g_finc_context, p_type); result = type? TRUE: FALSE; unref(type); return result;}#ifdef USING_PACKAGEvoid finc_lang_proc_pkg (FinCLangEnv* self, FinCNode* p_node){ String* package_name; String* param_name; FinCNode* node_pkg; FinCNode* node_func; FinCNode* node_func_name; FinCNode* node_type; FinCNode* param_type; FinCNode* param; ADT func_handle; Library* lib; FinCFunc* func; FinCField* field; FinCType* type; int i, j; node_pkg = (FinCNode*)vector_at(p_node->vector_node, 0); package_name = addref(String, node_pkg->identifier); lib = lib_factory_load_lib(self->libfactory, string_get_str(package_name)); for ( i=1; i<vector_get_size(p_node->vector_node); i++) { node_func = (FinCNode*)vector_at(p_node->vector_node, i); node_type = (FinCNode*)vector_at(node_func->vector_node, 0); node_func_name = (FinCNode*)vector_at(node_func->vector_node, 1); func_handle = library_symbol(lib, string_get_str(node_func_name->identifier)); func = finc_context_add_func_native (g_finc_context, string_get_str(node_func_name->identifier), func_handle); func->ret_type = finc_type_new_copy(node_type->type); for ( j=2; j<vector_get_size(node_func->vector_node); j+=2) { param_type = (FinCNode*)vector_at(node_func->vector_node, j); param = (FinCNode*)vector_at(node_func->vector_node, j+1); type = finc_type_new_copy(param_type->type); param_name = string_new_str(string_get_str(param->identifier)); field = finc_field_new(param_name, type); finc_func_add_param(func, field); unref(param_type); unref(param); unref(type); unref(param_name); unref(field); } unref(node_func); unref(node_func_name); unref(node_type); } unref(package_name); unref(node_pkg); unref(lib);}#endif#ifdef USING_FILEvoid finc_lang_proc_import(FinCLangEnv* self, FinCNode* p_node){ FinCNode* l_node; FinCData* l_data; String* l_text; String* temp; FinCParser* parser; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); l_data = l_node->data; unref ( l_node ); if ( l_data->type->type & FinCType_String ) { l_text = finc_data_get_string ( l_data ); temp = list_find(self->list_pkg, string_equal, (ADT)l_text); if (temp)/*already import this pacakge.*/ { unref(l_text); unref(temp); unref(l_data); return; } else { list_append(self->list_pkg, (ADT)l_text); } parser = finc_parser_new(); finc_parser_set_env(parser, g_finc_lang_env); finc_parser_parser_file(parser, string_get_str(l_text)); l_node = addref(FinCNode, parser->tree_root); if ( l_node ) { finc_node_evaluate ( l_node ); unref ( l_node ); } unref ( l_text ); unref ( parser ); } unref(l_data);}#endifvoid finc_lang_proc_struct(FinCLangEnv* self, FinCNode* p_node){ FinCStruct* l_struct; FinCNode* l_name; FinCNode* l_node_field; FinCNode* l_node_type; FinCField* l_field; FinCType* l_type; int i, j; l_name = (FinCNode*) vector_at(p_node->vector_node, 0); l_struct = finc_struct_new(l_name->identifier); for (i=1; i<finc_node_get_size(p_node); i++) { l_node_type = vector_at(p_node->vector_node, i); l_type = finc_type_new_copy (l_node_type->type); for (j=0; j<finc_node_get_size(l_node_type); j++) { l_node_field = vector_at (l_node_type->vector_node, j); l_field = finc_field_new(l_node_field->identifier, l_type); finc_struct_add_field(l_struct, l_field); unref(l_node_field); unref(l_field); } unref(l_type); unref(l_node_type); } finc_context_add_struct(g_finc_context, l_struct); unref(l_name); unref(l_struct);}void finc_lang_proc_func (FinCLangEnv* self, FinCNode* p_node ){ FinCFunc * l_func; FinCNode* l_node; String* l_function_name; FinCType* l_param_type; String* l_param_name; FinCField* l_field; FinCNode* l_code; unsigned int l_size; unsigned int i; l_size = finc_node_get_size ( p_node ); l_node = finc_node_get ( p_node, 0 ); if ( finc_node_check ( l_node, FinCNodeType_Type ) )unref ( l_node ); else { printf("Runtime Error:function return type error.\n" ); finc_context_error_inc( g_finc_context ); unref ( l_node ); return ; } l_node = finc_node_get ( p_node, 1 ); if ( finc_node_check ( l_node, FinCNodeType_Identifier ) ) { l_function_name = addref ( String, l_node->identifier ); unref ( l_node ); } else { printf("Runtime Error:function name error.\n"); finc_context_error_inc( g_finc_context ); unref ( l_node ); return ; } l_code = finc_node_get ( p_node, l_size - 1 ); l_func = finc_context_add_func_node ( g_finc_context, string_get_str ( l_function_name ), l_code ); unref ( l_function_name ); unref ( l_code ); for ( i = 0; i < ( ( l_size - 3 ) / 2 ); i++ ) { l_node = finc_node_get ( p_node, 2 + ( i * 2 ) ); if ( finc_node_check ( l_node, FinCNodeType_Type ) ) { l_param_type = addref ( FinCType, l_node->type ); unref ( l_node ); } else { printf("func error"); unref ( l_node ); return ; } l_node = finc_node_get ( p_node, 2 + ( i * 2 ) + 1 ); if ( finc_node_check ( l_node, FinCNodeType_Identifier ) ) { l_param_name = addref ( String, l_node->identifier ); unref ( l_node ); } else { printf("func error" ); unref ( l_node ); return ; } l_field = finc_field_new ( l_param_name, l_param_type ); finc_func_add_param ( l_func, l_field ); unref ( l_param_type ); unref ( l_param_name ); unref ( l_field ); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?