1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 typedef struct _array_description 5 { 6 int array_size;//代表当前层的最高索引,即上界 7 struct _array_description* next;//代表下一级 8 }array_description,*parray_description; 9 //注意我们把最低层的放在最前面,这样有利于下标的处理 10 11 typedef struct _basic_type_pattern 12 { 13 char* faction_name;//代表类型名字 14 int pointer_layer;//代表指针的级数,我们限制为8级,即只占一个字节,其他三个字节以后再使用,先留着 15 parray_description array_layer;//这里是数组描述,以链表串起多级数组 16 char* pattern_name;//代表分量的类型 17 }basic_type_pattern,*pbasic_type_pattern; 18 typedef struct _composition_list//这个是复合结构的产生式,包括联合、结构、函数 19 { 20 pbasic_type_pattern current;//当前的分量 21 struct _composition_list* next;//下一个分量的指针 22 }composition_list,*pcomposition_list; 23 typedef struct _type_description 24 { 25 pcomposition_list current_gen_list;//代表当前的产生式的体,也是函数参数的列表 26 int type_type;//1为函数,2为结构,3为联合,4为基础类型 27 char* name;//当前类型的名字 28 void* function_zone;//这个代表了函数相关的域,其中有三个域,类型链表,变量链表,动作链表 29 //这三个域都是需要后面定义的类型,所以我们目前把他作为一个void类型的指针来处理 30 int return_pointer ;//代表返回值的指针层数 31 char* return_name;//代表返回值的类型 32 }type_description,*ptype_description;//类型声明的体 33 typedef struct _type_avl_tree 34 { 35 struct _type_description* current_type_body;//产生体链表的头节点 36 //因为有交叉引用。。。 37 int tree_depth;//当前树的高度,这个域是用来计算平衡因子的 38 struct _type_avl_tree* left;//左子树 39 struct _type_avl_tree* right;//右子树 40 }type_avl_tree,*ptype_avl_tree;//这里是整个的类型avl树 41 42 ptype_avl_tree type_tree_head=NULL;//先初始化为空 43 ptype_avl_tree tree_node_stack[100];//这个栈是为了插入和删除用的,以及用来平衡树高 44 //前面的结构都是对应于类型符号表的,采取的是avl 45 //下面开始介绍变量符号表,采取的是hash 46 //对于变量符号表,我们首先需要考虑一个变量所包括的域,其实这些域在定义类型符号表的时候都使用过了 47 //即basic_type_pattern这个结构体,已经有我们所需要的所有的东西,对于hash值一样的变量,我们通过一个链表串接起来 48 //而这个链表结构我们现在都有了 49 //现在我们唯一需要的就是hash表的空间以及hash的方法,这里我们分配400个表项,因为397刚好是质数 50 //hash函数我们直接采用累加法,最简单的 51 typedef struct _var_hash_node 52 { 53 char* var_name; 54 int pointer_layer;//代表指针的级数,我们限制为8级,即只占一个字节,其他三个字节以后再使用,先留着 55 parray_description array_layer;//这里是数组描述,以链表串起多级数组 56 struct _type_description* var_type;//代表变量的类型 57 }var_hash_node,*pvar_hash_node; 58 typedef struct _var_hash_chain 59 { 60 pvar_hash_node current_var; 61 struct _var_hash_node next_var; 62 }var_hash_chain,*pvar_hash_chain; 63 pvar_hash_chain var_hash_table[400];//注意我们要在后面把这个全都初始化为空 64 void generation_free(void* generation_body)//释放生成体链表所占的空间 65 { 66 pcomposition_list temp_com_list_before,temp_com_list_after; 67 pbasic_type_pattern temp_basic_pattern; 68 parray_description temp_array_layer_before,temp_array_layer_after; 69 temp_com_list_before=(pcomposition_list)generation_list;//转换一下指针 70 while(temp_com_list_before!=NULL) 71 { 72 temp_com_list_after=temp_com_list_before->next; 73 temp_basic_pattern=temp_com_list_before->current; 74 free(temp_basic_pattern->faction_name); 75 temp_array_layer_before=temp_basic_pattern->array_layer; 76 while(temp_array_layer_before!=NULL) 77 { 78 temp_array_layer_after=temp_array_layer_before->next; 79 free(temp_array_layer_before); 80 temp_array_layer_before=temp_array_layer_after; 81 }//释放所有的数组空间 82 free(temp_com_list_before); 83 temp_com_list_before=temp_com_list_after; 84 }//释放所有的分量 85 }//现在所有的都释放完成了 86 87 88 89 void insert_var_hash(pvar_hash_node new_var)//在hash表中插入一个表项 90 { 91 int string_hash; 92 int for_i; 93 char* current_name; 94 pvar_hash_chain temp_link;//用来串接链表 95 current_name=new_var->var_name; 96 for_i=0; 97 string_hash=0; 98 while(current_name[for_i]!='