Browse Source

feat: 字面量使用str保存

字面了不再存储位LinkValue而是str
函数调用参数赋值在函数调用的动态VarList上
Argument中的LinkValue设置gc_tmp
SongZihuan 4 years ago
parent
commit
56921ddd28
7 changed files with 68 additions and 19 deletions
  1. 8 1
      include/statement.h
  2. 1 0
      main.c
  3. 4 4
      parser/grammar.c
  4. 13 2
      src/parameter.c
  5. 9 3
      src/runcall.c
  6. 10 5
      src/runoperation.c
  7. 23 4
      src/statement.c

+ 8 - 1
include/statement.h

@@ -28,7 +28,13 @@ struct Statement{
     } type;
     } type;
     union StatementU{
     union StatementU{
         struct base_value{
         struct base_value{
+            enum BaseValueType{
+                link_value = 0,
+                string_str = 1,
+                number_str = 2,
+            } type;
             struct LinkValue *value;
             struct LinkValue *value;
+            char *str;
         } base_value;
         } base_value;
         struct base_var{
         struct base_var{
             char *name;
             char *name;
@@ -149,7 +155,8 @@ Statement *copyStatementCore(Statement *st);
 void connectStatement(Statement *base, Statement *new);
 void connectStatement(Statement *base, Statement *new);
 
 
 Statement *makeOperationStatement(int type, long int line, char *file);
 Statement *makeOperationStatement(int type, long int line, char *file);
-Statement *makeBaseValueStatement(LinkValue *value, long int line, char *file);
+Statement *makeBaseLinkValueStatement(LinkValue *value, long int line, char *file);
+Statement *makeBaseStrValueStatement(char *value, enum BaseValueType type, long int line, char *file);
 Statement *makeBaseVarStatement(char *name, Statement *times, long int line, char *file);
 Statement *makeBaseVarStatement(char *name, Statement *times, long int line, char *file);
 Statement *makeBaseSVarStatement(Statement *name, Statement *times);
 Statement *makeBaseSVarStatement(Statement *name, Statement *times);
 Statement *makeBaseDictStatement(Parameter *pt, long int line, char *file);
 Statement *makeBaseDictStatement(Parameter *pt, long int line, char *file);

+ 1 - 0
main.c

@@ -22,4 +22,5 @@ int main(int argc, char *argv[]) {
  * TODO-szh 生成语法树
  * TODO-szh 生成语法树
  * TODO-szh 取反符号 -
  * TODO-szh 取反符号 -
  * TODO-szh 字面量后缀
  * TODO-szh 字面量后缀
+ * TODO-szh 字面量使用string处理方式
  */
  */

+ 4 - 4
parser/grammar.c

@@ -808,19 +808,19 @@ int getOperation(PASERSSIGNATURE, int right_type, Statement **st, char *name){
     return_:
     return_:
     return 1;
     return 1;
 }
 }
+//st = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
+//st = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
 void parserBaseValue(PASERSSIGNATURE){
 void parserBaseValue(PASERSSIGNATURE){
     Token *value_token = popAheadToken(pm);
     Token *value_token = popAheadToken(pm);
     Statement *st = NULL;
     Statement *st = NULL;
     if (MATHER_NUMBER == value_token->token_type){
     if (MATHER_NUMBER == value_token->token_type){
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get number [%s]\n", value_token->data.str);
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get number [%s]\n", value_token->data.str);
-        char *stop;
-        Value *tmp_value = makeNumberValue(strtol(value_token->data.str, &stop, 10), inter);
-        st = makeBaseValueStatement(makeLinkValue(tmp_value, NULL, inter), value_token->line, pm->file);
+        st = makeBaseStrValueStatement(value_token->data.str, number_str, value_token->line, pm->file);
     }
     }
     else if (MATHER_STRING == value_token->token_type){
     else if (MATHER_STRING == value_token->token_type){
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get string [%s]\n", value_token->data.str);
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get string [%s]\n", value_token->data.str);
         Value *tmp_value = makeStringValue(value_token->data.str, inter);
         Value *tmp_value = makeStringValue(value_token->data.str, inter);
-        st = makeBaseValueStatement(makeLinkValue(tmp_value, NULL, inter), value_token->line, pm->file);
+        st = makeBaseStrValueStatement(value_token->data.str, string_str, value_token->line, pm->file);
     }
     }
     else if (MATHER_VAR == value_token->token_type){
     else if (MATHER_VAR == value_token->token_type){
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get var [%s]\n", value_token->data.str);
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Base Value: get var [%s]\n", value_token->data.str);

+ 13 - 2
src/parameter.c

@@ -20,6 +20,8 @@ Argument *makeArgument(){
 Argument *makeValueArgument(LinkValue *value){
 Argument *makeValueArgument(LinkValue *value){
     Argument *tmp = makeArgument();
     Argument *tmp = makeArgument();
     tmp->data.value = value;
     tmp->data.value = value;
+    gcAddTmp(&value->gc_status);
+
     return tmp;
     return tmp;
 }
 }
 
 
@@ -28,6 +30,7 @@ Argument *makeStatementNameArgument(LinkValue *value, Statement *name){
     tmp->type = name_arg;
     tmp->type = name_arg;
     tmp->data.value = value;
     tmp->data.value = value;
     tmp->data.name = name;
     tmp->data.name = name;
+    gcAddTmp(&value->gc_status);
     return tmp;
     return tmp;
 }
 }
 
 
@@ -38,6 +41,8 @@ Argument *makeCharNameArgument(LinkValue *value, LinkValue *name_value, char *na
     tmp->data.value = value;
     tmp->data.value = value;
     tmp->data.name_ = memStrcpy(name, 0, false, false);
     tmp->data.name_ = memStrcpy(name, 0, false, false);
     tmp->data.name_value = name_value;
     tmp->data.name_value = name_value;
+    gcAddTmp(&value->gc_status);
+    gcAddTmp(&name_value->gc_status);
     return tmp;
     return tmp;
 }
 }
 
 
@@ -71,6 +76,12 @@ void freeArgument(Argument *at, bool free_st) {
         if (free_st)
         if (free_st)
             freeStatement(at->data.name);
             freeStatement(at->data.name);
         memFree(at->data.name_);
         memFree(at->data.name_);
+
+        if (at->data.name_value != NULL)
+            gcFreeTmpLink(&at->data.name_value->gc_status);
+        if (at->data.value != NULL)
+            gcFreeTmpLink(&at->data.value->gc_status);
+
         Argument *tmp = at->next;
         Argument *tmp = at->next;
         memFree(at);
         memFree(at);
         at = tmp;
         at = tmp;
@@ -181,9 +192,8 @@ void freeParameter(Parameter *pt, bool free_st) {
 
 
 Argument *listToArgument(LinkValue *list_value, INTER_FUNCTIONSIG_CORE){
 Argument *listToArgument(LinkValue *list_value, INTER_FUNCTIONSIG_CORE){
     Argument *at = NULL;
     Argument *at = NULL;
-    for (int i=0;i<list_value->value->data.list.size;i++){
+    for (int i=0;i<list_value->value->data.list.size;i++)
         at = connectValueArgument(list_value->value->data.list.list[i], at);
         at = connectValueArgument(list_value->value->data.list.list[i], at);
-    }
     return at;
     return at;
 }
 }
 
 
@@ -393,6 +403,7 @@ Result iterParameter(Parameter *call, Argument **base_ad, INTER_FUNCTIONSIG_CORE
     while (call != NULL){
     while (call != NULL){
         if(operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(call->data.value, var_list)))
         if(operationSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(call->data.value, var_list)))
             goto return_;
             goto return_;
+
         if (call->type == value_par)
         if (call->type == value_par)
             base = connectValueArgument(result.value, base);
             base = connectValueArgument(result.value, base);
         else if (call->type == name_par)
         else if (call->type == name_par)

+ 9 - 3
src/runcall.c

@@ -29,15 +29,21 @@ Result callFunction(INTER_FUNCTIONSIG) {
         result.type = error_return;
         result.type = error_return;
         goto return_;
         goto return_;
     }
     }
-    VarList *function_var = function_value.value->value->data.function.var;
+    VarList *function_var = pushVarList(function_value.value->value->data.function.var, inter);
+    gcAddTmp(&function_var->hashtable->gc_status);
+
     set_tmp = setParameter(st->u.call_function.parameter, function_value.value->value->data.function.pt, function_var,
     set_tmp = setParameter(st->u.call_function.parameter, function_value.value->value->data.function.pt, function_var,
                            st, CALL_INTER_FUNCTIONSIG_CORE(var_list));
                            st, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-    if (set_tmp.type == error_return)
+    if (set_tmp.type == error_return) {
+        gcAddTmp(&function_var->hashtable->gc_status);
+        popVarList(function_var);
         return set_tmp;
         return set_tmp;
+    }
     else
     else
         freeResult(&set_tmp);
         freeResult(&set_tmp);
-    function_var = pushVarList(function_var, inter);
     functionSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(function_value.value->value->data.function.function, function_var));
     functionSafeInterStatement(&result, CALL_INTER_FUNCTIONSIG(function_value.value->value->data.function.function, function_var));
+
+    gcFreeTmpLink(&function_var->hashtable->gc_status);
     popVarList(function_var);
     popVarList(function_var);
 
 
     freeResult(&function_value);
     freeResult(&function_value);

+ 10 - 5
src/runoperation.c

@@ -196,10 +196,7 @@ Result assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_CORE){
     if (name->type == base_list && name->u.base_list.type == value_tuple){
     if (name->type == base_list && name->u.base_list.type == value_tuple){
         Parameter *pt = NULL;
         Parameter *pt = NULL;
         Argument *call = NULL;
         Argument *call = NULL;
-        Statement *tmp_st = makeStatement(name->line, name->code_file);
-
-        tmp_st->type = base_value;
-        tmp_st->u.base_value.value = value;
+        Statement *tmp_st = makeBaseLinkValueStatement(value, name->line, name->code_file);
 
 
         pt = makeArgsParameter(tmp_st);
         pt = makeArgsParameter(tmp_st);
         call = getArgument(pt, &tmp_result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
         call = getArgument(pt, &tmp_result, CALL_INTER_FUNCTIONSIG_CORE(var_list));
@@ -276,7 +273,15 @@ Result getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
 Result getBaseValue(INTER_FUNCTIONSIG) {
 Result getBaseValue(INTER_FUNCTIONSIG) {
     Result result;
     Result result;
     setResultCore(&result);
     setResultCore(&result);
-    result.value = st->u.base_value.value;
+    if (st->u.base_value.type == link_value) {
+        result.value = st->u.base_value.value;
+    }
+    else if (st->u.base_value.type == number_str){
+        char *stop = NULL;
+        result.value = makeLinkValue(makeNumberValue(strtol(st->u.base_value.str, &stop, 10), inter), NULL, inter);
+    }
+    else
+        result.value = makeLinkValue(makeStringValue(st->u.base_value.str, inter), NULL, inter);
     result.type = operation_return;
     result.type = operation_return;
     gcAddTmp(&result.value->gc_status);
     gcAddTmp(&result.value->gc_status);
     return result;
     return result;

+ 23 - 4
src/statement.c

@@ -35,14 +35,25 @@ Token *setOperationFromToken(Statement **st_ad, struct Token *left, struct Token
     return new_token;
     return new_token;
 }
 }
 
 
-Statement *makeBaseValueStatement(LinkValue *value, long int line, char *file) { 
+Statement *makeBaseLinkValueStatement(LinkValue *value, long int line, char *file) {
     Statement *tmp = makeStatement(line, file);
     Statement *tmp = makeStatement(line, file);
     tmp->type = base_value;
     tmp->type = base_value;
+    tmp->u.base_value.type = link_value;
     tmp->u.base_value.value = value;
     tmp->u.base_value.value = value;
+    tmp->u.base_value.str = NULL;
     gcAddStatementLink(&value->gc_status);
     gcAddStatementLink(&value->gc_status);
     return tmp;
     return tmp;
 }
 }
 
 
+Statement *makeBaseStrValueStatement(char *value, enum BaseValueType type, long int line, char *file) {
+    Statement *tmp = makeStatement(line, file);
+    tmp->type = base_value;
+    tmp->u.base_value.type = type;
+    tmp->u.base_value.value = NULL;
+    tmp->u.base_value.str = memStrcpy(value, 0, false, false);
+    return tmp;
+}
+
 Statement *makeBaseVarStatement(char *name, Statement *times, long int line, char *file) {
 Statement *makeBaseVarStatement(char *name, Statement *times, long int line, char *file) {
     Statement *tmp = makeStatement(line, file);
     Statement *tmp = makeStatement(line, file);
     tmp->type = base_var;
     tmp->type = base_var;
@@ -197,7 +208,10 @@ void freeStatement(Statement *st){
                 freeStatement(st->u.operation.left);
                 freeStatement(st->u.operation.left);
                 break;
                 break;
             case base_value:
             case base_value:
-                gcFreeStatementLink(&st->u.base_value.value->gc_status);
+                if (st->u.base_value.type == link_value)
+                    gcFreeStatementLink(&st->u.base_value.value->gc_status);
+                else
+                    memFree(st->u.base_value.str);
                 break;
                 break;
             case base_var:
             case base_var:
                 memFree(st->u.base_var.name);
                 memFree(st->u.base_var.name);
@@ -306,8 +320,13 @@ Statement *copyStatementCore(Statement *st){
     new->next = NULL;
     new->next = NULL;
     switch (st->type) {
     switch (st->type) {
         case base_value:
         case base_value:
-            new->u.base_value.value = st->u.base_value.value;
-            gcAddStatementLink(&new->u.base_value.value->gc_status);
+            new->u.base_value.type = st->u.base_value.type;
+            if (new->u.base_value.type == link_value) {
+                new->u.base_value.value = st->u.base_value.value;
+                gcAddStatementLink(&new->u.base_value.value->gc_status);
+            }
+            else
+                new->u.base_value.str = memStrcpy(st->u.base_value.str, 0, false, false);
             break;
             break;
         case operation:
         case operation:
             new->u.operation.OperationType = st->u.operation.OperationType;
             new->u.operation.OperationType = st->u.operation.OperationType;