فهرست منبع

实现isinherited

SongZihuan 5 سال پیش
والد
کامیت
f4da830678
6فایلهای تغییر یافته به همراه61 افزوده شده و 4 حذف شده
  1. 1 0
      README.md
  2. 8 0
      demo/9.gwf
  3. 41 2
      inter/cfunc.c
  4. 1 0
      inter/interpreter.h
  5. 2 2
      inter/tree.c
  6. 8 0
      log/README.md

+ 1 - 0
README.md

@@ -101,5 +101,6 @@ return x n  函数返回值x,返回n层
 * yield生成器和列表推导试
 * 模块化导入,读取``__init__.gwf``文件
 * 优化错误输出[行号]
+* 规范内置函数的类型,使用枚举体而不是数组
 ## 关于GWARF
 最后更新时间 : 2020年05月09日 广州

+ 8 - 0
demo/9.gwf

@@ -0,0 +1,8 @@
+class a()
+{
+b = 10
+}
+class c(a){
+d = 20
+}
+print(isinherited(c,a))

+ 41 - 2
inter/cfunc.c

@@ -182,8 +182,8 @@ void login_official_func(int type, int is_class, var_list *the_var, char *name,
 }
 
 void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *,inter *), inter *global_inter){
-    int a[][2] = {{printf_func,0}, {input_func,0}};
-    char *name[] = {"print", "input"};
+    int a[][2] = {{printf_func,0}, {input_func,0}, {isinherited_func,0}};
+    char *name[] = {"print", "input", "isinherited"};
 
     int lenth = sizeof(a)/sizeof(a[0]);
     for(int i = 0;i < lenth;i+=1){
@@ -246,6 +246,45 @@ GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var,
         return_value = to_object(return_value, global_inter);
         break;
     }
+    case isinherited_func:{
+        if(tmp_s == NULL || tmp_s->next == NULL){
+            return to_error("Too Little Args", "ArgsException", global_inter);
+        }
+        else if(tmp_s->next->next != NULL){
+            return to_error("Too Many Args", "ArgsException", global_inter);
+        }
+
+        GWARF_result child = traverse(tmp_s->u.value, out_var, false, global_inter), father = GWARF_result_reset;
+        error_space(child, return_result, return_value);
+
+        tmp_s = tmp_s->next;
+        father = traverse(tmp_s->u.value, out_var, false, global_inter);
+        error_space(father, return_result, return_value);
+
+        if(child.value.type != CLASS_value || father.value.type != CLASS_value){
+            return to_error("Args Should Be Class", "TypeException", global_inter);
+        }
+
+        hash_var *src = father.value.value.class_value->the_var->hash_var_base;
+        var_list *dust = child.value.value.class_value->the_var;
+        bool is = false;
+
+        while(true){  // 读取child的没一个the_var的哈希表,与father的对比
+            if(dust == NULL){
+                break;
+            }
+            if(dust->hash_var_base == src){
+                is = true;
+                break;
+            }
+            dust = dust->next;
+        }
+
+        return_value.value.type = BOOL_value;
+        return_value.value.value.bool_value = is;
+        return_value = to_object(return_value, global_inter);
+        break;
+    }
     default:
         break;
     }

+ 1 - 0
inter/interpreter.h

@@ -496,6 +496,7 @@ typedef enum{
 typedef enum{
     printf_func,
     input_func,
+    isinherited_func,
     __init__func,
     __value__func,
     __add__func,

+ 2 - 2
inter/tree.c

@@ -39,7 +39,7 @@ void print_statement(statement *the_statement, int lv){  // read the statement l
             fprintf(tree_info, "[operation](type = %d)\n", the_statement->code.operation.type);
 
             print_t("left\n", the_statement->code.operation.left_exp);
-            print_t("right\n", the_statement->code.operation.left_exp);
+            print_t("right\n", the_statement->code.operation.right_exp);
             break;
         case chose_exp:{
             fprintf(tree_info, "[chose_exp]\n");
@@ -331,10 +331,10 @@ void parameter_tree(parameter *the_parameter, int lv){
             break;
         }
         print_lv(lv);
-        fprintf(tree_info, "[parameter]\n");
         switch (tmp->type)
         {
         case only_value:
+            fprintf(tree_info, "[only_value](parameter)\n");
             print_t("value\n", tmp->u.value);
             break;
         case put_args:

+ 8 - 0
log/README.md

@@ -0,0 +1,8 @@
+# 关于LOG文件夹
+## GWARF的LOG
+GWARF在解释``.gwf``文件时,会生成日志并记录在``./log``文件夹下。
+* debug.log 是词法解析器输出的日志
+* status.log 是语法解析器输出的日志
+* token.log 是语法解释器输出的日志,是token流(或称为token FILO)的详细日志
+* tokenINFO.log 是token.log的简化日志
+* tree.log 输出语法树