Browse Source

变量使用HashTable

SongZihuan 5 years ago
parent
commit
f385bd5b3e
5 changed files with 97 additions and 31 deletions
  1. BIN
      gwarf
  2. 4 4
      inter/cfunc.c
  3. 13 13
      inter/interpreter.c
  4. 16 5
      inter/interpreter.h
  5. 64 9
      inter/var.c

BIN
gwarf


+ 4 - 4
inter/cfunc.c

@@ -269,7 +269,7 @@ GWARF_result object_official_func(func *the_func, parameter *tmp_s, var_list *th
 class_object *make_object(var_list *the_var, var_list *father_var_list){
     class_object *class_tmp = malloc(sizeof(class_object));
 
-    class_tmp->the_var = make_var_base(make_var());  // make class var list
+    class_tmp->the_var = make_var_base(make_hash_var());  // make class var list
     if(father_var_list != NULL){
         append_by_var_list(class_tmp->the_var, father_var_list);  // int、double、str等内置类需要继承gobject类
     }
@@ -1213,7 +1213,7 @@ GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_v
             if(father.father->type == OBJECT_value){
                 the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
                 object_tmp->cls = father.father->value.object_value->cls;
-                object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);  // 生成实例
+                object_tmp->the_var = append_by_var_list(make_var_base(make_hash_var()), object_tmp->cls);  // 生成实例
 
                 // 执行__init__
                 GWARF_result self_value;
@@ -1330,7 +1330,7 @@ GWARF_result double_official_func(func *the_func, parameter *tmp_s, var_list *th
             if(father.father->type == OBJECT_value){
                 the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
                 object_tmp->cls = father.father->value.object_value->cls;
-                object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);  // 生成实例
+                object_tmp->the_var = append_by_var_list(make_var_base(make_hash_var()), object_tmp->cls);  // 生成实例
 
                 // 执行__init__
                 GWARF_result self_value;
@@ -1557,7 +1557,7 @@ GWARF_result bool_official_func(func *the_func, parameter *tmp_s, var_list *the_
             if(father.father->type == OBJECT_value){
                 the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
                 object_tmp->cls = father.father->value.object_value->cls;
-                object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);  // 生成实例
+                object_tmp->the_var = append_by_var_list(make_var_base(make_hash_var()), object_tmp->cls);  // 生成实例
 
                 // 执行__init__
                 GWARF_result self_value;

+ 13 - 13
inter/interpreter.c

@@ -389,7 +389,7 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
             GWARF_result class_value;
             class_object *class_tmp = malloc(sizeof(class_object));
 
-            class_tmp->the_var = make_var_base(make_var());  // make class var list
+            class_tmp->the_var = make_var_base(make_hash_var());  // make class var list
             class_value.value.type = CLASS_value;
             class_value.value.value.class_value = class_tmp;
 
@@ -771,7 +771,7 @@ GWARF_result include_func(statement *the_statement, var_list *the_var){
 
     global_inter = get_inter();  // 拿全局解释器[并声明全局变量]
     free(global_inter->global_var);  // 不需要新的the_var
-    global_inter->global_var = the_var->var_base;
+    global_inter->global_var = the_var->hash_var_base;
     statement_base = make_statement_base(global_inter->global_code);
     
     parser(file.value.string);
@@ -1001,7 +1001,7 @@ GWARF_result if_func(if_list *if_base, var_list *the_var){  // read the statemen
 // -----------------for func
 GWARF_result for_func(statement *the_statement, var_list *the_var){  // read the statement list with case to run by func
     GWARF_result value;
-    var *tmp = make_var();  // base_var
+    hash_var *tmp = make_hash_var();  // base_var
     the_var = append_var_list(tmp, the_var);
     bool condition;
     if(the_statement->code.for_cycle.first != NULL){
@@ -1190,7 +1190,7 @@ GWARF_result raise_func(statement *the_statement, var_list *the_var, bool not_cl
 GWARF_result try_func(statement *the_statement, var_list *the_var){  // read the statement list with case to run by func
     GWARF_result value;
 
-    var *tmp = make_var();  // base_var
+    hash_var *tmp = make_hash_var();  // base_var
     the_var = append_var_list(tmp, the_var);
 
     again: 
@@ -1317,7 +1317,7 @@ GWARF_result block_func(statement *the_statement, var_list *the_var){  // read t
 
 GWARF_result forin_func(statement *the_statement, var_list *the_var){  // read the statement list with case to run by func
     GWARF_result value;
-    var *tmp = make_var();  // base_var
+    hash_var *tmp = make_hash_var();  // base_var
     the_var = append_var_list(tmp, the_var);
     
     GWARF_result tmp_result = traverse(the_statement->code.for_in_cycle.iter, the_var, false);  // 取得迭代器
@@ -1407,7 +1407,7 @@ GWARF_result while_func(statement *the_statement, var_list *the_var){  // read t
     GWARF_result value;
     bool do_while = the_statement->code.while_cycle.first_do;  // 如果是do_while 则返回true
 
-    var *tmp = make_var();  // base_var
+    hash_var *tmp = make_hash_var();  // base_var
     the_var = append_var_list(tmp, the_var);
 
     bool condition;
@@ -1801,7 +1801,7 @@ GWARF_result login_var(var_list *the_var, var_list *old_var_list, parameter *tmp
     return_result.value.value.int_value = 0;
 
     int assignment_type = 0;  // 0-根据tmp_x进行赋值,1-根据tmp_s赋值
-    var_list *tmp_var = make_var_base(make_var());  // 为1-模式准备
+    var_list *tmp_var = make_var_base(make_hash_var());  // 为1-模式准备
 
     while(1){
         if ((tmp_x == NULL)&&(tmp_s == NULL)){  // the last
@@ -1944,7 +1944,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
         // tmp_x:形参,tmp_s:实参
 
         // printf("----address = %d----\n", the_var);
-        var *tmp = make_var();  // base_var
+        hash_var *tmp = make_hash_var();  // base_var
         the_var = append_var_list(tmp, the_var);
         // printf("----new address = %d----\n", the_var);
 
@@ -1994,7 +1994,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
     else if(get.value.type == CLASS_value){  // 生成实例
         the_object *object_tmp = malloc(sizeof(the_object));  // 生成object的空间
         object_tmp->cls = get.value.value.class_value->the_var;
-        object_tmp->the_var = append_by_var_list(make_var_base(make_var()), object_tmp->cls);
+        object_tmp->the_var = append_by_var_list(make_var_base(make_hash_var()), object_tmp->cls);
         GWARF_value tmp;
         tmp.type = OBJECT_value;
         tmp.value.object_value = object_tmp;
@@ -2007,7 +2007,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
             the_var = func_->the_var;
             // tmp_x:形参,tmp_s:实参
 
-            var *tmp = make_var();  // base_var
+            hash_var *tmp = make_hash_var();  // base_var
             the_var = append_var_list(tmp, the_var);
 
             if(func_->type == customize){  // 用户定义的方法
@@ -2073,7 +2073,7 @@ GWARF_result call_back_core(GWARF_result get, var_list *the_var, parameter *tmp_
             // tmp_x:形参,tmp_s:实参
 
             // // printf("----address = %d----\n", the_var);
-            var *tmp = make_var();  // base_var
+            hash_var *tmp = make_hash_var();  // base_var
             the_var = append_var_list(tmp, the_var);
             // // printf("----new address = %d----\n", the_var);
 
@@ -3480,7 +3480,7 @@ GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){  /
     }
     bool lock = false;
     if(new){  // need to make new var
-        var *tmp = make_var();  // base_var
+        hash_var *tmp = make_hash_var();  // base_var
         the_var = append_var_list(tmp, the_var);
     }
     while(1){
@@ -3542,7 +3542,7 @@ GWARF_result traverse_global(statement *the_statement, var_list *the_var){  // t
 inter *get_inter(){
     inter *tmp;
     tmp = malloc(sizeof(inter));  // get an address for base var
-    tmp->global_var = make_var();
+    tmp->global_var = make_hash_var();
     tmp->global_code = make_statement();
     return tmp;
 }

+ 16 - 5
inter/interpreter.h

@@ -1,5 +1,6 @@
 #ifndef _INTERPRETER_H
 #define _INTERPRETER_H
+#define MAX_SIZE (1024 ^ 2)
 
 #define malloc(size) safe_malloc(size)
 #define free(p) p=safe_free(p)
@@ -69,6 +70,11 @@ typedef struct var{
     struct var *next;  // for list
 } var;
 
+// ------------------------- hash_var
+typedef struct hash_var{
+    struct var **hash;  // 这是一个指针数组
+} hash_var;
+
 // ------------------------- statement
 
 typedef struct statement{
@@ -360,8 +366,8 @@ typedef struct default_var{
 // ------------------------- var base list [记录每一层变量base的链表]
 
 typedef struct var_list{
-    var *var_base;
-    default_var *default_list;
+    struct hash_var *hash_var_base;
+    struct default_var *default_list;
     struct var_list *next;
 } var_list;
 
@@ -384,7 +390,7 @@ typedef struct if_list{
 // ------------------------- inter
 
 typedef struct{
-    var *global_var;  // global var链表
+    hash_var *global_var;  // global var链表
     statement *global_code;  // global code链表
 } inter;
 
@@ -600,8 +606,8 @@ default_var *make_default_var_base();
 void append_default_var_base(char * ,int , default_var *);
 int get_default(char *, default_var *);
 var_list *make_var_list();
-var_list *make_var_base(var *);
-var_list *append_var_list(var *, var_list *);
+var_list *make_var_base(hash_var *);
+var_list *append_var_list(hash_var *, var_list *);
 var_list *append_by_var_list(var_list *, var_list *);
 var_list *free_var_list(var_list *);
 int get_var_list_len(var_list *);
@@ -609,6 +615,11 @@ var *find_var(var_list *,int , char *);
 void add_var(var_list *,int , char *, GWARF_value);
 var_list *copy_var_list(var_list *);
 
+hash_var *make_hash_var();
+unsigned int time33(char *);
+int login_node(char *, GWARF_value, hash_var *);
+var *find_node(char *, hash_var *);
+
 parameter *make_parameter_name(char *);
 parameter *append_parameter_name(char *, parameter *);
 

+ 64 - 9
inter/var.c

@@ -2,6 +2,8 @@
 
 #include "interpreter.h"
 
+// --------------var[存储在hash_var节点上]
+
 var *make_var(){  // make var with base
     var *tmp;
     tmp = malloc(sizeof(var));  // get an address for base var
@@ -11,8 +13,10 @@ var *make_var(){  // make var with base
 }
 
 void append_var(char *name, GWARF_value value, var *base_var){
+
     int break_ = 1;  // get var[2] or not[1]
     var *tmp = base_var;  // iter var
+
     while(1){
         if (!strcmp(tmp->name, name)){
             break_ = 2;
@@ -28,11 +32,13 @@ void append_var(char *name, GWARF_value value, var *base_var){
         tmp->value = value;
         return;
     }
+
     var *new_tmp = make_var();
     tmp->next = new_tmp;
     new_tmp->name = malloc(sizeof(name));
     strcpy(new_tmp->name, name);
     new_tmp->value = value;
+
 }
 
 void free_var(var *base_var){  // free the address
@@ -79,7 +85,55 @@ void del_var(char *name, var *base_var){  // free an address
     }
 }
 
-// --------------default_var
+// --------------hash_var[存储在var_list节点上]
+
+hash_var *make_hash_var(){  // 生成并初始化
+    hash_var *tmp = NULL;
+
+    tmp = malloc(sizeof(hash_var));
+    tmp->hash = malloc((size_t)(sizeof(var) * MAX_SIZE));
+    
+    for(int i = 0; i < MAX_SIZE; i++){
+        tmp->hash[i] = NULL;  // 初始化
+    }
+    return tmp;
+}
+
+unsigned int time33(char *key){
+    unsigned int hash = 5381;
+    while(*key){
+        hash += (hash << 5 ) + (*key++);
+    }
+    return (hash & 0x7FFFFFFF) % MAX_SIZE;
+}
+
+int login_node(char *name, GWARF_value value, hash_var *the_hash_var){
+    unsigned int index = time33(name);
+    var *base_node = the_hash_var->hash[index];  // 根据下标拿base节点
+
+    if(base_node == NULL){  // 生成基本节点
+        the_hash_var->hash[index] = make_var();
+        base_node = the_hash_var->hash[index];
+    }
+    append_var(name, value, base_node);
+    return 0;
+}
+
+var *find_node(char *name, hash_var *the_hash_var){
+    if(the_hash_var == NULL){
+        return NULL;
+    }
+
+    unsigned int index = time33(name);
+    var *base_node = the_hash_var->hash[index];  // 根据下标拿base节点
+
+    if(base_node == NULL){  // 没有节点
+        return NULL;
+    }
+    return get_var(name, base_node);
+}
+
+// --------------default_var[存储在var_list节点上]
 
 default_var *make_default_var(){  // make_default_var
     default_var *tmp;
@@ -129,25 +183,27 @@ int get_default(char *name, default_var *base_default_var){  // get the address
     }
 }
 
+//  --------------var_list[保存default_var和hash_var]
+
 var_list *make_var_list(){  // make a empty var_list node
     var_list *tmp;
     tmp = malloc(sizeof(var_list));  // get an address for base var
     tmp->next = NULL;
-    tmp->var_base = NULL;
+    tmp->hash_var_base = NULL;
     tmp->default_list = make_default_var_base();
     return tmp;
 }
 
-var_list *make_var_base(var *gloabl_var){  // make the base for global_var
+var_list *make_var_base(hash_var *global_hash_var){  // make the base for global_var
     var_list *tmp = make_var_list();
-    tmp->var_base = gloabl_var;
+    tmp->hash_var_base = global_hash_var;
     return tmp;
 }
 
 
-var_list *append_var_list(var *var_base, var_list *var_list_base){  // make var_list[FILO]
+var_list *append_var_list(hash_var *global_hash_var, var_list *var_list_base){  // make var_list[FILO]
     var_list *tmp = make_var_list();
-    tmp->var_base = var_base;
+    tmp->hash_var_base = global_hash_var;
     tmp->next = var_list_base;
     return tmp;
 }
@@ -199,7 +255,7 @@ var *find_var(var_list *var_base,int from, char *name){  // find var by func get
     // printf("name = %s, from = %d, address = %x\n", name, from, start->var_base);
     while (1)
     {
-        return_var = get_var(name, start->var_base);
+        return_var = find_node(name, start->hash_var_base);
         if((return_var == NULL) && (start->next == NULL)){  // don't get the var and not next
             return NULL;
         }
@@ -222,8 +278,7 @@ void add_var(var_list *var_base,int from, char *name, GWARF_value value){  // ad
         }
         start = start->next;
     }
-    // printf("----var add address = %d----\n", start);
-    append_var(name, value, start->var_base);
+    login_node(name, value, start->hash_var_base);
 }
 
 var_list *copy_var_list(var_list *var_list_base){  // 复制一条var链到另一个内存地址上[base不复制]