Pārlūkot izejas kodu

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

SongZihuan 5 gadi atpakaļ
vecāks
revīzija
e73d401509
9 mainītis faili ar 962 papildinājumiem un 562 dzēšanām
  1. 2 1
      .vscode/settings.json
  2. BIN
      gwarf
  3. 4 0
      gwarf_interpreter/interprete.h
  4. 261 43
      gwarf_interpreter/interpreter.c
  5. 5 0
      paser/gwarf_lex.l
  6. 94 29
      paser/gwarf_yacc.y
  7. 189 159
      paser/lex.yy.c
  8. 350 277
      paser/y.tab.c
  9. 57 53
      paser/y.tab.h

+ 2 - 1
.vscode/settings.json

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

BIN
gwarf


+ 4 - 0
gwarf_interpreter/interprete.h

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

+ 261 - 43
gwarf_interpreter/interpreter.c

@@ -1,7 +1,7 @@
 #include <stdio.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdlib.h>
-// #include "interprete.h"
 #include "../paser/y.tab.c"
 #include "../paser/y.tab.c"
+#include <math.h>
 
 
 // running code
 // running code
 GWARF_result while_func(statement *, var_list *);
 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 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 *);
 GWARF_result div_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 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 if_func(if_list *, var_list *);
 GWARF_result for_func(statement *, var_list *);
 GWARF_result for_func(statement *, var_list *);
+GWARF_result negative_func(GWARF_result, var_list *);
 int get_var_list_len(var_list *);
 int get_var_list_len(var_list *);
 GWARF_result block_func(statement *, 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 func
 
 
 var *make_var(){  // make var with base
 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:  // 表达式运算
         case operation:  // 表达式运算
             puts("----code----");
             puts("----code----");
             return_value = operation_func(the_statement, the_var);
             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);
                 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);
                 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----");
             puts("----stop code----");
             break;
             break;
         case while_cycle:
         case while_cycle:
@@ -363,12 +381,15 @@ GWARF_result read_statement_list(statement *the_statement, var_list *the_var){
             break;
             break;
         case base_value:  // get value[所有字面量均为这个表达式]
         case base_value:  // get value[所有字面量均为这个表达式]
             return_value.value = (the_statement->code).base_value.value;  // code
             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);
                 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);
                 printf("get value = %f\n", return_value.value.value.double_value);
             }
             }
+            else{
+                printf("get value = %s\n", return_value.value.value.string);
+            }
             break;
             break;
         case base_var:{    // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
         case base_var:{    // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
             int from = 0;
             int from = 0;
@@ -385,12 +406,15 @@ GWARF_result read_statement_list(statement *the_statement, var_list *the_var){
             else
             else
             {
             {
                 return_value.value = tmp->value;  // get_var
                 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);
                     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);
                     printf("var value = %f\n", return_value.value.value.double_value);
                 }
                 }
+                else{
+                    printf("var value = %s\n", return_value.value.value.string);
+                }
             }
             }
             break;
             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 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;
     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);
     right_result = traverse((*the_statement).code.operation.right_exp, the_var, false);
-    switch (the_statement->code.operation.type)  // 获取运算类型
+    switch (func_type)  // 获取运算类型
     {
     {
         case ADD_func:
         case ADD_func:
             value = add_func(left_result, right_result, the_var);
             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:
         case DIV_func:
             value = div_func(left_result, right_result, the_var);
             value = div_func(left_result, right_result, the_var);
             break;
             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;
         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
             char *left = (the_statement->code.operation.left_exp)->code.base_var.var_name;  // get var name but not value
             int from = 0;
             int from = 0;
@@ -886,6 +915,15 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var){  // re
         case NOTEQ_func:
         case NOTEQ_func:
             value = equal_func(left_result, right_result, the_var, 5);
             value = equal_func(left_result, right_result, the_var, 5);
             break;
             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:
         default:
             break;
             break;
     }
     }
@@ -896,25 +934,34 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var){  // re
 // ---------  ADD
 // ---------  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 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
     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.u = return_def;
         return_value.value.type = INT_value;
         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
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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;
     return return_value;
 }
 }
@@ -922,25 +969,52 @@ GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  SUB
 // ---------  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 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
     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.u = return_def;
         return_value.value.type = INT_value;
         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
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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;
     return return_value;
 }
 }
@@ -948,25 +1022,84 @@ GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  MUL
 // ---------  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 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
     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.u = return_def;
         return_value.value.type = INT_value;
         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
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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;
     return return_value;
 }
 }
@@ -974,25 +1107,103 @@ GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_l
 // ---------  DIV
 // ---------  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 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
     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.u = return_def;
         return_value.value.type = INT_value;
         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
     else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){  // all is NUMBER
         return_value.u = return_def;
         return_value.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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.u = return_def;
         return_value.value.type = NUMBER_value;
         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;
     return return_value;
 }
 }
@@ -1008,7 +1219,7 @@ GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var
     GWARF_result return_value;
     GWARF_result return_value;
     int return_bool = 1;
     int return_bool = 1;
     return_value.u = return_def;
     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;
         return_value.value.type = INT_value;
         if ((left_result.value.value.int_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
         if ((left_result.value.value.int_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
             return_bool = true;  // 返回1 否则(默认)为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
             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;
         return_value.value.type = INT_value;
         if ((left_result.value.value.double_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
         if ((left_result.value.value.double_value == right_result.value.value.int_value) && (type == 0)){  // 如果相等
             return_bool = true;  // 返回1 否则(默认)为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
             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;
         return_value.value.type = INT_value;
         if ((left_result.value.value.int_value == right_result.value.value.double_value) && (type == 0)){  // 如果相等
         if ((left_result.value.value.int_value == right_result.value.value.double_value) && (type == 0)){  // 如果相等
             return_bool = true;  // 返回1 否则(默认)为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_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;
     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
 GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){  // traverse the statement
     statement *tmp = the_statement;
     statement *tmp = the_statement;
     GWARF_result result, result2;
     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;
     bool lock = false;
     if(new){  // need to make new var
     if(new){  // need to make new var
         printf("----address = %d----\n", the_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
     if(new){  // need to make new var
         the_var = free_var_list(the_var);  // free the 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]
 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 LESS;}
 <INITIAL>"==" {return EQUAL;}
 <INITIAL>"==" {return EQUAL;}
 <INITIAL>"=" {return EQ;}
 <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 ADD;}
 <INITIAL>"-" {return SUB;}
 <INITIAL>"-" {return SUB;}
 <INITIAL>"*" {return MUL;}
 <INITIAL>"*" {return MUL;}

+ 94 - 29
paser/gwarf_yacc.y

@@ -16,9 +16,10 @@
 }
 }
 %token <double_value> NUMBER INT
 %token <double_value> NUMBER INT
 %token <string_value> STRING VAR
 %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 <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
 %type <if_list_base> elif_exp
 %%
 %%
 command_block
 command_block
@@ -217,8 +218,8 @@ second_number
     ;
     ;
 
 
 first_number
 first_number
-    : element
-    | first_number MUL element
+    : zero_number
+    | first_number MUL zero_number
     {
     {
         statement *code_tmp =  make_statement();
         statement *code_tmp =  make_statement();
         code_tmp->type = operation;
         code_tmp->type = operation;
@@ -227,7 +228,7 @@ first_number
         code_tmp->code.operation.right_exp = $3;
         code_tmp->code.operation.right_exp = $3;
         $$ = code_tmp;
         $$ = code_tmp;
     }
     }
-    | first_number DIV element
+    | first_number DIV zero_number
     {
     {
         statement *code_tmp =  make_statement();
         statement *code_tmp =  make_statement();
         code_tmp->type = operation;
         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
 element
-    : base_number
+    : base_value
     | base_var_
     | 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
     | LB top_exp RB
     {
     {
         $$ = $2;
         $$ = $2;
     }
     }
     ;
     ;
 
 
-base_number
+base_value
     : NUMBER
     : NUMBER
     {
     {
         statement *code_tmp =  make_statement();
         statement *code_tmp =  make_statement();
@@ -264,6 +305,52 @@ base_number
         code_tmp->code.base_value.value.value.int_value = (int)$1;
         code_tmp->code.base_value.value.value.int_value = (int)$1;
         $$ = code_tmp;
         $$ = 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
 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_block
     : if_exp 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_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
 	(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,
 /* This struct is not used in this scanner,
    but its presence is necessary. */
    but its presence is necessary. */
 struct yy_trans_info
 struct yy_trans_info
@@ -360,24 +360,25 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	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,    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] =
 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,
        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,
        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,
         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
         1,    1,    1,    1,    1
     } ;
     } ;
 
 
-static const YY_CHAR yy_meta[45] =
+static const YY_CHAR yy_meta[48] =
     {   0,
     {   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,    2,    2,    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,    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,
-        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,
     {   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,
     {   0,
        10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
        10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
        20,   21,   22,   10,   23,   24,   25,   26,   27,   28,
        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,
     {   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,    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;
 static yy_state_type yy_last_accepting_state;
@@ -544,9 +549,9 @@ char *yytext;
     int flat = 0;
     int flat = 0;
     int is_last = 0;  // 是否\n
     int is_last = 0;  // 是否\n
     int is_stop = 0;  // 针对}需要返回一个}的同时返回一个STOP
     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 INITIAL 0
 #define COMMENT 1
 #define COMMENT 1
@@ -771,7 +776,7 @@ YY_DECL
 	{
 	{
 #line 13 "gwarf_lex.l"
 #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 */
 	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 )
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				{
 				yy_current_state = (int) yy_def[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_c = yy_meta[yy_c];
 				}
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			++yy_cp;
 			}
 			}
-		while ( yy_base[yy_current_state] != 172 );
+		while ( yy_base[yy_current_state] != 181 );
 
 
 yy_find_action:
 yy_find_action:
 		yy_act = yy_accept[yy_current_state];
 		yy_act = yy_accept[yy_current_state];
@@ -1004,142 +1009,167 @@ YY_RULE_SETUP
 case 33:
 case 33:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 56 "gwarf_lex.l"
 #line 56 "gwarf_lex.l"
-{return ADD;}
+{return POW;}
 	YY_BREAK
 	YY_BREAK
 case 34:
 case 34:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 57 "gwarf_lex.l"
 #line 57 "gwarf_lex.l"
-{return SUB;}
+{return POW;}
 	YY_BREAK
 	YY_BREAK
 case 35:
 case 35:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 58 "gwarf_lex.l"
 #line 58 "gwarf_lex.l"
-{return MUL;}
+{return SQRT;}
 	YY_BREAK
 	YY_BREAK
 case 36:
 case 36:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 59 "gwarf_lex.l"
 #line 59 "gwarf_lex.l"
-{return DIV;}
+{return LOG;}
 	YY_BREAK
 	YY_BREAK
 case 37:
 case 37:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 60 "gwarf_lex.l"
 #line 60 "gwarf_lex.l"
-{return LI;}
+{return SQRT;}
 	YY_BREAK
 	YY_BREAK
 case 38:
 case 38:
 YY_RULE_SETUP
 YY_RULE_SETUP
 #line 61 "gwarf_lex.l"
 #line 61 "gwarf_lex.l"
-{return RI;}
+{return ADD;}
 	YY_BREAK
 	YY_BREAK
 case 39:
 case 39:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 63 "gwarf_lex.l"
-{BEGIN COMMENT;}
+#line 62 "gwarf_lex.l"
+{return SUB;}
 	YY_BREAK
 	YY_BREAK
 case 40:
 case 40:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 64 "gwarf_lex.l"
-{BEGIN STRING_TEXT;}
+#line 63 "gwarf_lex.l"
+{return MUL;}
 	YY_BREAK
 	YY_BREAK
 case 41:
 case 41:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 65 "gwarf_lex.l"
-{BEGIN STRING_TEXT;}
+#line 64 "gwarf_lex.l"
+{return DIV;}
 	YY_BREAK
 	YY_BREAK
 case 42:
 case 42:
 YY_RULE_SETUP
 YY_RULE_SETUP
+#line 65 "gwarf_lex.l"
+{return LI;}
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
 #line 66 "gwarf_lex.l"
 #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);
     yylval.double_value = atof(yytext);
     return NUMBER;
     return NUMBER;
     }
     }
 	YY_BREAK
 	YY_BREAK
-case 43:
+case 48:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 70 "gwarf_lex.l"
+#line 75 "gwarf_lex.l"
 {
 {
     yylval.double_value = atof(yytext);
     yylval.double_value = atof(yytext);
     return INT;
     return INT;
     }
     }
 	YY_BREAK
 	YY_BREAK
-case 44:
+case 49:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 74 "gwarf_lex.l"
+#line 79 "gwarf_lex.l"
 {
 {
     yylval.string_value = yytext;
     yylval.string_value = yytext;
     return VAR;
     return VAR;
     }
     }
 	YY_BREAK
 	YY_BREAK
-case 45:
-/* rule 45 can match eol */
+case 50:
+/* rule 50 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 78 "gwarf_lex.l"
+#line 83 "gwarf_lex.l"
 {return STOPN;}
 {return STOPN;}
 	YY_BREAK
 	YY_BREAK
-case 46:
+case 51:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 79 "gwarf_lex.l"
+#line 84 "gwarf_lex.l"
 {return STOPF;}
 {return STOPF;}
 	YY_BREAK
 	YY_BREAK
-case 47:
+case 52:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 80 "gwarf_lex.l"
+#line 85 "gwarf_lex.l"
 ;
 ;
 	YY_BREAK
 	YY_BREAK
-case 48:
+case 53:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 81 "gwarf_lex.l"
+#line 86 "gwarf_lex.l"
 {printf("other text = [%s];\n", yytext);}
 {printf("other text = [%s];\n", yytext);}
 	YY_BREAK
 	YY_BREAK
-case 49:
-/* rule 49 can match eol */
+case 54:
+/* rule 54 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 83 "gwarf_lex.l"
+#line 88 "gwarf_lex.l"
 {BEGIN INITIAL;}
 {BEGIN INITIAL;}
 	YY_BREAK
 	YY_BREAK
-case 50:
+case 55:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 84 "gwarf_lex.l"
+#line 89 "gwarf_lex.l"
 {BEGIN INITIAL;}
 {BEGIN INITIAL;}
 	YY_BREAK
 	YY_BREAK
-case 51:
+case 56:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 85 "gwarf_lex.l"
+#line 90 "gwarf_lex.l"
 ;
 ;
 	YY_BREAK
 	YY_BREAK
-case 52:
+case 57:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 87 "gwarf_lex.l"
+#line 92 "gwarf_lex.l"
 {BEGIN INITIAL;}
 {BEGIN INITIAL;}
 	YY_BREAK
 	YY_BREAK
-case 53:
+case 58:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 88 "gwarf_lex.l"
+#line 93 "gwarf_lex.l"
 {BEGIN INITIAL;}
 {BEGIN INITIAL;}
 	YY_BREAK
 	YY_BREAK
-case 54:
-/* rule 54 can match eol */
+case 59:
+/* rule 59 can match eol */
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 89 "gwarf_lex.l"
+#line 94 "gwarf_lex.l"
 {
 {
     yylval.string_value = yytext;
     yylval.string_value = yytext;
     return STRING;
     return STRING;
     }
     }
 	YY_BREAK
 	YY_BREAK
-case 55:
+case 60:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 93 "gwarf_lex.l"
+#line 98 "gwarf_lex.l"
 {
 {
     yylval.string_value = yytext;
     yylval.string_value = yytext;
     return STRING;
     return STRING;
     }
     }
 	YY_BREAK
 	YY_BREAK
-case 56:
+case 61:
 YY_RULE_SETUP
 YY_RULE_SETUP
-#line 97 "gwarf_lex.l"
+#line 102 "gwarf_lex.l"
 ECHO;
 ECHO;
 	YY_BREAK
 	YY_BREAK
-#line 1142 "lex.yy.c"
+#line 1172 "lex.yy.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
 case YY_STATE_EOF(COMMENT):
 case YY_STATE_EOF(STRING_TEXT):
 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 )
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			{
 			yy_current_state = (int) yy_def[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_c = yy_meta[yy_c];
 			}
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 )
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		{
 		yy_current_state = (int) yy_def[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_c = yy_meta[yy_c];
 		}
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + 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;
 		return yy_is_jam ? 0 : yy_current_state;
 }
 }
@@ -2150,7 +2180,7 @@ void yyfree (void * ptr )
 
 
 #define YYTABLES_NAME "yytables"
 #define YYTABLES_NAME "yytables"
 
 
-#line 97 "gwarf_lex.l"
+#line 102 "gwarf_lex.l"
 
 
 int yywrap(void) {
 int yywrap(void) {
     return 1;
     return 1;

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 350 - 277
paser/y.tab.c


+ 57 - 53
paser/y.tab.h

@@ -66,32 +66,34 @@ extern int yydebug;
     LP = 272,
     LP = 272,
     WHILE = 273,
     WHILE = 273,
     POW = 274,
     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
 #endif
 /* Tokens.  */
 /* Tokens.  */
@@ -112,32 +114,34 @@ extern int yydebug;
 #define LP 272
 #define LP 272
 #define WHILE 273
 #define WHILE 273
 #define POW 274
 #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.  */
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -151,7 +155,7 @@ union YYSTYPE
     struct statement *statement_value;
     struct statement *statement_value;
     struct if_list *if_list_base;
     struct if_list *if_list_base;
 
 
-#line 155 "y.tab.h"
+#line 159 "y.tab.h"
 
 
 };
 };
 typedef union YYSTYPE YYSTYPE;
 typedef union YYSTYPE YYSTYPE;

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels