瀏覽代碼

实现继承gobject

SongZihuan 5 年之前
父節點
當前提交
30e3b631c0
共有 4 個文件被更改,包括 105 次插入134 次删除
  1. 二進制
      gwarf
  2. 7 4
      gwarf.c
  3. 8 4
      gwarf_interpreter/interprete.h
  4. 90 126
      gwarf_interpreter/interpreter.c

二進制
gwarf


+ 7 - 4
gwarf.c

@@ -9,10 +9,13 @@ int main(){
     GWARF_result father;
 
     login_official(the_var, official_func);  // 注册官方函数
-    int_login_official(the_var, int_official_func);  // 注册int
-    double_login_official(the_var, double_official_func);  // 注册double
-    str_login_official(the_var, str_official_func);  // 注册str
-    bool_login_official(the_var, bool_official_func);  // 注册bool
+
+    class_object *tmp_gobject = gobject_login_official(the_var, gobject_official_func, NULL);  // 注册goobject
+
+    int_login_official(the_var, int_official_func, tmp_gobject->the_var);  // 注册int
+    double_login_official(the_var, double_official_func, tmp_gobject->the_var);  // 注册double
+    str_login_official(the_var, str_official_func, tmp_gobject->the_var);  // 注册str
+    bool_login_official(the_var, bool_official_func, tmp_gobject->the_var);  // 注册bool
 
     parser("/home/songzihuan/test.gwf");
     printf("----start run----\n");

+ 8 - 4
gwarf_interpreter/interprete.h

@@ -371,18 +371,22 @@ void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *
 // 内置函数
 GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *);
 
+// gobject内置类
+class_object *gobject_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list);
+GWARF_result gobject_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var);
+
 // int内置类
-void int_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
+class_object *int_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list);
 GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *);
 
 // double内置类
-void double_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
+class_object *double_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list);
 GWARF_result double_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *);
 
 // str内置类
-void str_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
+class_object *str_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list);
 GWARF_result str_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var);
 
 // bool内置类
-void bool_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *));
+class_object *bool_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list);
 GWARF_result bool_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var);

+ 90 - 126
gwarf_interpreter/interpreter.c

@@ -2232,14 +2232,17 @@ GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var,
     return_result: return return_value;
 }
 
-// TODO:: __add__等方法对于输入参数需要辨别是否为NUMBER_value而非CLASS_value[更佳的做法是调用__add__时使用to_object]
-void int_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
+class_object *gobject_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list){  // 内置对象继承的类
     // 创建对象[空对象]
     puts("----set class----");
     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
+    if(father_var_list != NULL){
+        append_by_var_list(class_tmp->the_var, father_var_list);  // 一切类都需要继承object类[包括set class如果tmp_s == NULL则需要继承object]
+    }
+
     class_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
@@ -2255,9 +2258,10 @@ void int_login_official(var_list *the_var, GWARF_result (*paser)(func *, paramet
     for(int i = 0;i < lenth;i+=1){
         login_official_func(a[i][0], a[i][1], class_tmp->the_var, name[i], paser);
     }
+    return class_tmp;
 }
 
-GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境
+GWARF_result gobject_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境
     GWARF_result return_value;
     var_list *login_var;
     return_value.u = return_def;
@@ -2275,13 +2279,14 @@ GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_v
     {
         case __init__func:{  // printf something
             GWARF_result tmp;
-            tmp.value = to_int(traverse(tmp_s->u.value, out_var, false).value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
+            tmp.value.type = INT_value;
+            tmp.value.value.int_value = 0;
             assigment_func("value", tmp, login_var, 0);  // 注册到self
             return_value.u = statement_end;  // __init__没有return
             break;
         }
         case __value__func:{  // 若想实现运算必须要有这个方法
-            var *tmp = find_var(login_var, 0, "value");
+            var *tmp = find_var(login_var, 0, "value");  // gobject类的value存储在self.value中
             return_value.value = tmp->value;  // 取得用于计算的数值
             break;
         }
@@ -2331,6 +2336,64 @@ GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_v
     return_result: return return_value;
 }
 
+class_object *int_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list){
+    // 创建对象[空对象]
+    puts("----set class----");
+    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
+    if(father_var_list != NULL){
+        append_by_var_list(class_tmp->the_var, father_var_list);  // int、double、str等内置类需要继承gobject类
+    }
+
+    class_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
+    class_value.value.type = CLASS_value;
+    class_value.value.value.class_value = class_tmp;
+
+    assigment_func("int", class_value, the_var, 0);  // 注册class 的 位置
+    puts("----stop set class----");
+
+    // 注册函数
+    int a[][2] = {{2,1}};
+    char *name[] = {"__init__"};
+
+    int lenth = sizeof(a)/sizeof(a[0]);
+    for(int i = 0;i < lenth;i+=1){
+        login_official_func(a[i][0], a[i][1], class_tmp->the_var, name[i], paser);
+    }
+    return class_tmp;
+}
+
+GWARF_result int_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境
+    GWARF_result return_value;
+    var_list *login_var;
+    return_value.u = return_def;
+    return_value.return_times = 0;
+    if(father.father->type == CLASS_value){  // is class so that can use "."
+        login_var = father.father->value.class_value->the_var;
+    }
+    else if(father.father->type == OBJECT_value){
+        login_var = father.father->value.object_value->the_var;
+    }
+    else{
+        printf("NO login, father type = %d\n", father.father->type);
+    }
+    switch (the_func->official_func)
+    {
+        case __init__func:{  // printf something
+            GWARF_result tmp;
+            tmp.value = to_int(traverse(tmp_s->u.value, out_var, false).value, out_var);  // 只有一个参数[要针对不同数据类型对此处作出处理]
+            assigment_func("value", tmp, login_var, 0);  // 注册到self
+            return_value.u = statement_end;  // __init__没有return
+            break;
+        }
+        default:
+            break;
+    }
+    return_result: return return_value;
+}
+
 // to int[底层实现]
 GWARF_value to_int(GWARF_value value, var_list *the_var){
     if((value.type == INT_value)){
@@ -2361,13 +2424,17 @@ GWARF_value to_int(GWARF_value value, var_list *the_var){
 }
 
 
-void double_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
+class_object *double_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list){
     // 创建对象[空对象]
     puts("----set class----");
     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
+    if(father_var_list != NULL){
+        append_by_var_list(class_tmp->the_var, father_var_list);  // 一切类都需要继承object类[包括set class如果tmp_s == NULL则需要继承object]
+    }
+
     class_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
@@ -2376,13 +2443,14 @@ void double_login_official(var_list *the_var, GWARF_result (*paser)(func *, para
     puts("----stop set class----");
 
     // 注册函数
-    int a[][2] = {{2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}};
-    char *name[] = {"__init__", "__value__", "__add__", "__sub__", "__mul__","__div__"};
+    int a[][2] = {{2,1}};
+    char *name[] = {"__init__"};
 
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
         login_official_func(a[i][0], a[i][1], class_tmp->the_var, name[i], paser);
     }
+    return class_tmp;
 }
 
 GWARF_result double_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境
@@ -2408,44 +2476,6 @@ GWARF_result double_official_func(func *the_func, parameter *tmp_s, var_list *th
             return_value.u = statement_end;  // __init__没有return
             break;
         }
-        case __value__func:{  // 若想实现运算必须要有这个方法
-            var *tmp = find_var(login_var, 0, "value");
-            return_value.value = tmp->value;  // 取得用于计算的数值
-            break;
-        }
-        case __add__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            // printf("add_func:: out_var = %x\n", out_var);
-            return_value = add_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __sub__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = sub_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __mul__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = mul_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __div__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = div_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
         default:
             break;
     }
@@ -2481,13 +2511,16 @@ GWARF_value to_double(GWARF_value value, var_list *the_var){
     return return_number;
 }
 
-void str_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
+class_object *str_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list){
     // 创建对象[空对象]
     puts("----set class----");
     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
+    if(father_var_list != NULL){
+        append_by_var_list(class_tmp->the_var, father_var_list);  // 一切类都需要继承object类[包括set class如果tmp_s == NULL则需要继承object]
+    }
     class_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
@@ -2496,13 +2529,14 @@ void str_login_official(var_list *the_var, GWARF_result (*paser)(func *, paramet
     puts("----stop set class----");
 
     // 注册函数
-    int a[][2] = {{2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}};
-    char *name[] = {"__init__", "__value__", "__add__", "__sub__", "__mul__","__div__"};
+    int a[][2] = {{2,1}};
+    char *name[] = {"__init__"};
 
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
         login_official_func(a[i][0], a[i][1], class_tmp->the_var, name[i], paser);
     }
+    return class_tmp;
 }
 
 GWARF_result str_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境
@@ -2528,43 +2562,6 @@ GWARF_result str_official_func(func *the_func, parameter *tmp_s, var_list *the_v
             return_value.u = statement_end;  // __init__没有return
             break;
         }
-        case __value__func:{  // 若想实现运算必须要有这个方法
-            var *tmp = find_var(login_var, 0, "value");
-            return_value.value = tmp->value;  // 取得用于计算的数值
-            break;
-        }
-        case __add__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = add_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __sub__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = sub_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __mul__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = mul_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __div__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = div_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
         default:
             break;
     }
@@ -2622,13 +2619,16 @@ GWARF_value to_str(GWARF_value value, var_list *the_var){
     return return_number;
 }
 
-void bool_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
+class_object *bool_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *), var_list *father_var_list){
     // 创建对象[空对象]
     puts("----set class----");
     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
+    if(father_var_list != NULL){
+        append_by_var_list(class_tmp->the_var, father_var_list);  // 一切类都需要继承object类[包括set class如果tmp_s == NULL则需要继承object]
+    }
     class_tmp->out_var = append_by_var_list(class_tmp->the_var, copy_var_list(the_var));  // make class var list with out var
     class_value.value.type = CLASS_value;
     class_value.value.value.class_value = class_tmp;
@@ -2637,13 +2637,14 @@ void bool_login_official(var_list *the_var, GWARF_result (*paser)(func *, parame
     puts("----stop set class----");
 
     // 注册函数
-    int a[][2] = {{2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}};
-    char *name[] = {"__init__", "__value__", "__add__", "__sub__", "__mul__","__div__"};
+    int a[][2] = {{2,1}};
+    char *name[] = {"__init__"};
 
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
         login_official_func(a[i][0], a[i][1], class_tmp->the_var, name[i], paser);
     }
+    return class_tmp;
 }
 
 GWARF_result bool_official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){  // out_var是外部环境, the_var是self内部环境
@@ -2669,43 +2670,6 @@ GWARF_result bool_official_func(func *the_func, parameter *tmp_s, var_list *the_
             return_value.u = statement_end;  // __init__没有return
             break;
         }
-        case __value__func:{  // 若想实现运算必须要有这个方法
-            var *tmp = find_var(login_var, 0, "value");
-            return_value.value = tmp->value;  // 取得用于计算的数值
-            break;
-        }
-        case __add__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = add_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __sub__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = sub_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __mul__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = mul_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
-        case __div__func:{
-            GWARF_result reight_tmp, left_tmp;
-            GWARF_value base_the_var = traverse(tmp_s->u.value, out_var, false).value;  // 只有一个参数
-            reight_tmp = get__value__(&base_the_var, the_var);
-            left_tmp.value = find_var(login_var, 0, "value")->value;
-            return_value = div_func(left_tmp, reight_tmp, out_var);
-            break;
-        }
         default:
             break;
     }