|
@@ -3,9 +3,22 @@
|
|
#include "../paser/y.tab.c"
|
|
#include "../paser/y.tab.c"
|
|
#include <math.h>
|
|
#include <math.h>
|
|
|
|
|
|
|
|
+// #include "interpreter.h"
|
|
|
|
+#include "branch.c"
|
|
|
|
+#include "cfunc.c"
|
|
|
|
+#include "parameter.c"
|
|
|
|
+#include "statement.c"
|
|
|
|
+#include "var.c"
|
|
|
|
+
|
|
// running code
|
|
// running code
|
|
-GWARF_result while_func(statement *, var_list *);
|
|
|
|
GWARF_result operation_func(statement *, var_list *, var_list *);
|
|
GWARF_result operation_func(statement *, var_list *, var_list *);
|
|
|
|
+GWARF_result while_func(statement *, var_list *);
|
|
|
|
+GWARF_result if_func(if_list *, var_list *);
|
|
|
|
+GWARF_result for_func(statement *, var_list *);
|
|
|
|
+GWARF_result call_back(statement *, var_list *);
|
|
|
|
+GWARF_result call_back_core(GWARF_result, var_list *, parameter *);
|
|
|
|
+GWARF_result block_func(statement *, var_list *);
|
|
|
|
+
|
|
GWARF_result add_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result add_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result sub_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result sub_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result mul_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result mul_func(GWARF_result, GWARF_result, var_list *);
|
|
@@ -15,43 +28,31 @@ GWARF_result log_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result sqrt_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result sqrt_func(GWARF_result, GWARF_result, var_list *);
|
|
GWARF_result assigment_func(char *, GWARF_result, var_list *, int);
|
|
GWARF_result assigment_func(char *, GWARF_result, var_list *, int);
|
|
GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
|
|
GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
|
|
-GWARF_result if_func(if_list *, var_list *);
|
|
|
|
-GWARF_result for_func(statement *, var_list *);
|
|
|
|
GWARF_result negative_func(GWARF_result, var_list *);
|
|
GWARF_result negative_func(GWARF_result, var_list *);
|
|
-GWARF_result call_back(statement *, var_list *);
|
|
|
|
-GWARF_result call_back_core(GWARF_result, var_list *, parameter *);
|
|
|
|
-int len_only_double(double num);
|
|
|
|
-int len_double(double num);
|
|
|
|
-int len_int(int num);
|
|
|
|
-int len_intx(unsigned int num);
|
|
|
|
|
|
+
|
|
|
|
+double sqrt_(double, double);
|
|
|
|
+double log_(double, double);
|
|
|
|
|
|
GWARF_value to_int(GWARF_value, var_list *the_var);
|
|
GWARF_value to_int(GWARF_value, var_list *the_var);
|
|
GWARF_value to_double(GWARF_value value, var_list *the_var);
|
|
GWARF_value to_double(GWARF_value value, var_list *the_var);
|
|
-GWARF_value to_bool_(GWARF_value value, var_list *the_var);
|
|
|
|
GWARF_value to_str(GWARF_value value, var_list *the_var);
|
|
GWARF_value to_str(GWARF_value value, var_list *the_var);
|
|
|
|
+GWARF_value to_bool_(GWARF_value value, var_list *the_var);
|
|
bool to_bool(GWARF_value);
|
|
bool to_bool(GWARF_value);
|
|
|
|
+
|
|
GWARF_result get__value__(GWARF_value *, var_list *);
|
|
GWARF_result get__value__(GWARF_value *, var_list *);
|
|
GWARF_result get__bool__(GWARF_value *, var_list *);
|
|
GWARF_result get__bool__(GWARF_value *, var_list *);
|
|
GWARF_result run_func(GWARF_value *, var_list *, char *);
|
|
GWARF_result run_func(GWARF_value *, var_list *, char *);
|
|
|
|
|
|
-int get_var_list_len(var_list *);
|
|
|
|
-var_list *copy_var_list(var_list *);
|
|
|
|
-var_list * append_by_var_list(var_list *, var_list *);
|
|
|
|
-
|
|
|
|
-GWARF_result block_func(statement *, var_list *);
|
|
|
|
|
|
|
|
-// math
|
|
|
|
-double log_(double, double);
|
|
|
|
double log_(double base, double num){ // 自己定义一次log
|
|
double log_(double base, double num){ // 自己定义一次log
|
|
return log(num) / log(base);
|
|
return log(num) / log(base);
|
|
}
|
|
}
|
|
|
|
|
|
-double sqrt_(double, double);
|
|
|
|
double sqrt_(double base, double num){ // 定义根号sqrt
|
|
double sqrt_(double base, double num){ // 定义根号sqrt
|
|
return pow(base, (1 / num));
|
|
return pow(base, (1 / num));
|
|
}
|
|
}
|
|
|
|
|
|
-// bool[bool逻辑转换]
|
|
|
|
|
|
+
|
|
bool to_bool(GWARF_value value){
|
|
bool to_bool(GWARF_value value){
|
|
double bool_double = 1; // if bool_double == 0则返回false其他返回true
|
|
double bool_double = 1; // if bool_double == 0则返回false其他返回true
|
|
if(value.type == OBJECT_value){ // 调用左add方法
|
|
if(value.type == OBJECT_value){ // 调用左add方法
|
|
@@ -80,413 +81,6 @@ bool to_bool(GWARF_value value){
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-// ---- parameter func[形参]
|
|
|
|
-parameter *make_parameter_name(char *name){
|
|
|
|
- parameter *tmp;
|
|
|
|
- tmp = malloc(sizeof(parameter)); // get an address for base var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- tmp->u.name = malloc(sizeof(name));
|
|
|
|
- strcpy(tmp->u.name, name);
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void append_parameter_name(char *name, parameter *parameter_base){
|
|
|
|
- parameter *tmp = parameter_base; // iter var
|
|
|
|
- while(1){
|
|
|
|
- if (tmp->next == NULL){ // the last
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
- parameter *new_tmp = make_parameter_name(name);
|
|
|
|
- tmp->next = new_tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- parameter func[实参]
|
|
|
|
-parameter *make_parameter_value(statement *value){
|
|
|
|
- parameter *tmp;
|
|
|
|
- tmp = malloc(sizeof(parameter)); // get an address for base var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- tmp->u.value = value;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void append_parameter_value(statement *value, parameter *parameter_base){
|
|
|
|
- parameter *tmp = parameter_base; // iter var
|
|
|
|
- while(1){
|
|
|
|
- if (tmp->next == NULL){ // the last
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
- parameter *new_tmp = make_parameter_value(value);
|
|
|
|
- tmp->next = new_tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-parameter *add_parameter_value(statement *value, parameter *parameter_base){
|
|
|
|
- parameter *new_tmp = make_parameter_value(value);
|
|
|
|
- new_tmp->next = parameter_base;
|
|
|
|
- return new_tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-parameter *pack_value_parameter(GWARF_value value){ // 把value封装成参数
|
|
|
|
- parameter *tmp;
|
|
|
|
- tmp = malloc(sizeof(parameter)); // get an address for base var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- statement *statement_tmp = malloc(sizeof(statement));
|
|
|
|
- statement_tmp->type = base_value;
|
|
|
|
- statement_tmp->code.base_value.value = value;
|
|
|
|
- tmp->u.value = statement_tmp;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-statement *pack_call_name(char *name, statement *from){ // 快速生成call back函数的the_statment
|
|
|
|
- statement *tmp = make_statement();
|
|
|
|
- tmp->type = base_var;
|
|
|
|
- tmp->code.base_var.var_name = name;
|
|
|
|
- tmp->code.base_var.from = from;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- var func
|
|
|
|
-
|
|
|
|
-var *make_var(){ // make var with base
|
|
|
|
- var *tmp;
|
|
|
|
- tmp = malloc(sizeof(var)); // get an address for base var
|
|
|
|
- tmp->name = ""; // can't get the name for the real var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- if (tmp->next == NULL){ // not var name *name
|
|
|
|
- break_ = 1;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
- if(break_ == 2){
|
|
|
|
- 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
|
|
|
|
- var *tmp = base_var; // iter var
|
|
|
|
- while(1){
|
|
|
|
- if (tmp->next == NULL){ // the last
|
|
|
|
- free(tmp);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- var *tmp_2 = tmp;
|
|
|
|
- tmp = tmp->next;
|
|
|
|
- free(tmp_2);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-var *get_var(char *name, var *base_var){ // get the address
|
|
|
|
- var *tmp = base_var; // iter var
|
|
|
|
- while(1){
|
|
|
|
- if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
|
|
|
|
- return tmp;
|
|
|
|
- }
|
|
|
|
- if (tmp->next == NULL){ // not var name *name
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void del_var(char *name, var *base_var){ // free an address
|
|
|
|
- var *tmp = base_var, *last_tmp=NULL; // iter var
|
|
|
|
- while(1){
|
|
|
|
- if (tmp->name == name){
|
|
|
|
- if(last_tmp != NULL){
|
|
|
|
- last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
|
|
|
|
- }
|
|
|
|
- free(tmp);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- if (tmp->next == NULL){ // not var name *name
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- last_tmp = tmp;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// --------------default_var
|
|
|
|
-
|
|
|
|
-default_var *make_default_var(){ // make_default_var
|
|
|
|
- default_var *tmp;
|
|
|
|
- tmp = malloc(sizeof(default_var)); // get an address for default_var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-default_var *make_default_var_base(){ // if
|
|
|
|
- default_var *tmp = make_default_var();
|
|
|
|
- tmp->name = "";
|
|
|
|
- tmp->from = 0;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void append_default_var_base(char *name ,int from, default_var *base_default_var){ // elif
|
|
|
|
- default_var *start = base_default_var;
|
|
|
|
- while(1){
|
|
|
|
- if (!strcmp(start->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
|
|
|
|
- return; // 不可以二次设置
|
|
|
|
- }
|
|
|
|
- if (start->next == NULL){ // not var name *name
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
- default_var *tmp = make_default_var();
|
|
|
|
- tmp->name = name;
|
|
|
|
- tmp->from = from;
|
|
|
|
- start->next = tmp;
|
|
|
|
- return;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int get_default(char *name, default_var *base_default_var){ // get the address
|
|
|
|
- default_var *tmp = base_default_var; // iter var
|
|
|
|
- if(tmp == NULL){
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- while(1){
|
|
|
|
- if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
|
|
|
|
- return tmp->from;
|
|
|
|
- }
|
|
|
|
- if (tmp->next == NULL){ // not var name *name
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- statement list
|
|
|
|
-
|
|
|
|
-statement *make_statement(){ // make statement
|
|
|
|
- statement *tmp;
|
|
|
|
- tmp = malloc(sizeof(statement)); // get an address for base var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- tmp->type = start;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-statement *append_statement(statement *base_statement, statement *new_tmp){ // make statement next
|
|
|
|
- statement *tmp = base_statement; // iter var
|
|
|
|
- while(1){
|
|
|
|
- if (tmp->next == NULL){ // not var name *name
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- tmp = tmp->next; // get the next to iter
|
|
|
|
- }
|
|
|
|
- tmp->next = new_tmp;
|
|
|
|
- return new_tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- var_list
|
|
|
|
-
|
|
|
|
-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->default_list = make_default_var_base();
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-var_list *make_var_base(var *gloabl_var){ // make the base for global_var
|
|
|
|
- var_list *tmp = make_var_list();
|
|
|
|
- tmp->var_base = gloabl_var;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-var_list *append_var_list(var *var_base, var_list *var_list_base){ // make var_list[FILO]
|
|
|
|
- var_list *tmp = make_var_list();
|
|
|
|
- tmp->var_base = var_base;
|
|
|
|
- tmp->next = var_list_base;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-var_list *append_by_var_list(var_list *back_var_list, var_list *var_list_base){ // 拼凑两个var_list
|
|
|
|
- var_list *start = back_var_list;
|
|
|
|
- while(1){
|
|
|
|
- if(start->next == NULL){ // to the last
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next;
|
|
|
|
- }
|
|
|
|
- start->next = var_list_base;
|
|
|
|
- return back_var_list;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-var_list *free_var_list(var_list *var_list_base){ // free one var_list[FILO]
|
|
|
|
- var_list *tmp = var_list_base->next;
|
|
|
|
- if(tmp==NULL){
|
|
|
|
- return var_list_base;
|
|
|
|
- }
|
|
|
|
- free(var_list_base);
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int get_var_list_len(var_list *var_base){
|
|
|
|
- var_list *start = var_base;
|
|
|
|
- int tmp = 0;
|
|
|
|
- while(1){
|
|
|
|
- if(start->next == NULL){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next;
|
|
|
|
- tmp += 1;
|
|
|
|
- }
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-var *find_var(var_list *var_base,int from, char *name){ // find var by func get_var in var_list[iter to find]
|
|
|
|
- var_list *start = var_base;
|
|
|
|
- var *return_var;
|
|
|
|
- from += get_default(name, var_base->default_list);
|
|
|
|
- for(int i = 0;i < from;i+= 1){
|
|
|
|
- if(start->next == NULL){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next;
|
|
|
|
- }
|
|
|
|
- // printf("name = %s, from = %d, address = %x\n", name, from, start->var_base);
|
|
|
|
- while (1)
|
|
|
|
- {
|
|
|
|
- return_var = get_var(name, start->var_base);
|
|
|
|
- if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
- else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
|
|
|
|
- start = start->next;
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- // printf("find on name = %s, from = %d, address = %x\n", name, from, start->var_base);
|
|
|
|
- return return_var; //get var success can or can't next
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void add_var(var_list *var_base,int from, char *name, GWARF_value value){ // add var by func append_var in var_list[iter to find]
|
|
|
|
- var_list *start = var_base;
|
|
|
|
- var *return_var;
|
|
|
|
- from += get_default(name, var_base->default_list);
|
|
|
|
- for(int i = 0;i < from;i+= 1){
|
|
|
|
- if(start->next == NULL){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next;
|
|
|
|
- }
|
|
|
|
- // printf("----var add address = %d----\n", start);
|
|
|
|
- append_var(name, value, start->var_base);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-var_list *copy_var_list(var_list *var_list_base){ // 复制一条var链到另一个内存地址上[base不复制]
|
|
|
|
- var_list *start = malloc(sizeof(var_list_base)), *tmp;
|
|
|
|
- memcpy(start, var_list_base, sizeof(var_list_base)); // 复制base节点
|
|
|
|
- tmp = start; // 记录base节点
|
|
|
|
- while(1){ // 复制var_list链
|
|
|
|
- if((start == NULL) || (start->next == NULL)){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- puts("F1");
|
|
|
|
- var_list *next_tmp = malloc(sizeof(start->next));
|
|
|
|
- memcpy(next_tmp, start->next, sizeof(start->next)); // 复制到新的地方
|
|
|
|
- start->next = next_tmp; // 应用新的地方
|
|
|
|
- start = start->next;
|
|
|
|
- }
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- statement_list
|
|
|
|
-statement_list *make_statement_list(){ // make a empty var_list node
|
|
|
|
- statement_list *tmp;
|
|
|
|
- tmp = malloc(sizeof(statement_list)); // get an address for base var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- tmp->statement_base = NULL;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-statement_list *make_statement_base(statement *gloabl_code){
|
|
|
|
- statement_list *tmp = make_statement_list();
|
|
|
|
- tmp->statement_base = gloabl_code;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-statement_list *append_statement_list(statement *statement_base, statement_list *statment_list_base){ // make var_list[FILO]
|
|
|
|
- statement_list *tmp = make_statement_list();
|
|
|
|
- tmp->statement_base = statement_base;
|
|
|
|
- tmp->next = statment_list_base;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-statement *find_statement_list(int from, statement_list *statment_list_base){ // find var by func get_var in var_list[iter to find]
|
|
|
|
- statement_list *start = statment_list_base;
|
|
|
|
- for(int i = 0;i < from;i+= 1){
|
|
|
|
- if(start->next == NULL){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next;
|
|
|
|
- }
|
|
|
|
- return start->statement_base;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-statement_list *free_statement_list(statement_list *statment_list_base){ // make var_list[FILO]
|
|
|
|
- statement_list *tmp = statment_list_base->next;
|
|
|
|
- if(tmp != NULL){
|
|
|
|
- free(statment_list_base);
|
|
|
|
- return tmp;
|
|
|
|
- }
|
|
|
|
- return statment_list_base;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- if_list
|
|
|
|
-if_list *make_base_if(){ // make base if
|
|
|
|
- if_list *tmp;
|
|
|
|
- tmp = malloc(sizeof(if_list)); // get an address for base var
|
|
|
|
- tmp->next = NULL;
|
|
|
|
- tmp->done = NULL;
|
|
|
|
- tmp->condition = NULL;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-if_list *make_if(statement *condition, statement *done_base){ // if
|
|
|
|
- if_list *tmp = make_base_if();
|
|
|
|
- tmp->done = done_base;
|
|
|
|
- tmp->condition = condition;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-if_list *append_elif(if_list *tmp ,if_list *base_if_list){ // elif
|
|
|
|
- if_list *start = base_if_list;
|
|
|
|
- while(1){
|
|
|
|
- if(start->next == NULL){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- start = start->next;
|
|
|
|
- }
|
|
|
|
- start->next = tmp;
|
|
|
|
- return tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ---- run code
|
|
|
|
|
|
|
|
GWARF_result read_statement(statement *the_statement, var_list *the_var, var_list *login_var){ // read the statement list with case to run by func
|
|
GWARF_result read_statement(statement *the_statement, var_list *the_var, var_list *login_var){ // read the statement list with case to run by func
|
|
if(login_var == NULL){
|
|
if(login_var == NULL){
|
|
@@ -2242,775 +1836,6 @@ inter *get_inter(){
|
|
}
|
|
}
|
|
|
|
|
|
// ------official func
|
|
// ------official func
|
|
-void login_official_func(int type, int is_class, var_list *the_var, char *name, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){ // 注册单个official func
|
|
|
|
- GWARF_result func_value;
|
|
|
|
- func *func_tmp = malloc(sizeof(func));
|
|
|
|
-
|
|
|
|
- func_tmp->done = NULL;
|
|
|
|
- func_tmp->parameter_list = NULL;
|
|
|
|
- func_tmp->the_var = copy_var_list(the_var);
|
|
|
|
- func_tmp->type = official;
|
|
|
|
- func_tmp->official_func = type;
|
|
|
|
- func_tmp->is_class = is_class;
|
|
|
|
- func_tmp->paser = paser;
|
|
|
|
-
|
|
|
|
- func_value.value.type = FUNC_value;
|
|
|
|
- func_value.value.value.func_value = func_tmp;
|
|
|
|
- assigment_func(name, func_value, the_var, 0); // 注册函数到指定的位置
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, var_list *)){
|
|
|
|
- // {{official_func_type, is_class}}
|
|
|
|
- int a[][2] = {{1,0}};
|
|
|
|
- // {login_name}
|
|
|
|
- char *name[] = {"print"};
|
|
|
|
|
|
|
|
- int lenth = sizeof(a)/sizeof(a[0]);
|
|
|
|
- for(int i = 0;i < lenth;i+=1){
|
|
|
|
- login_official_func(a[i][0], a[i][1], the_var, name[i], paser);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-// global 全局内置函数解析器
|
|
|
|
-GWARF_result official_func(func *the_func, parameter *tmp_s, var_list *the_var, GWARF_result father, var_list *out_var){
|
|
|
|
- GWARF_result return_value;
|
|
|
|
- return_value.u = return_def;
|
|
|
|
- return_value.return_times = 0;
|
|
|
|
- switch (the_func->official_func)
|
|
|
|
- {
|
|
|
|
- case printf_func:{ // printf something
|
|
|
|
- if(tmp_s == NULL){ // 没有东西要打印
|
|
|
|
- goto return_result;
|
|
|
|
- }
|
|
|
|
- while(1){
|
|
|
|
- GWARF_result tmp = traverse(tmp_s->u.value, out_var, false);
|
|
|
|
- if((tmp.value.type == INT_value)){
|
|
|
|
- printf("%d", tmp.value.value.int_value);
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == BOOL_value){
|
|
|
|
- if(tmp.value.value.bool_value){
|
|
|
|
- printf("true");
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- printf("false");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == NUMBER_value){
|
|
|
|
- printf("%f", tmp.value.value.double_value);
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == NULL_value){
|
|
|
|
- printf("<-None->");
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == STRING_value){
|
|
|
|
- printf("'%s'", tmp.value.value.string);
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == FUNC_value){
|
|
|
|
- printf("<-function on %u->", tmp.value.value.func_value);
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == CLASS_value){
|
|
|
|
- printf("<-class on %u->", tmp.value.value.class_value);
|
|
|
|
- }
|
|
|
|
- else if(tmp.value.type == OBJECT_value){
|
|
|
|
- printf("<-object on %u->", tmp.value.value.object_value);
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- printf("var value = other\n");
|
|
|
|
- }
|
|
|
|
- if (tmp_s->next == NULL){ // the last
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- tmp_s = tmp_s->next;
|
|
|
|
- }
|
|
|
|
- printf("\n"); // 换行
|
|
|
|
- return_value.u = statement_end;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- return_result: return return_value;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-class_object *object_login_official(var_list *the_var, GWARF_result (*paser)(func *, parameter *, var_list *, GWARF_result, 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
|
|
|
|
- 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("object", class_value, the_var, 0); // 注册class 的 位置
|
|
|
|
- puts("----stop set class----");
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- // 注册函数
|
|
|
|
- int a[][2] = {{3,1}};
|
|
|
|
- char *name[] = {"__value__"};
|
|
|
|
-
|
|
|
|
- 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 object_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;
|
|
|
|
- }
|
|
|
|
- switch (the_func->official_func)
|
|
|
|
- {
|
|
|
|
- case __value__func:{ // 若想实现运算必须要有这个方法
|
|
|
|
- return_value.value.type = STRING_value; // 取得用于计算的数值
|
|
|
|
- return_value.value = to_str(*(father.father), out_var);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return_result: return return_value;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
-
|
|
|
|
- assigment_func("gobject", class_value, the_var, 0); // 注册class 的 位置
|
|
|
|
- puts("----stop set class----");
|
|
|
|
-
|
|
|
|
- // 注册函数
|
|
|
|
- int a[][2] = {{2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}, {8,1}, {9,1}, {10,1}, {11,1}, {12,1}, {13,1}, {14,1}, {15,1}, {16,1}, {17,1}, {3,1}};
|
|
|
|
- char *name[] = {"__init__", "__value__", "__add__", "__sub__", "__mul__","__div__","__eq__", "__more__", "__less__", "__eqmore__", "__eqless__","__noteq__", "__pow__", "__log__","__sqrt__","__negative__","__bool__"};
|
|
|
|
-
|
|
|
|
- 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 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;
|
|
|
|
- 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.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"); // gobject类的value存储在self.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;
|
|
|
|
- }
|
|
|
|
- case __eq__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 = equal_func(left_tmp, reight_tmp, out_var, 0);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __more__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 = equal_func(left_tmp, reight_tmp, out_var, 1);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __less__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 = equal_func(left_tmp, reight_tmp, out_var, 2);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __eqmore__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 = equal_func(left_tmp, reight_tmp, out_var, 3);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __eqless__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 = equal_func(left_tmp, reight_tmp, out_var, 4);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __noteq__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 = equal_func(left_tmp, reight_tmp, out_var, 5);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __pow__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 = pow_func(left_tmp, reight_tmp, out_var);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __log__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 = log_func(left_tmp, reight_tmp, out_var);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __sqrt__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 = sqrt_func(left_tmp, reight_tmp, out_var);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case __negative__func:{
|
|
|
|
- GWARF_result left_tmp;
|
|
|
|
- left_tmp.value = find_var(login_var, 0, "value")->value;
|
|
|
|
- return_value = negative_func(left_tmp, out_var);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- 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)){
|
|
|
|
- return value; // 直接返回数据
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- GWARF_value return_number;
|
|
|
|
- return_number.type = INT_value;
|
|
|
|
-
|
|
|
|
- if(value.type == OBJECT_value){ // 调用__value__方法
|
|
|
|
- return_number = to_int(get__value__(&value, the_var).value, the_var); // 递归
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- if(value.type == BOOL_value){
|
|
|
|
- return_number.value.int_value = value.value.bool_value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == NUMBER_value){
|
|
|
|
- return_number.value.int_value = (int)value.value.double_value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == STRING_value){
|
|
|
|
- return_number.value.int_value = atoi(value.value.string);
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- return_number.value.int_value = 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return return_number;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
-
|
|
|
|
- assigment_func("double", 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 double_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_double(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 double[底层实现]
|
|
|
|
-GWARF_value to_double(GWARF_value value, var_list *the_var){
|
|
|
|
- if((value.type == NUMBER_value)){
|
|
|
|
- return value; // 直接返回数据
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- GWARF_value return_number;
|
|
|
|
- return_number.type = NUMBER_value;
|
|
|
|
-
|
|
|
|
- if(value.type == OBJECT_value){ // 调用__value__方法
|
|
|
|
- return_number = to_double(get__value__(&value, the_var).value, the_var); // 递归
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- if(value.type == BOOL_value){
|
|
|
|
- return_number.value.double_value = (double)value.value.bool_value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == INT_value){
|
|
|
|
- return_number.value.double_value = (double)value.value.int_value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == STRING_value){
|
|
|
|
- return_number.value.double_value = (double)atof(value.value.string);
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- return_number.value.double_value = 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return return_number;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
-
|
|
|
|
- assigment_func("str", 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 str_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_str(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 str[底层实现]
|
|
|
|
-GWARF_value to_str(GWARF_value value, var_list *the_var){
|
|
|
|
- if((value.type == STRING_value)){
|
|
|
|
- return value; // 直接返回数据
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- GWARF_value return_number;
|
|
|
|
- return_number.type = STRING_value;
|
|
|
|
-
|
|
|
|
- if(value.type == OBJECT_value){ // 调用__value__方法
|
|
|
|
- return_number = to_str(get__value__(&value, the_var).value, the_var); // 递归
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- if(value.type == BOOL_value){
|
|
|
|
- if(value.value.bool_value){
|
|
|
|
- return_number.value.string = "true";
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- return_number.value.string = "false";
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else if(value.type == INT_value){
|
|
|
|
- size_t size = (size_t)(2 + len_int(value.value.int_value));
|
|
|
|
- return_number.value.string = (char *)malloc(size);
|
|
|
|
- snprintf(return_number.value.string, size, "%d", value.value.int_value);
|
|
|
|
- }
|
|
|
|
- else if(value.type == NUMBER_value){
|
|
|
|
- size_t size = (size_t)(2 + len_double(value.value.double_value));
|
|
|
|
- return_number.value.string = (char *)malloc(size);
|
|
|
|
- snprintf(return_number.value.string, size, "%f", value.value.double_value);
|
|
|
|
- }
|
|
|
|
- else if(value.type == NULL_value){
|
|
|
|
- return_number.value.string = "<-None->";
|
|
|
|
- }
|
|
|
|
- else if(value.type == FUNC_value){
|
|
|
|
- size_t size = (size_t)(20 + len_intx((unsigned int)value.value.func_value)); // 转换为无符号整形数字
|
|
|
|
- return_number.value.string = (char *)malloc(size);
|
|
|
|
- snprintf(return_number.value.string, size, "<-function on %u->", value.value.func_value);
|
|
|
|
- }
|
|
|
|
- else if(value.type == CLASS_value){
|
|
|
|
- size_t size = (size_t)(16 + len_intx((unsigned int)value.value.class_value));
|
|
|
|
- return_number.value.string = (char *)malloc(size);
|
|
|
|
- snprintf(return_number.value.string, size, "<-class on %u->", value.value.class_value);
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- printf("var value = other\n");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return return_number;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
-
|
|
|
|
- assigment_func("bool", 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 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内部环境
|
|
|
|
- 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_bool_(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 bool[底层实现]
|
|
|
|
-GWARF_value to_bool_(GWARF_value value, var_list *the_var){
|
|
|
|
- if((value.type == BOOL_value)){
|
|
|
|
- return value; // 直接返回数据
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- GWARF_value return_number;
|
|
|
|
- return_number.type = BOOL_value;
|
|
|
|
-
|
|
|
|
- if(value.type == OBJECT_value){ // 调用__value__方法
|
|
|
|
- return_number = to_bool_(get__value__(&value, the_var).value, the_var); // 递归
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- return_number.value.bool_value = to_bool(value); // 转换成bool
|
|
|
|
- }
|
|
|
|
- return return_number;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-GWARF_result get__value__(GWARF_value *base_the_var, var_list *the_var){ // 用于计算的get__value__统一核心
|
|
|
|
- return run_func(base_the_var, the_var, "__value__");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-GWARF_result get__bool__(GWARF_value *base_the_var, var_list *the_var){ // 用于计算的get__value__统一核心
|
|
|
|
- return run_func(base_the_var, the_var, "__bool__");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-GWARF_result run_func(GWARF_value *base_the_var, var_list *the_var, char *name){ // 无参数func->直到返回GWARF_value[not class]
|
|
|
|
- GWARF_result reight_tmp, get;
|
|
|
|
- int times = 0;
|
|
|
|
- var_list *call_var;
|
|
|
|
- while(1){
|
|
|
|
- if(base_the_var->type == CLASS_value){ // is class so that can use "."
|
|
|
|
- call_var = base_the_var->value.class_value->the_var;
|
|
|
|
- }
|
|
|
|
- else if(base_the_var->type == OBJECT_value){
|
|
|
|
- call_var = base_the_var->value.object_value->the_var;
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- reight_tmp.u = return_def;
|
|
|
|
- reight_tmp.value = *base_the_var;
|
|
|
|
- reight_tmp.return_times = times;
|
|
|
|
- goto return_result; // 如果类型不是object或者class
|
|
|
|
- }
|
|
|
|
- get.value = find_var(call_var, 0, name)->value; // TODO:: 需要检查__value__是否存在
|
|
|
|
- get.father = base_the_var; // 设置father
|
|
|
|
- reight_tmp = call_back_core(get, the_var, NULL);
|
|
|
|
- times = reight_tmp.return_times;
|
|
|
|
- base_the_var = &(reight_tmp.value); // 重复获取__value__[直到类型不是object或class]
|
|
|
|
- }
|
|
|
|
- return_result: return reight_tmp;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-GWARF_value to_object(GWARF_value value, var_list *the_var){ // 把GWARF_value封装成objct
|
|
|
|
- GWARF_result return_value;
|
|
|
|
- if((value.type == CLASS_value) || (value.type == OBJECT_value) || (value.type == FUNC_value) || (value.type == NULL_value)){ // 可以直接返回
|
|
|
|
- return value;
|
|
|
|
- }
|
|
|
|
- GWARF_result func_result;
|
|
|
|
- if(value.type == NUMBER_value){
|
|
|
|
- func_result.value = find_var(the_var, 0, "double")->value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == INT_value){
|
|
|
|
- func_result.value = find_var(the_var, 0, "int")->value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == BOOL_value){
|
|
|
|
- func_result.value = find_var(the_var, 0, "bool")->value;
|
|
|
|
- }
|
|
|
|
- else if(value.type == STRING_value){
|
|
|
|
- func_result.value = find_var(the_var, 0, "str")->value;
|
|
|
|
- }
|
|
|
|
- else{
|
|
|
|
- return value;
|
|
|
|
- }
|
|
|
|
- return call_back_core(func_result, the_var, pack_value_parameter(value)).value;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-int len_int(int num){
|
|
|
|
- int count = 1; // 默认得有1位
|
|
|
|
- while(1){
|
|
|
|
- num = num / 10;
|
|
|
|
- if(num <= 0){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- count += 1;
|
|
|
|
- }
|
|
|
|
- return count;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int len_only_double(double num){
|
|
|
|
- int count = 1; // 默认得有1位
|
|
|
|
- while(1){
|
|
|
|
- num = num * 10;
|
|
|
|
- if(num - (int)num <= 0){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- count += 1;
|
|
|
|
- }
|
|
|
|
- return count;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int len_double(double num){
|
|
|
|
- int count = 1, i = (int)num;
|
|
|
|
- count += len_int(i);
|
|
|
|
- count += len_only_double(num);
|
|
|
|
- return count;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int len_intx(unsigned int num){ // 16进制
|
|
|
|
- int count = 1; // 默认得有1位
|
|
|
|
- while(1){
|
|
|
|
- num = num / 16;
|
|
|
|
- if(num <= 0){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- count += 1;
|
|
|
|
- }
|
|
|
|
- return count;
|
|
|
|
-}
|
|
|
|
|
|
|
|
-// TODO::设置func和NULL均为object,设置object无__add___等方法时的操作
|
|
|
|
|
|
+// TODO::设置func和NULL均为object,设置object无__add___等方法时的操作:: NULL永远只有一个实例, object回调__call__ [find_var类型检查]
|