1
0
Эх сурвалжийг харах

新增了指数,对数,根试的运算符和对字符串以及bool的处理,从此编译需要加-lm选项

SongZihuan 5 жил өмнө
parent
commit
e73d401509

+ 2 - 1
.vscode/settings.json

@@ -30,6 +30,7 @@
         "fstream": "c",
         "streambuf": "c",
         "interprete.h": "c",
-        "mutex": "c"
+        "mutex": "c",
+        "cmath": "c"
     }
 }


+ 4 - 0
gwarf_interpreter/interprete.h

@@ -71,6 +71,10 @@ typedef struct statement{
                 MOREEQ_func,  // >=
                 LESSEQ_func,  // <=
                 NOTEQ_func,  // <>
+                POW_func,  // <>
+                LOG_func,  // <>
+                SQRT_func,  // <>
+                NEGATIVE_func,  // -a
             } type;
             struct statement *right_exp;  // the right exp
             struct statement *left_exp;  // the left exp

+ 261 - 43
gwarf_interpreter/interpreter.c

@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
-// #include "interprete.h"
 #include "../paser/y.tab.c"
+#include <math.h>
 
 // running code
 GWARF_result while_func(statement *, var_list *);
@@ -10,13 +10,28 @@ GWARF_result add_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 div_func(GWARF_result, GWARF_result, var_list *);
+GWARF_result pow_func(GWARF_result, GWARF_result, var_list *);
+GWARF_result log_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 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 *);
 int get_var_list_len(var_list *);
 GWARF_result block_func(statement *, var_list *);
 
+// math
+double log_(double, double);
+double log_(double base, double num){  // 自己定义一次log
+    return log(num) / log(base);
+}
+
+double sqrt_(double, double);
+double sqrt_(double base, double num){  // 定义根号sqrt
+    return pow(base, (1 / num));
+}
+
 // ---- var func
 
 var *make_var(){  // make var with base
@@ -338,12 +353,15 @@ GWARF_result read_statement_list(statement *the_statement, var_list *the_var){
         case operation:  // 表达式运算
             puts("----code----");
             return_value = operation_func(the_statement, the_var);
-            if(return_value.value.type == INT_value){
+            if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
                 printf("operation value = %d\n", return_value.value.value.int_value);
             }
-            else{
+            else if(return_value.value.type == NUMBER_value){
                 printf("operation value = %f\n", return_value.value.value.double_value);
             }
+            else{
+                printf("operation value = %s\n", return_value.value.value.string);
+            }
             puts("----stop code----");
             break;
         case while_cycle:
@@ -363,12 +381,15 @@ GWARF_result read_statement_list(statement *the_statement, var_list *the_var){
             break;
         case base_value:  // get value[所有字面量均为这个表达式]
             return_value.value = (the_statement->code).base_value.value;  // code
-            if(return_value.value.type == INT_value){
+            if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
                 printf("get value = %d\n", return_value.value.value.int_value);
             }
-            else{
+            else if(return_value.value.type == NUMBER_value){
                 printf("get value = %f\n", return_value.value.value.double_value);
             }
+            else{
+                printf("get value = %s\n", return_value.value.value.string);
+            }
             break;
         case base_var:{    // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
             int from = 0;
@@ -385,12 +406,15 @@ GWARF_result read_statement_list(statement *the_statement, var_list *the_var){
             else
             {
                 return_value.value = tmp->value;  // get_var
-                if(return_value.value.type == INT_value){
+                if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
                     printf("var value = %d\n", return_value.value.value.int_value);
                 }
-                else{
+                else if(return_value.value.type == NUMBER_value){
                     printf("var value = %f\n", return_value.value.value.double_value);
                 }
+                else{
+                    printf("var value = %s\n", return_value.value.value.string);
+                }
             }
             break;
         }
@@ -833,10 +857,12 @@ GWARF_result while_func(statement *the_statement, var_list *the_var){  // read t
 
 GWARF_result operation_func(statement *the_statement, var_list *the_var){  // read the statement list with case to run by func
     GWARF_result value, left_result, right_result;
-
-    left_result = traverse((*the_statement).code.operation.left_exp, the_var, false);
+    int func_type = the_statement->code.operation.type;
+    if((func_type != ASSIGMENT_func) && (func_type != NEGATIVE_func)){  // don't run because I don't need[if it's and func ,it will be run twice]
+        left_result = traverse((*the_statement).code.operation.left_exp, the_var, false);
+    }
     right_result = traverse((*the_statement).code.operation.right_exp, the_var, false);
-    switch (the_statement->code.operation.type)  // 获取运算类型
+    switch (func_type)  // 获取运算类型
     {
         case ADD_func:
             value = add_func(left_result, right_result, the_var);
@@ -850,6 +876,9 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var){  // re
         case DIV_func:
             value = div_func(left_result, right_result, the_var);
             break;
+        case NEGATIVE_func:
+            value = negative_func(right_result, the_var);
+            break;
         case ASSIGMENT_func:{  // because the var char, we should ues a {} to make a block[name space] for the tmp var;
             char *left = (the_statement->code.operation.left_exp)->code.base_var.var_name;  // get var name but not value
             int from = 0;
@@ -886,6 +915,15 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var){  // re
         case NOTEQ_func:
             value = equal_func(left_result, right_result, the_var, 5);
             break;
+        case POW_func:
+            value = pow_func(left_result, right_result, the_var);
+            break;
+        case LOG_func:
+            value = log_func(left_result, right_result, the_var);
+            break;
+        case SQRT_func:
+            value = sqrt_func(left_result, right_result, the_var);
+            break;
         default:
             break;
     }
@@ -896,25 +934,34 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var){  // re
 // ---------  ADD
 GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for add and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for add
-    if((left_result.value.type == INT_value) && (right_result.value.type == INT_value)){  // all is INT
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
         return_value.u = return_def;
         return_value.value.type = INT_value;
-        return_value.value.value.int_value = left_result.value.value.int_value + right_result.value.value.int_value;
+        return_value.value.value.int_value = (int)(left_result.value.value.int_value + right_result.value.value.int_value);
     }
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value + right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.double_value);
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.int_value + right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.int_value + right_result.value.value.double_value);
     }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value + right_result.value.value.int_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.int_value);
+    }
+    else if((left_result.value.type == STRING_value) && (right_result.value.type == STRING_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = STRING_value;
+        char *l = left_result.value.value.string;
+        char *r = right_result.value.value.string;
+        return_value.value.value.string = malloc(strlen(l) + strlen(r));  // 创建新空间
+        strcpy(return_value.value.value.string, l);  // 复制字符串
+        strcat(return_value.value.value.string, r);  // 追加字符串
     }
     return return_value;
 }
@@ -922,25 +969,52 @@ GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  SUB
 GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for sub and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for sub
-    if((left_result.value.type == INT_value) && (right_result.value.type == INT_value)){  // all is INT
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
         return_value.u = return_def;
         return_value.value.type = INT_value;
-        return_value.value.value.int_value = left_result.value.value.int_value - right_result.value.value.int_value;
+        return_value.value.value.int_value = (int)(left_result.value.value.int_value - right_result.value.value.int_value);
     }
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value - right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.int_value - right_result.value.value.double_value);
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.int_value - right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.int_value);
+    }
+    return return_value;
+}
+
+// ---------  negative
+GWARF_result negative_func(GWARF_result right_result, var_list *the_var){  // the func for sub and call from read_statement_list
+    GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for sub
+    if(right_result.value.type == INT_value || right_result.value.type == BOOL_value){  // all is INT
+        return_value.u = return_def;
+        return_value.value.type = INT_value;
+        return_value.value.value.int_value = (int)(-1 * right_result.value.value.int_value);
     }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+    else if(right_result.value.type == NUMBER_value){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value - right_result.value.value.int_value;
+        return_value.value.value.double_value = (double)(-1 * right_result.value.value.double_value);
+    }
+    else if(right_result.value.type == STRING_value){  // 字符串
+        return_value.u = return_def;
+        return_value.value.type = STRING_value;
+        char *r = right_result.value.value.string;
+        return_value.value.value.string = malloc(strlen(r));  // 创建新空间
+        char *tmp = malloc(strlen(r));
+        strcpy(tmp, r);  // 复制字符串
+        for(int i=0;i<strlen(tmp);i += 1){
+            return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+        }
     }
     return return_value;
 }
@@ -948,25 +1022,84 @@ GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  MUL
 GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for mul and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for mul
-    if((left_result.value.type == INT_value) && (right_result.value.type == INT_value)){  // all is INT
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
         return_value.u = return_def;
         return_value.value.type = INT_value;
-        return_value.value.value.int_value = left_result.value.value.int_value * right_result.value.value.int_value;
+        return_value.value.value.int_value = (int)(left_result.value.value.int_value * right_result.value.value.int_value);
     }
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value * right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.double_value);
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.int_value * right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.int_value * right_result.value.value.double_value);
     }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value * right_result.value.value.int_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.int_value);
+    }
+    else if((left_result.value.type == INT_value) && (right_result.value.type == STRING_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = STRING_value;
+        int l = left_result.value.value.int_value;
+        char *r = right_result.value.value.string;
+        if(l == 0){
+            return_value.value.value.string = (char *)malloc(0);  // NULL string
+        }
+        else if(l > 0){
+            return_value.value.value.string = malloc(strlen(r) * l);  // 创建新空间
+            strcpy(return_value.value.value.string, r);  // 复制字符串
+            l -= 1;
+            for(;l>0;l -= 1){
+                strcat(return_value.value.value.string, r);  // 追加字符串
+            }
+        }
+        else{
+            return_value.value.value.string = malloc(strlen(r) * (-l));  // 创建新空间
+            char *tmp = malloc(strlen(r) * (-l));
+            strcpy(tmp, r);  // 复制字符串
+            l += 1;
+            for(;l<0;l += 1){
+                strcat(tmp, r);  // 追加字符串
+            }
+            for(int i=0;i<strlen(tmp);i += 1){
+                return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+            }
+        }
+    }
+    else if((left_result.value.type == STRING_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = STRING_value;
+        int l = right_result.value.value.int_value;
+        char *r = left_result.value.value.string;
+        if(l == 0){
+            return_value.value.value.string = (char *)malloc(0);  // NULL string
+        }
+        else if(l > 0){
+            return_value.value.value.string = malloc(strlen(r) * l);  // 创建新空间
+            strcpy(return_value.value.value.string, r);  // 复制字符串
+            l -= 1;
+            for(;l>0;l -= 1){
+                strcat(return_value.value.value.string, r);  // 追加字符串
+            }
+        }
+        else{
+            return_value.value.value.string = malloc(strlen(r) * (-l));  // 创建新空间
+            char *tmp = malloc(strlen(r) * (-l));
+            strcpy(tmp, r);  // 复制字符串
+            l += 1;
+            for(;l<0;l += 1){
+                strcat(tmp, r);  // 追加字符串
+            }
+            for(int i=0;i<strlen(tmp);i += 1){
+                return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1];  // 反转
+            }
+        }
+        
     }
     return return_value;
 }
@@ -974,25 +1107,103 @@ GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  DIV
 GWARF_result div_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for div and call from read_statement_list
     GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for div
-    if((left_result.value.type == INT_value) && (right_result.value.type == INT_value)){  // all is INT
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
         return_value.u = return_def;
         return_value.value.type = INT_value;
-        return_value.value.value.int_value = left_result.value.value.int_value / right_result.value.value.int_value;
+        return_value.value.value.int_value = (int)(left_result.value.value.int_value / right_result.value.value.int_value);
     }
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value / right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value / right_result.value.value.double_value);
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.int_value / right_result.value.value.double_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.int_value / right_result.value.value.double_value);
     }
-    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
-        return_value.value.value.double_value = left_result.value.value.double_value / right_result.value.value.int_value;
+        return_value.value.value.double_value = (double)(left_result.value.value.double_value / right_result.value.value.int_value);
+    }
+    return return_value;
+}
+
+// ---------  POW
+GWARF_result pow_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for div and call from read_statement_list
+    GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for div
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+        return_value.u = return_def;
+        return_value.value.type = INT_value;
+        return_value.value.value.int_value = (int)pow((double)left_result.value.value.int_value, (double)right_result.value.value.int_value);
+    }
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)pow(left_result.value.value.double_value, right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)pow((double)left_result.value.value.int_value, (double)right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)pow((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
+    }
+    return return_value;
+}
+
+// ---------  LOG
+GWARF_result log_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for div and call from read_statement_list
+    GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for div
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+        return_value.u = return_def;
+        return_value.value.type = INT_value;
+        return_value.value.value.int_value = (int)log_((double)left_result.value.value.int_value, (double)right_result.value.value.int_value);
+    }
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)log_(left_result.value.value.double_value, right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)log_((double)left_result.value.value.int_value, (double)right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)log_((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
+    }
+    return return_value;
+}
+
+// ---------  SQRT
+GWARF_result sqrt_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){  // the func for div and call from read_statement_list
+    GWARF_result return_value;  // the result by call read_statement_list with left and right; value is the result for div
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
+        return_value.u = return_def;
+        return_value.value.type = INT_value;
+        return_value.value.value.int_value = (int)sqrt_((double)left_result.value.value.int_value, (double)right_result.value.value.int_value);
+    }
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)sqrt_(left_result.value.value.double_value, right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)sqrt_((double)left_result.value.value.int_value, (double)right_result.value.value.double_value);
+    }
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
+        return_value.u = return_def;
+        return_value.value.type = NUMBER_value;
+        return_value.value.value.double_value = (double)sqrt_((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
     }
     return return_value;
 }
@@ -1008,7 +1219,7 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
     GWARF_result return_value;
     int return_bool = 1;
     return_value.u = return_def;
-    if((left_result.value.type == INT_value) && (right_result.value.type == INT_value)){  // all is INT
+    if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is INT
         return_value.value.type = INT_value;
         if ((left_result.value.value.int_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
             return_bool = true;  // 返回1 否则(默认)为0
@@ -1050,7 +1261,7 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             return_bool = true;  // 返回1 否则(默认)为0
         }
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == INT_value)){  // all is NUMBER
+    else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){  // all is NUMBER
         return_value.value.type = INT_value;
         if ((left_result.value.value.double_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
             return_bool = true;  // 返回1 否则(默认)为0
@@ -1071,7 +1282,7 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             return_bool = true;  // 返回1 否则(默认)为0
         }
     }
-    else if((left_result.value.type == INT_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
+    else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.value.type = INT_value;
         if ((left_result.value.value.int_value == right_result.value.value.double_value) && (type == 0)){  // 如果相等
             return_bool = true;  // 返回1 否则(默认)为0
@@ -1092,7 +1303,8 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
             return_bool = true;  // 返回1 否则(默认)为0
         }
     }
-    return_value.value.value.int_value = return_bool;
+    return_value.value.value.bool_value = return_bool;
+    return_value.value.type = BOOL_value;
     return return_value;
 }
 
@@ -1100,6 +1312,12 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
 GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){  // traverse the statement
     statement *tmp = the_statement;
     GWARF_result result, result2;
+    if(the_statement == NULL){
+        result.u = statement_end;  // 正常设置[正常语句结束]
+        result.value.type = NUMBER_value;  // 默认设置
+        result.value.value.double_value = 0;  // 默认设置
+        goto return_back;
+    }
     bool lock = false;
     if(new){  // need to make new var
         printf("----address = %d----\n", the_var);
@@ -1143,7 +1361,7 @@ GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){  /
     if(new){  // need to make new var
         the_var = free_var_list(the_var);  // free the new var
     }
-    return result;
+    return_back: return result;
 }
 
 GWARF_result traverse_global(statement *the_statement, var_list *the_var){  // traverse the statement[not break、broken、and others]

+ 5 - 0
paser/gwarf_lex.l

@@ -53,6 +53,11 @@
 <INITIAL>"<" {return LESS;}
 <INITIAL>"==" {return EQUAL;}
 <INITIAL>"=" {return EQ;}
+<INITIAL>"**" {return POW;}
+<INITIAL>"^" {return POW;}
+<INITIAL>"~" {return SQRT;}
+<INITIAL>"log" {return LOG;}
+<INITIAL>"sqrt" {return SQRT;}
 <INITIAL>"+" {return ADD;}
 <INITIAL>"-" {return SUB;}
 <INITIAL>"*" {return MUL;}

+ 94 - 29
paser/gwarf_yacc.y

@@ -16,9 +16,10 @@
 }
 %token <double_value> NUMBER INT
 %token <string_value> STRING VAR
-%token ADD SUB DIV MUL EQ LESS MORE RB LB RP LP WHILE POW EQUAL MOREEQ LESSEQ NOTEQ BREAK IF ELSE ELIF BROKEN CONTINUE CONTINUED RESTART RESTARTED REGO REWENT RI LI DEFAULT FOR COMMA GLOBAL NONLOCAL INDENTA STOPN STOPF BLOCK
-%type <statement_value> base_number base_var_token base_var_ element second_number first_number top_exp command third_number while_block while_exp break_exp if_block if_exp broken_exp break_token broken_token continue_token continue_exp
+%token ADD SUB DIV MUL EQ LESS MORE RB LB RP LP WHILE POW LOG SQRT EQUAL MOREEQ LESSEQ NOTEQ BREAK IF ELSE ELIF BROKEN CONTINUE CONTINUED RESTART RESTARTED REGO REWENT RI LI DEFAULT FOR COMMA GLOBAL NONLOCAL INDENTA STOPN STOPF BLOCK
+%type <statement_value> base_value base_var_token base_var_ element second_number first_number zero_number top_exp command third_number while_block while_exp break_exp if_block if_exp broken_exp break_token broken_token continue_token continue_exp
 %type <statement_value> continued_exp continued_token restart_exp restart_token restarted_exp restarted_token default_token for_exp for_block global_token nonlocal_token block_exp block_block
+%type <string_value> base_string
 %type <if_list_base> elif_exp
 %%
 command_block
@@ -217,8 +218,8 @@ second_number
     ;
 
 first_number
-    : element
-    | first_number MUL element
+    : zero_number
+    | first_number MUL zero_number
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = operation;
@@ -227,7 +228,7 @@ first_number
         code_tmp->code.operation.right_exp = $3;
         $$ = code_tmp;
     }
-    | first_number DIV element
+    | first_number DIV zero_number
     {
         statement *code_tmp =  make_statement();
         code_tmp->type = operation;
@@ -238,16 +239,56 @@ first_number
     }
     ;
 
+zero_number
+    : element
+    | zero_number POW element
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->type = operation;
+        code_tmp->code.operation.type = POW_func;
+        code_tmp->code.operation.left_exp = $1;
+        code_tmp->code.operation.right_exp = $3;
+        $$ = code_tmp;
+    }
+    | zero_number LOG element
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->type = operation;
+        code_tmp->code.operation.type = LOG_func;
+        code_tmp->code.operation.left_exp = $1;
+        code_tmp->code.operation.right_exp = $3;
+        $$ = code_tmp;
+    }
+    | zero_number SQRT element
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->type = operation;
+        code_tmp->code.operation.type = SQRT_func;
+        code_tmp->code.operation.left_exp = $1;
+        code_tmp->code.operation.right_exp = $3;
+        $$ = code_tmp;
+    }
+    ;
+
 element
-    : base_number
+    : base_value
     | base_var_
+    | SUB element
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->type = operation;
+        code_tmp->code.operation.type = NEGATIVE_func;
+        code_tmp->code.operation.left_exp = NULL;
+        code_tmp->code.operation.right_exp = $2;
+        $$ = code_tmp;
+    }
     | LB top_exp RB
     {
         $$ = $2;
     }
     ;
 
-base_number
+base_value
     : NUMBER
     {
         statement *code_tmp =  make_statement();
@@ -264,6 +305,52 @@ base_number
         code_tmp->code.base_value.value.value.int_value = (int)$1;
         $$ = code_tmp;
     }
+    | base_string
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->type = base_value;
+        code_tmp->code.base_value.value.type = STRING_value;
+        code_tmp->code.base_value.value.value.string = $1;
+        $$ = code_tmp;
+    }
+    ;
+
+base_var_
+    : base_var_token
+    | LI element RI base_var_token
+    {
+        $4->code.base_var.from = $2;
+        $$ = $4;
+    }
+    ;
+
+base_var_token
+    : VAR
+    {
+        statement *code_tmp =  make_statement();
+        code_tmp->code.base_var.var_name = malloc(sizeof($1));
+        char *name_tmp = code_tmp->code.base_var.var_name;
+        code_tmp->type = base_var;
+        code_tmp->code.base_var.from = NULL;
+        strcpy(name_tmp, $1);
+        $$ = code_tmp;
+    }
+    ;
+
+base_string
+    : STRING
+    {
+        // STRING is char * which the len is 1
+        char *tmp = malloc(sizeof($1));
+        strcpy(tmp, $1);
+        $$ = tmp;
+    }
+    | base_string STRING
+    {
+        char *tmp = realloc($1, strlen($1) + strlen($2));  // get address
+        strcat(tmp, $2);
+        $$ = tmp;
+    }
     ;
 
 nonlocal_token
@@ -309,28 +396,6 @@ default_token
     }
     ;
 
-base_var_
-    : base_var_token
-    | LI element RI base_var_token
-    {
-        $4->code.base_var.from = $2;
-        $$ = $4;
-    }
-    ;
-
-base_var_token
-    : VAR
-    {
-        statement *code_tmp =  make_statement();
-        code_tmp->code.base_var.var_name = malloc(sizeof($1));
-        char *name_tmp = code_tmp->code.base_var.var_name;
-        code_tmp->type = base_var;
-        code_tmp->code.base_var.from = NULL;
-        strcpy(name_tmp, $1);
-        $$ = code_tmp;
-    }
-    ;
-
 if_block
     : if_exp block
     {

+ 189 - 159
paser/lex.yy.c

@@ -351,8 +351,8 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 	(yy_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 56
-#define YY_END_OF_BUFFER 57
+#define YY_NUM_RULES 61
+#define YY_END_OF_BUFFER 62
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -360,24 +360,25 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[149] =
+static const flex_int16_t yy_accept[159] =
     {   0,
-        0,    0,    0,    0,    0,    0,    0,    0,   57,   48,
-       45,   47,   48,   41,   39,   40,   22,   23,   35,   33,
-       17,   34,   36,   43,   43,   46,   30,   32,   29,   44,
-       37,   38,   44,   44,   44,   44,   44,   44,   44,   44,
-       44,   44,   24,   25,   47,   51,   49,   50,   55,   54,
-       53,   52,   56,    0,    0,    0,   24,    0,   28,    0,
-       43,   27,   31,   26,   44,   44,   44,   44,   44,   44,
-       44,   44,    5,   44,   44,   44,   24,    0,    0,    0,
-        0,   42,   44,   44,   44,   44,   44,   44,   44,   16,
-       44,   44,   44,   44,   44,   44,    0,    0,    0,    0,
-
-        3,   44,   44,   44,   44,   44,    6,    7,   44,   44,
-       14,   44,   44,   44,    1,    2,    6,    7,   21,    8,
-       44,   44,   44,    0,   44,   44,   44,   44,    4,    2,
-        9,   44,   44,    7,   19,   44,   44,   15,   44,   18,
-       44,   11,   10,   20,   44,   13,   12,    0
+        0,    0,    0,    0,    0,    0,    0,    0,   62,   53,
+       50,   52,   53,   46,   44,   45,   22,   23,   40,   38,
+       17,   39,   41,   48,   48,   51,   30,   32,   29,   49,
+       42,   43,   34,   49,   49,   49,   49,   49,   49,   49,
+       49,   49,   49,   49,   49,   24,   25,   35,   52,   56,
+       54,   55,   60,   59,   58,   57,   61,    0,    0,    0,
+       24,    0,   28,   33,    0,   48,   27,   31,   26,   49,
+       49,   49,   49,   49,   49,   49,   49,    5,   49,   49,
+       49,   49,   49,   24,    0,    0,    0,    0,   47,   49,
+       49,   49,   49,   49,   49,   49,   16,   49,   36,   49,
+
+       49,   49,   49,   49,   49,    0,    0,    0,    0,    3,
+       49,   49,   49,   49,   49,    6,    7,   49,   49,   14,
+       49,   49,   37,   49,    1,    2,    6,    7,   21,    8,
+       49,   49,   49,    0,   49,   49,   49,   49,    4,    2,
+        9,   49,   49,    7,   19,   49,   49,   15,   49,   18,
+       49,   11,   10,   20,   49,   13,   12,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -391,11 +392,11 @@ static const YY_CHAR yy_ec[256] =
        20,   21,    1,    1,   22,   22,   22,   22,   22,   22,
        22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
        22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       23,    1,   24,    1,   22,    1,   25,   26,   27,   28,
+       23,    1,   24,   25,   22,    1,   26,   27,   28,   29,
 
-       29,   30,   31,   32,   33,   22,   34,   35,   22,   36,
-       37,   22,   22,   38,   39,   40,   41,   22,   42,   22,
-       22,   22,   43,    1,   44,    1,    1,    1,    1,    1,
+       30,   31,   32,   33,   34,   22,   35,   36,   22,   37,
+       38,   22,   39,   40,   41,   42,   43,   22,   44,   22,
+       22,   22,   45,    1,   46,   47,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -412,111 +413,115 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static const YY_CHAR yy_meta[45] =
+static const YY_CHAR yy_meta[48] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    2,    2,    1,    1,    1,
-        1,    2,    1,    1,    2,    2,    2,    2,    2,    2,
+        1,    2,    1,    1,    1,    2,    2,    2,    2,    2,
         2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-        2,    2,    1,    1
+        2,    2,    2,    2,    1,    1,    1
     } ;
 
-static const flex_int16_t yy_base[153] =
+static const flex_int16_t yy_base[163] =
     {   0,
-        0,  168,   43,   44,   46,   50,    0,    0,  170,  172,
-       56,  166,  148,  172,  172,  172,  172,  172,  172,  172,
-      172,  172,  172,  172,   46,  172,  147,  146,  145,    0,
-      172,  172,   26,  127,  134,  127,  124,  125,  129,  121,
-      128,  124,  153,  172,  151,  172,  172,  172,  172,  172,
-      172,  172,  172,   63,  150,  117,  149,  147,  172,   51,
-       55,  172,  172,  172,    0,  112,   41,  112,  117,   40,
-      108,  108,    0,  108,   44,  110,  140,  138,  137,   41,
-      136,   60,  111,  112,  102,   95,  109,  103,  103,    0,
-      105,   95,   92,   88,   98,   91,  122,  121,   93,   93,
-
-      172,   87,   86,   90,   85,   76,    0,  108,   90,   77,
-        0,   88,   69,   75,  172,  101,  172,   94,    0,    0,
-       65,   64,   63,   88,   61,   68,   56,   53,    0,   89,
-        0,   49,   49,  172,    0,   63,   47,    0,   55,    0,
-       47,   52,   28,    0,   26,    0,    0,  172,  106,  108,
-      110,   45
+        0,  177,   46,   47,   49,   53,    0,    0,  179,  181,
+       59,  175,  157,  181,  181,  181,  181,  181,  166,  181,
+      181,  181,  181,  181,   49,  181,  155,  154,  153,    0,
+      181,  181,  181,   28,  134,  141,  134,  131,  132,  136,
+      128,  127,  134,  124,  129,  159,  181,  181,  157,  181,
+      181,  181,  181,  181,  181,  181,  181,   67,  156,  122,
+      155,  153,  181,  181,   55,   59,  181,  181,  181,    0,
+      117,   29,  117,  122,   16,  112,  113,    0,  118,  112,
+       42,  108,  113,  144,  142,  141,   43,  140,   62,  114,
+      115,  105,   97,  112,  106,  106,    0,  108,    0,   98,
+
+       95,   90,  101,   88,   93,  125,  124,   95,   95,  181,
+       89,   88,   92,   87,   77,    0,  111,   85,   72,    0,
+       83,   71,    0,   77,  181,  104,  181,   97,    0,    0,
+       66,   65,   65,   91,   63,   70,   56,   53,    0,   92,
+        0,   50,   50,  181,    0,   65,   48,    0,   58,    0,
+       51,   55,   53,    0,   52,    0,    0,  181,  112,  114,
+      116,   78
     } ;
 
-static const flex_int16_t yy_def[153] =
+static const flex_int16_t yy_def[163] =
     {   0,
-      148,    1,  149,  149,  150,  150,  151,  151,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  152,
-      148,  148,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  152,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  148,  148,  148,  148,
-      148,  148,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  148,  148,  148,  148,
-
-      148,  152,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  148,  148,  148,  148,  152,  152,
-      152,  152,  152,  148,  152,  152,  152,  152,  152,  148,
-      152,  152,  152,  148,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  152,    0,  148,  148,
-      148,  148
+      158,    1,  159,  159,  160,  160,  161,  161,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  162,
+      158,  158,  158,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  158,  158,  158,  158,  158,  158,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+
+      162,  162,  162,  162,  162,  158,  158,  158,  158,  158,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  158,  158,  158,  158,  162,  162,
+      162,  162,  162,  158,  162,  162,  162,  162,  162,  158,
+      162,  162,  162,  158,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,    0,  158,  158,
+      158,  158
     } ;
 
-static const flex_int16_t yy_nxt[217] =
+static const flex_int16_t yy_nxt[229] =
     {   0,
        10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
        20,   21,   22,   10,   23,   24,   25,   26,   27,   28,
-       29,   30,   31,   32,   30,   33,   34,   35,   36,   37,
-       38,   30,   39,   30,   30,   40,   30,   41,   30,   30,
-       30,   42,   43,   44,   47,   47,   65,   50,   48,   48,
-       51,   50,   52,  147,   51,  146,   52,   54,   55,   60,
-       66,   61,   61,   67,   54,   55,   82,   82,   60,   84,
-       61,   61,   88,   99,   93,   82,   82,   85,   89,  100,
-      145,  144,   94,  143,   56,   95,  142,  141,  140,  139,
-      130,   56,  138,  137,  136,  135,  134,  133,   57,  132,
-
-      131,  124,  130,  129,  128,   57,   46,   46,   49,   49,
-       53,   53,  127,  126,  125,  124,  123,  122,  121,  120,
-      119,  118,  117,  116,  115,  114,  113,  112,  111,  110,
-      109,  108,  107,  106,  105,  104,  103,  102,  101,   98,
-       97,   77,   96,   92,   91,   90,   87,   86,   83,   81,
-       77,   80,   79,   78,   77,   76,   75,   74,   73,   72,
-       71,   70,   69,   68,   64,   63,   62,   59,   58,  148,
-       45,    9,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148
+       29,   30,   31,   32,   33,   30,   34,   35,   36,   37,
+       38,   39,   30,   40,   30,   41,   42,   30,   30,   43,
+       44,   30,   30,   45,   46,   47,   48,   51,   51,   95,
+       54,   52,   52,   55,   54,   56,   96,   55,   91,   56,
+       58,   59,   65,   71,   66,   66,   92,   72,   58,   59,
+       89,   89,   65,  101,   66,   66,  108,   89,   89,   70,
+      157,  156,  102,  109,  155,  103,  154,  153,   60,  152,
+      151,  150,  149,  140,  148,  147,   60,  146,  145,  144,
+
+      143,  142,  141,   61,  134,  140,  139,  138,  137,  136,
+      135,   61,   50,   50,   53,   53,   57,   57,  134,  133,
+      132,  131,  130,  129,  128,  127,  126,  125,  124,  123,
+      122,  121,  120,  119,  118,  117,  116,  115,  114,  113,
+      112,  111,  110,  107,  106,   84,  105,  104,  100,   99,
+       98,   97,   94,   93,   90,   88,   84,   87,   86,   85,
+       84,   83,   82,   81,   80,   79,   78,   77,   76,   75,
+       74,   73,   69,   68,   67,   64,   63,   62,  158,   49,
+        9,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158
     } ;
 
-static const flex_int16_t yy_chk[217] =
+static const flex_int16_t yy_chk[229] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    3,    4,  152,    5,    3,    4,
-        5,    6,    5,  145,    6,  143,    6,   11,   11,   25,
-       33,   25,   25,   33,   54,   54,   60,   60,   61,   67,
-       61,   61,   70,   80,   75,   82,   82,   67,   70,   80,
-      142,  141,   75,  139,   11,   75,  137,  136,  133,  132,
-      130,   54,  128,  127,  126,  125,  124,  123,   11,  122,
-
-      121,  118,  116,  114,  113,   54,  149,  149,  150,  150,
-      151,  151,  112,  110,  109,  108,  106,  105,  104,  103,
-      102,  100,   99,   98,   97,   96,   95,   94,   93,   92,
-       91,   89,   88,   87,   86,   85,   84,   83,   81,   79,
-       78,   77,   76,   74,   72,   71,   69,   68,   66,   58,
-       57,   56,   55,   45,   43,   42,   41,   40,   39,   38,
-       37,   36,   35,   34,   29,   28,   27,   13,   12,    9,
-        2,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-
-      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
-      148,  148,  148,  148,  148,  148
+        1,    1,    1,    1,    1,    1,    1,    3,    4,   75,
+        5,    3,    4,    5,    6,    5,   75,    6,   72,    6,
+       11,   11,   25,   34,   25,   25,   72,   34,   58,   58,
+       65,   65,   66,   81,   66,   66,   87,   89,   89,  162,
+      155,  153,   81,   87,  152,   81,  151,  149,   11,  147,
+      146,  143,  142,  140,  138,  137,   58,  136,  135,  134,
+
+      133,  132,  131,   11,  128,  126,  124,  122,  121,  119,
+      118,   58,  159,  159,  160,  160,  161,  161,  117,  115,
+      114,  113,  112,  111,  109,  108,  107,  106,  105,  104,
+      103,  102,  101,  100,   98,   96,   95,   94,   93,   92,
+       91,   90,   88,   86,   85,   84,   83,   82,   80,   79,
+       77,   76,   74,   73,   71,   62,   61,   60,   59,   49,
+       46,   45,   44,   43,   42,   41,   40,   39,   38,   37,
+       36,   35,   29,   28,   27,   19,   13,   12,    9,    2,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -544,9 +549,9 @@ char *yytext;
     int flat = 0;
     int is_last = 0;  // 是否\n
     int is_stop = 0;  // 针对}需要返回一个}的同时返回一个STOP
-#line 547 "lex.yy.c"
+#line 552 "lex.yy.c"
 
-#line 549 "lex.yy.c"
+#line 554 "lex.yy.c"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -771,7 +776,7 @@ YY_DECL
 	{
 #line 13 "gwarf_lex.l"
 
-#line 774 "lex.yy.c"
+#line 779 "lex.yy.c"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -799,13 +804,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 149 )
+				if ( yy_current_state >= 159 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 172 );
+		while ( yy_base[yy_current_state] != 181 );
 
 yy_find_action:
 		yy_act = yy_accept[yy_current_state];
@@ -1004,142 +1009,167 @@ YY_RULE_SETUP
 case 33:
 YY_RULE_SETUP
 #line 56 "gwarf_lex.l"
-{return ADD;}
+{return POW;}
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 57 "gwarf_lex.l"
-{return SUB;}
+{return POW;}
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
 #line 58 "gwarf_lex.l"
-{return MUL;}
+{return SQRT;}
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 59 "gwarf_lex.l"
-{return DIV;}
+{return LOG;}
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 60 "gwarf_lex.l"
-{return LI;}
+{return SQRT;}
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 61 "gwarf_lex.l"
-{return RI;}
+{return ADD;}
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 63 "gwarf_lex.l"
-{BEGIN COMMENT;}
+#line 62 "gwarf_lex.l"
+{return SUB;}
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 64 "gwarf_lex.l"
-{BEGIN STRING_TEXT;}
+#line 63 "gwarf_lex.l"
+{return MUL;}
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 65 "gwarf_lex.l"
-{BEGIN STRING_TEXT;}
+#line 64 "gwarf_lex.l"
+{return DIV;}
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
+#line 65 "gwarf_lex.l"
+{return LI;}
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
 #line 66 "gwarf_lex.l"
+{return RI;}
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 68 "gwarf_lex.l"
+{BEGIN COMMENT;}
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 69 "gwarf_lex.l"
+{BEGIN STRING_TEXT;}
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 70 "gwarf_lex.l"
+{BEGIN STRING_TEXT;}
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 71 "gwarf_lex.l"
 {
     yylval.double_value = atof(yytext);
     return NUMBER;
     }
 	YY_BREAK
-case 43:
+case 48:
 YY_RULE_SETUP
-#line 70 "gwarf_lex.l"
+#line 75 "gwarf_lex.l"
 {
     yylval.double_value = atof(yytext);
     return INT;
     }
 	YY_BREAK
-case 44:
+case 49:
 YY_RULE_SETUP
-#line 74 "gwarf_lex.l"
+#line 79 "gwarf_lex.l"
 {
     yylval.string_value = yytext;
     return VAR;
     }
 	YY_BREAK
-case 45:
-/* rule 45 can match eol */
+case 50:
+/* rule 50 can match eol */
 YY_RULE_SETUP
-#line 78 "gwarf_lex.l"
+#line 83 "gwarf_lex.l"
 {return STOPN;}
 	YY_BREAK
-case 46:
+case 51:
 YY_RULE_SETUP
-#line 79 "gwarf_lex.l"
+#line 84 "gwarf_lex.l"
 {return STOPF;}
 	YY_BREAK
-case 47:
+case 52:
 YY_RULE_SETUP
-#line 80 "gwarf_lex.l"
+#line 85 "gwarf_lex.l"
 ;
 	YY_BREAK
-case 48:
+case 53:
 YY_RULE_SETUP
-#line 81 "gwarf_lex.l"
+#line 86 "gwarf_lex.l"
 {printf("other text = [%s];\n", yytext);}
 	YY_BREAK
-case 49:
-/* rule 49 can match eol */
+case 54:
+/* rule 54 can match eol */
 YY_RULE_SETUP
-#line 83 "gwarf_lex.l"
+#line 88 "gwarf_lex.l"
 {BEGIN INITIAL;}
 	YY_BREAK
-case 50:
+case 55:
 YY_RULE_SETUP
-#line 84 "gwarf_lex.l"
+#line 89 "gwarf_lex.l"
 {BEGIN INITIAL;}
 	YY_BREAK
-case 51:
+case 56:
 YY_RULE_SETUP
-#line 85 "gwarf_lex.l"
+#line 90 "gwarf_lex.l"
 ;
 	YY_BREAK
-case 52:
+case 57:
 YY_RULE_SETUP
-#line 87 "gwarf_lex.l"
+#line 92 "gwarf_lex.l"
 {BEGIN INITIAL;}
 	YY_BREAK
-case 53:
+case 58:
 YY_RULE_SETUP
-#line 88 "gwarf_lex.l"
+#line 93 "gwarf_lex.l"
 {BEGIN INITIAL;}
 	YY_BREAK
-case 54:
-/* rule 54 can match eol */
+case 59:
+/* rule 59 can match eol */
 YY_RULE_SETUP
-#line 89 "gwarf_lex.l"
+#line 94 "gwarf_lex.l"
 {
     yylval.string_value = yytext;
     return STRING;
     }
 	YY_BREAK
-case 55:
+case 60:
 YY_RULE_SETUP
-#line 93 "gwarf_lex.l"
+#line 98 "gwarf_lex.l"
 {
     yylval.string_value = yytext;
     return STRING;
     }
 	YY_BREAK
-case 56:
+case 61:
 YY_RULE_SETUP
-#line 97 "gwarf_lex.l"
+#line 102 "gwarf_lex.l"
 ECHO;
 	YY_BREAK
-#line 1142 "lex.yy.c"
+#line 1172 "lex.yy.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
 case YY_STATE_EOF(STRING_TEXT):
@@ -1440,7 +1470,7 @@ static int yy_get_next_buffer (void)
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 149 )
+			if ( yy_current_state >= 159 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1468,11 +1498,11 @@ static int yy_get_next_buffer (void)
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 149 )
+		if ( yy_current_state >= 159 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 148);
+	yy_is_jam = (yy_current_state == 158);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2150,7 +2180,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 97 "gwarf_lex.l"
+#line 102 "gwarf_lex.l"
 
 int yywrap(void) {
     return 1;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 350 - 277
paser/y.tab.c


+ 57 - 53
paser/y.tab.h

@@ -66,32 +66,34 @@ extern int yydebug;
     LP = 272,
     WHILE = 273,
     POW = 274,
-    EQUAL = 275,
-    MOREEQ = 276,
-    LESSEQ = 277,
-    NOTEQ = 278,
-    BREAK = 279,
-    IF = 280,
-    ELSE = 281,
-    ELIF = 282,
-    BROKEN = 283,
-    CONTINUE = 284,
-    CONTINUED = 285,
-    RESTART = 286,
-    RESTARTED = 287,
-    REGO = 288,
-    REWENT = 289,
-    RI = 290,
-    LI = 291,
-    DEFAULT = 292,
-    FOR = 293,
-    COMMA = 294,
-    GLOBAL = 295,
-    NONLOCAL = 296,
-    INDENTA = 297,
-    STOPN = 298,
-    STOPF = 299,
-    BLOCK = 300
+    LOG = 275,
+    SQRT = 276,
+    EQUAL = 277,
+    MOREEQ = 278,
+    LESSEQ = 279,
+    NOTEQ = 280,
+    BREAK = 281,
+    IF = 282,
+    ELSE = 283,
+    ELIF = 284,
+    BROKEN = 285,
+    CONTINUE = 286,
+    CONTINUED = 287,
+    RESTART = 288,
+    RESTARTED = 289,
+    REGO = 290,
+    REWENT = 291,
+    RI = 292,
+    LI = 293,
+    DEFAULT = 294,
+    FOR = 295,
+    COMMA = 296,
+    GLOBAL = 297,
+    NONLOCAL = 298,
+    INDENTA = 299,
+    STOPN = 300,
+    STOPF = 301,
+    BLOCK = 302
   };
 #endif
 /* Tokens.  */
@@ -112,32 +114,34 @@ extern int yydebug;
 #define LP 272
 #define WHILE 273
 #define POW 274
-#define EQUAL 275
-#define MOREEQ 276
-#define LESSEQ 277
-#define NOTEQ 278
-#define BREAK 279
-#define IF 280
-#define ELSE 281
-#define ELIF 282
-#define BROKEN 283
-#define CONTINUE 284
-#define CONTINUED 285
-#define RESTART 286
-#define RESTARTED 287
-#define REGO 288
-#define REWENT 289
-#define RI 290
-#define LI 291
-#define DEFAULT 292
-#define FOR 293
-#define COMMA 294
-#define GLOBAL 295
-#define NONLOCAL 296
-#define INDENTA 297
-#define STOPN 298
-#define STOPF 299
-#define BLOCK 300
+#define LOG 275
+#define SQRT 276
+#define EQUAL 277
+#define MOREEQ 278
+#define LESSEQ 279
+#define NOTEQ 280
+#define BREAK 281
+#define IF 282
+#define ELSE 283
+#define ELIF 284
+#define BROKEN 285
+#define CONTINUE 286
+#define CONTINUED 287
+#define RESTART 288
+#define RESTARTED 289
+#define REGO 290
+#define REWENT 291
+#define RI 292
+#define LI 293
+#define DEFAULT 294
+#define FOR 295
+#define COMMA 296
+#define GLOBAL 297
+#define NONLOCAL 298
+#define INDENTA 299
+#define STOPN 300
+#define STOPF 301
+#define BLOCK 302
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -151,7 +155,7 @@ union YYSTYPE
     struct statement *statement_value;
     struct if_list *if_list_base;
 
-#line 155 "y.tab.h"
+#line 159 "y.tab.h"
 
 };
 typedef union YYSTYPE YYSTYPE;

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно