Explorar el Código

feat: 设置inter的Data成员

inter的数据存储在data中
var的前缀存储在data中
SongZihuan hace 4 años
padre
commit
f58374adbe
Se han modificado 11 ficheros con 56 adiciones y 48 borrados
  1. 8 2
      include/inter.h
  2. 3 3
      include/run.h
  3. 1 2
      include/token.h
  4. 0 3
      include/var.h
  5. 11 16
      main.c
  6. 11 11
      src/__run.c
  7. 18 7
      src/inter.c
  8. 1 1
      src/operation.c
  9. 1 1
      src/parameter.c
  10. 1 1
      src/run.c
  11. 1 1
      src/runcall.c

+ 8 - 2
include/inter.h

@@ -7,13 +7,19 @@ struct Inter{
     struct HashTable *hash_base;
     struct HashTable *hash_base;
     struct Statement *statement;
     struct Statement *statement;
     struct VarList *var_list;
     struct VarList *var_list;
-    char *log_dir;  // 记录log文件夹的位置
-    FILE *debug;
+    struct InterData{
+        FILE *debug;
+        char *log_dir;  // 记录log文件夹的位置
+        char *var_str_prefix;
+        char *var_num_prefix;
+        char *var_defualt;
+    } data;
 };
 };
 
 
 typedef struct Inter Inter;
 typedef struct Inter Inter;
 
 
 Inter *makeInter(char *debug);
 Inter *makeInter(char *debug);
 void freeInter(Inter *inter, bool self);
 void freeInter(Inter *inter, bool self);
+void setBaseInterData(struct Inter *inter);
 
 
 #endif //VIRTUALMATH_INTER_H
 #endif //VIRTUALMATH_INTER_H

+ 3 - 3
include/run.h

@@ -30,9 +30,9 @@ Result raiseCode(INTER_FUNCTIONSIG);
 
 
 Result assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_CORE);
 Result assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_CORE);
 
 
-char *setStrVarName(char *old, bool free_old);
-char *setNumVarName(NUMBER_TYPE num);
-char *getNameFromValue(Value *value);
+char *setStrVarName(char *old, bool free_old, INTER_FUNCTIONSIG_CORE);
+char *setNumVarName(NUMBER_TYPE num, INTER_FUNCTIONSIG_CORE);
+char *getNameFromValue(Value *value, INTER_FUNCTIONSIG_CORE);
 Result getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG);
 Result getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG);
 Result getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG);
 Result getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG);
 Result getVarInfo(char **name, int *times, INTER_FUNCTIONSIG);
 Result getVarInfo(char **name, int *times, INTER_FUNCTIONSIG);

+ 1 - 2
include/token.h

@@ -87,8 +87,7 @@
 
 
 #define MATHER_MAX 75
 #define MATHER_MAX 75
 
 
-// 从-5开始是为了避开status的特殊值,尽管这并没有什么影响
-#define COMMANDLIST -5
+// 从-6开始是为了避开status的特殊值,尽管这并没有什么影响
 #define COMMAND -6
 #define COMMAND -6
 #define OPERATION -7
 #define OPERATION -7
 #define POLYNOMIAL -8
 #define POLYNOMIAL -8

+ 0 - 3
include/var.h

@@ -2,9 +2,6 @@
 #define VIRTUALMATH_VAR_H
 #define VIRTUALMATH_VAR_H
 
 
 #define MAX_SIZE (1024)
 #define MAX_SIZE (1024)
-#define VARSTR_PREFIX "str_"
-#define VARNUM_PREFIX "num_"
-#define VARDEFAULT_PREFIX "default_var"
 
 
 struct Var{
 struct Var{
     char *name;
     char *name;

+ 11 - 16
main.c

@@ -25,40 +25,34 @@ int getArgs(int argc, char *argv[]);
 void freeArgs();
 void freeArgs();
 
 
 int main(int argc, char *argv[]) {
 int main(int argc, char *argv[]) {
-    printf("[start VirtualMath]\n");
-    if (getArgs(argc, argv)){
+    if (getArgs(argc, argv))
         goto args_error_;
         goto args_error_;
-    }
 
 
-    Inter *global_iter = makeInter(args.log_file);
+    Inter *global_inter = makeInter(args.log_file);
     ParserMessage *pm = makeParserMessage(args.file, args.log_file);
     ParserMessage *pm = makeParserMessage(args.file, args.log_file);
 
 
-    printf("[start to lexical]\n");
-    parserCommandList(pm, global_iter, true, global_iter->statement);
+    parserCommandList(pm, global_inter, true, global_inter->statement);
     if (pm->status != success){
     if (pm->status != success){
         writeLog(pm->paser_debug, ERROR, "Syntax Error: %s\n", pm->status_message);
         writeLog(pm->paser_debug, ERROR, "Syntax Error: %s\n", pm->status_message);
         writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
         writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
         goto return_;
         goto return_;
     }
     }
 
 
-    printf("[start to run]\n");
     Result tmp;
     Result tmp;
-    tmp = globalIterStatement(global_iter);
+    tmp = globalIterStatement(global_inter);
     if (tmp.type == error_return){
     if (tmp.type == error_return){
-        writeLog(global_iter->debug, ERROR, "Run Error\n", NULL);
+        writeLog(global_inter->data.debug, ERROR, "Run Error\n", NULL);
         writeLog(stderr, ERROR, "Run Error\n", NULL);
         writeLog(stderr, ERROR, "Run Error\n", NULL);
     }
     }
 
 
     return_:
     return_:
     freeParserMessage(pm, true);
     freeParserMessage(pm, true);
-    freeInter(global_iter, true);
+    freeInter(global_inter, true);
     freeArgs();
     freeArgs();
-    printf("[exit Virtual [0]]\n");
     return 0;
     return 0;
 
 
     args_error_:
     args_error_:
     freeArgs();
     freeArgs();
-    printf("[exit Virtual [1]]\n");
     return 1;
     return 1;
 }
 }
 
 
@@ -118,7 +112,8 @@ void freeArgs(){
 }
 }
 
 
 /**
 /**
- *  TODO-szh 函数形式参数复制
- *  TODO-szh 运行错误的内存释放检查
- *  TODO-szh syntax错误的内存释放检查
- */
+ * TODO-szh 使用inter的Data成员
+ * TODO-szh 面向对象
+ * TODO-szh import和include语句
+ * TODO-szh 检查文件是否存在
+ */

+ 11 - 11
src/__run.c

@@ -4,7 +4,7 @@ Result getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
     Result result;
     Result result;
     Result times_tmp;
     Result times_tmp;
 
 
-    *name = setStrVarName(st->u.base_var.name, false);
+    *name = setStrVarName(st->u.base_var.name, false, inter, var_list);
 
 
     if (st->u.base_var.times == NULL){
     if (st->u.base_var.times == NULL){
         *times = 0;
         *times = 0;
@@ -26,7 +26,7 @@ Result getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
 
 
     if (operationSafeInterStatement(&value, CALL_INTER_FUNCTIONSIG(st->u.base_svar.name, var_list)))
     if (operationSafeInterStatement(&value, CALL_INTER_FUNCTIONSIG(st->u.base_svar.name, var_list)))
         return value;
         return value;
-    *name = getNameFromValue(value.value->value);
+    *name = getNameFromValue(value.value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
 
 
     if (st->u.base_svar.times == NULL){
     if (st->u.base_svar.times == NULL){
         *times = 0;
         *times = 0;
@@ -50,32 +50,32 @@ Result getVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
     else{
     else{
         if (operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(st, var_list)))
         if (operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(st, var_list)))
             return result;
             return result;
-        *name = getNameFromValue(result.value->value);
+        *name = getNameFromValue(result.value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
         *times = 0;
         *times = 0;
     }
     }
     return result;
     return result;
 }
 }
 
 
-char *setStrVarName(char *old, bool free_old){
-    char *name = memStrcat(VARSTR_PREFIX, old);
+char *setStrVarName(char *old, bool free_old, INTER_FUNCTIONSIG_CORE) {
+    char *name = memStrcat(inter->data.var_str_prefix, old);
     if (free_old)
     if (free_old)
         memFree(old);
         memFree(old);
     return name;
     return name;
 }
 }
 
 
-char *setNumVarName(NUMBER_TYPE num){
+char *setNumVarName(NUMBER_TYPE num, INTER_FUNCTIONSIG_CORE) {
     char name[50];
     char name[50];
     snprintf(name, 50, "%"NUMBER_FORMAT, num);
     snprintf(name, 50, "%"NUMBER_FORMAT, num);
-    return memStrcat(VARNUM_PREFIX, name);
+    return memStrcat(inter->data.var_num_prefix, name);
 }
 }
 
 
-char *getNameFromValue(Value *value){
+char *getNameFromValue(Value *value, INTER_FUNCTIONSIG_CORE) {
     switch (value->type){
     switch (value->type){
         case string:
         case string:
-            return setStrVarName(value->data.str.str, false);
+            return setStrVarName(value->data.str.str, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
         case number:
         case number:
-            return setNumVarName(value->data.num.num);
+            return setNumVarName(value->data.num.num, CALL_INTER_FUNCTIONSIG_CORE(var_list));
         default:
         default:
-            return memStrcpy(VARDEFAULT_PREFIX, 0, false, false);
+            return memStrcpy(inter->data.var_defualt, 0, false, false);
     }
     }
 }
 }

+ 18 - 7
src/inter.c

@@ -2,22 +2,33 @@
 
 
 Inter *makeInter(char *debug){
 Inter *makeInter(char *debug){
     Inter *tmp = memCalloc(1, sizeof(Inter));
     Inter *tmp = memCalloc(1, sizeof(Inter));
+    setBaseInterData(tmp);
     tmp->base = NULL;
     tmp->base = NULL;
     tmp->link_base = NULL;
     tmp->link_base = NULL;
     tmp->statement = makeStatement();
     tmp->statement = makeStatement();
     tmp->var_list = makeVarList(tmp);
     tmp->var_list = makeVarList(tmp);
-    tmp->log_dir = memStrcpy(debug, 0, false, false);
-    makeValue(tmp);  // 注册None值
+    tmp->data.log_dir = memStrcpy(debug, 0, false, false);
+
     if (debug != NULL && !args.stdout_inter){
     if (debug != NULL && !args.stdout_inter){
         char *debug_dir = memStrcat(debug, INTER_LOG);
         char *debug_dir = memStrcat(debug, INTER_LOG);
-        tmp->debug = fopen(debug_dir, "w");
+        tmp->data.debug = fopen(debug_dir, "w");
         memFree(debug_dir);
         memFree(debug_dir);
     }
     }
     else
     else
-        tmp->debug = stdout;
+        tmp->data.debug = stdout;
+
+    makeValue(tmp);  // 注册None值
     return tmp;
     return tmp;
 }
 }
 
 
+void setBaseInterData(struct Inter *inter){
+    inter->data.var_str_prefix = "str_";
+    inter->data.var_num_prefix = "num_";
+    inter->data.var_defualt = "default_var";
+    inter->data.debug = NULL;
+    inter->data.log_dir = NULL;
+}
+
 void freeInter(Inter *inter, bool self){
 void freeInter(Inter *inter, bool self){
     freeBase(inter, return_);
     freeBase(inter, return_);
     while (inter->base != NULL)
     while (inter->base != NULL)
@@ -31,9 +42,9 @@ void freeInter(Inter *inter, bool self){
 
 
     freeStatement(inter->statement);
     freeStatement(inter->statement);
     freeVarList(inter->var_list, true);
     freeVarList(inter->var_list, true);
-    memFree(inter->log_dir);
-    if (inter->log_dir != NULL)
-        fclose(inter->debug);
+    memFree(inter->data.log_dir);
+    if (inter->data.log_dir != NULL)
+        fclose(inter->data.debug);
     if (self){
     if (self){
         memFree(inter);
         memFree(inter);
     }
     }

+ 1 - 1
src/operation.c

@@ -197,7 +197,7 @@ Result getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
     result.value = findFromVarList(name, var_list, int_times, false);
     result.value = findFromVarList(name, var_list, int_times, false);
     memFree(name);
     memFree(name);
     if (result.value == NULL){
     if (result.value == NULL){
-        writeLog_(inter->debug, WARNING, "var not found[%s]\n", st->u.base_var.name);
+        writeLog_(inter->data.debug, WARNING, "var not found[%s]\n", st->u.base_var.name);
         setResultError(&result, inter);
         setResultError(&result, inter);
     }
     }
     return result;
     return result;

+ 1 - 1
src/parameter.c

@@ -510,7 +510,7 @@ Result setParameterCore(Argument *call, Parameter *function_base, VarList *funct
             }
             }
             case error:
             case error:
             error_:
             error_:
-                writeLog(inter->debug, ERROR, "setParameter error\n", NULL);
+                writeLog(inter->data.debug, ERROR, "setParameter error\n", NULL);
                 setResultError(&result, inter);
                 setResultError(&result, inter);
                 goto return_;
                 goto return_;
             default:
             default:

+ 1 - 1
src/run.c

@@ -27,7 +27,7 @@ Result runStatement(INTER_FUNCTIONSIG) {
             break;
             break;
         case operation:
         case operation:
             result = operationStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
             result = operationStatement(CALL_INTER_FUNCTIONSIG(st, var_list));
-            printLinkValue(result.value, "operation result = ", "\n", inter->debug);
+            printLinkValue(result.value, "operation result = ", "\n", inter->data.debug);
             break;
             break;
         case set_function:
         case set_function:
             result = setFunction(CALL_INTER_FUNCTIONSIG(st, var_list));
             result = setFunction(CALL_INTER_FUNCTIONSIG(st, var_list));

+ 1 - 1
src/runcall.c

@@ -18,7 +18,7 @@ Result callFunction(INTER_FUNCTIONSIG) {
         return call_function;
         return call_function;
 
 
     if (call_function.value->value->type != function){
     if (call_function.value->value->type != function){
-        writeLog_(inter->debug, WARNING, "call not function[%d]\n", call_function.type);
+        writeLog_(inter->data.debug, WARNING, "call not function[%d]\n", call_function.type);
         setResultError(&result, inter);
         setResultError(&result, inter);
         result.type = error_return;
         result.type = error_return;
         goto return_;
         goto return_;