⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 finclang.c

📁 FinC is Fava in C! A C-like syntax language. It s designed to apply to embededd system.
💻 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 + -