ソースを参照

更新了README.md

SongZihuan 5 年 前
コミット
99cd42167a
6 ファイル変更159 行追加10 行削除
  1. 6 1
      README.md
  2. 83 3
      inter/interpreter.c
  3. 9 4
      inter/interpreter.h
  4. 13 0
      paser/lexical.c
  5. 17 1
      paser/syntax.c
  6. 31 1
      paser/token.h

+ 6 - 1
README.md

@@ -67,5 +67,10 @@ return x n  函数返回值x,返回n层
 * 面向对象取出重复,``to_error``和``to_object``不用``find_var``,在global的时候就设定好
 * GWARF去全局化,减少使用全局变量有利于为后期的多线程模式做铺垫
 * 赋值语句会为``GWARF_value``的访问权限降低到``base``,除非是self=true(1)的模式。
+* ``<==`` 和 ``==>``为非短路逻辑运算:蕴含
+* ``<:=`` 和 ``=:>``为短路逻辑运算:蕴含
+* ``<=>`` 为逻辑运算:同或门
+* ``!==`` 为逻辑运算:异或门
+* ``and`` 和 ``or`` 为非短路逻辑运算符:与,或
 ## 关于GWARF
-最后更新时间 : 2020年05月05日 广州
+最后更新时间 : 2020年05月07日 广州

+ 83 - 3
inter/interpreter.c

@@ -433,10 +433,8 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 base_the_var.value.func_value->self->next = old_tmp;  // 恢复
             }
             else{  // 其他类型 均返回NULL
-                puts("[tag 8]");
                 goto the_break;
             }
-            puts("[tag 4]");
             if(is_error(&return_value)){  // Name Error错误
                 // puts("STOP:: Name No Found!");
                 goto the_break;
@@ -445,7 +443,6 @@ GWARF_result read_statement(statement *the_statement, var_list *the_var, var_lis
                 goto the_break;
             }
 
-            puts("[tag 9]");
             return_value.father = malloc(sizeof(return_value.father));  // 记录father的值
             *(return_value.father) = base_the_var;
 
@@ -1733,6 +1730,21 @@ GWARF_result operation_func(statement *the_statement, var_list *the_var, var_lis
         case APOW_func:
             value = assignment_statement_value(the_statement->code.operation.left_exp, the_var, login_var, to_object(pow_func(left_result, right_result, the_var, global_inter).value, global_inter), global_inter);
             break;
+        case ABITAND_func:
+            value = assignment_statement_value(the_statement->code.operation.left_exp, the_var, login_var, to_object(bit_and_func(left_result, right_result, the_var, global_inter).value, global_inter),global_inter);
+            break;
+        case ABITOR_func:
+            value = assignment_statement_value(the_statement->code.operation.left_exp, the_var, login_var, to_object(bit_or_func(left_result, right_result, the_var, global_inter).value, global_inter), global_inter);
+            break;
+        case ABITNOTOR_func:
+            value = assignment_statement_value(the_statement->code.operation.left_exp, the_var, login_var, to_object(bit_notor_func(left_result, right_result, the_var, global_inter).value, global_inter), global_inter);
+            break;
+        case ABITRIGHT_func:
+            value = assignment_statement_value(the_statement->code.operation.left_exp, the_var, login_var, to_object(bit_right_func(left_result, right_result, the_var, global_inter).value, global_inter), global_inter);
+            break;
+        case ABITLEFT_func:
+            value = assignment_statement_value(the_statement->code.operation.left_exp, the_var, login_var, to_object(bit_left_func(left_result, right_result, the_var, global_inter).value, global_inter), global_inter);
+            break;
         case LADD_func:  // a++
             right_result.u = statement_end;
             right_result.value.type = INT_value;
@@ -2566,6 +2578,28 @@ GWARF_result and_func(statement *left_statement, statement *right_statement, var
     return_back: return return_value;
 }
 
+// ---------  SBOOL
+// 1- and
+// 2- or
+// 3- not or(不能相等)
+// 4- is(相等)
+// 5- left ==> right
+// 6- left <== right
+GWARF_result sbool_func(statement *left_statement, statement *right_statement, var_list *the_var, int type, inter *global_inter){  // the func for add and call from read_statement_list
+    GWARF_result return_value, get;  // the result by call read_statement_list with left and right = GWARF_result_reset; value is the result for and
+    return_value.u = statement_end;
+    return_value.value.type = BOOL_value;
+
+    bool left = to_bool(traverse(left_statement, the_var, false, global_inter).value, global_inter), right = to_bool(traverse(right_statement, the_var, false, global_inter).value, global_inter);
+    if((left + right == 2 && type == 1) || (left + right >= 1 && type == 2) || (left != right && type == 3) || (left == right && type == 4)|| ((!left || right) && type == 5) || ((left || !right) && type == 4)){
+        return_value.value.value.bool_value = true;
+    }
+    else{
+        return_value.value.value.bool_value = false;
+    }
+    return_back: return return_value;
+}
+
 // ---------  OR
 GWARF_result or_func(statement *left_statement, statement *right_statement, var_list *the_var, inter *global_inter){  // the func for add and call from read_statement_list
     GWARF_result return_value, get;  // the result by call read_statement_list with left and right = GWARF_result_reset; value is the result for and
@@ -2588,6 +2622,52 @@ GWARF_result or_func(statement *left_statement, statement *right_statement, var_
     return_back: return return_value;
 }
 
+// ---------  SLEFT
+// left =:> right
+GWARF_result sleft_func(statement *left_statement, statement *right_statement, var_list *the_var, inter *global_inter){  // the func for add and call from read_statement_list
+    GWARF_result return_value, get;  // the result by call read_statement_list with left and right = GWARF_result_reset; value is the result for and
+    return_value.u = statement_end;
+    return_value.value.type = BOOL_value;
+
+    bool left = to_bool(traverse(left_statement, the_var, false, global_inter).value, global_inter), right;
+    if(left){
+        right = to_bool(traverse(right_statement, the_var, false, global_inter).value, global_inter);
+        if(right){
+            return_value.value.value.bool_value = true;
+        }
+        else{
+            return_value.value.value.bool_value = false;
+        }
+    }
+    else{
+        return_value.value.value.bool_value = true;
+    }
+    return_back: return return_value;
+}
+
+// ---------  SRIGHT
+// left <:= right
+GWARF_result sright_func(statement *left_statement, statement *right_statement, var_list *the_var, inter *global_inter){  // the func for add and call from read_statement_list
+    GWARF_result return_value, get;  // the result by call read_statement_list with left and right = GWARF_result_reset; value is the result for and
+    return_value.u = statement_end;
+    return_value.value.type = BOOL_value;
+
+    bool left = to_bool(traverse(left_statement, the_var, false, global_inter).value, global_inter), right;
+    if(left){
+        return_value.value.value.bool_value = true;
+    }
+    else{
+        right = to_bool(traverse(right_statement, the_var, false, global_inter).value, global_inter);
+        if(!right){
+            return_value.value.value.bool_value = true;
+        }
+        else{
+            return_value.value.value.bool_value = false;
+        }
+    }
+    return_back: return return_value;
+}
+
 // ---------  NOT
 GWARF_result not_func(GWARF_result right_result, var_list *the_var, inter *global_inter){  // the func for add and call from read_statement_list
     GWARF_result return_value, get;  // the result by call read_statement_list with left and right = GWARF_result_reset; value is the result for and

+ 9 - 4
inter/interpreter.h

@@ -161,9 +161,9 @@ typedef struct statement{
                 LOG_func,  // <>
                 SQRT_func,  // <>
                 NEGATIVE_func,  // -a
-                AND_func,  // -a
-                OR_func,  // -a
-                NOT_func,  // -a
+                AND_func,  // &&
+                OR_func,  // ||
+                NOT_func,  // !
                 MOD_func,  // %
                 INTDIV_func,  // //
                 AADD_func,  // +=
@@ -172,11 +172,16 @@ typedef struct statement{
                 AMUL_func,  // *=
                 AMOD_func,  // %=
                 AINTDIV_func,  // //=
+                APOW_func,  // **=
+                ABITAND_func,  // &=
+                ABITOR_func,  // |=
+                ABITNOTOR_func, // ^=
+                ABITRIGHT_func,  // >>=
+                ABITLEFT_func,  // <<=
                 FADD_func,  // a++
                 LADD_func,  // ++a
                 FSUB_func,  // a--
                 LSUB_func,  // --a
-                APOW_func,  // ^=
                 BITAND_func,
                 BITOR_func,
                 BITNOTOR_func,

+ 13 - 0
paser/lexical.c

@@ -106,8 +106,21 @@ int paser(int *index, p_status *status){
         match_text_s(p, global_paser[AINTDIV_PASER], "//=");
         match_text_s(p, global_paser[AMOD_PASER], "%=");
         match_text_s(p, global_paser[APOW_PASER], "**=");
+        match_text_s(p, global_paser[ABITAND_PASER], "&=");
+        match_text_s(p, global_paser[ABITOR_PASER], "|=");
+        match_text_s(p, global_paser[ABITNOTOR_PASER], "^=");
+        match_text_s(p, global_paser[ALEFT_PASER], "<<=");
+        match_text_s(p, global_paser[ARIGHT_PASER], ">>=");
         match_text_s(p, global_paser[FADD_PASER], "++");
         match_text_s(p, global_paser[FSUB_PASER], "--");
+        match_text_s(p, global_paser[ISLEFT_PASER], "<==");
+        match_text_s(p, global_paser[ISRIGHT_PASER], "==>");
+        match_text_s(p, global_paser[ILEFT_PASER], "<:=");
+        match_text_s(p, global_paser[IRIGHT_PASER], "=:>");
+        match_text_s(p, global_paser[BOOLNOTOR_PASER], "!==");
+        match_text_s(p, global_paser[BOOLIS_PASER], "<=>");
+        match_text_s(p, global_paser[BOOLSAND_PASER], "and");
+        match_text_s(p, global_paser[BOOLSOR_PASER], "or");
         match_text(p, global_paser[MOD_PASER], "%");
         match_text(p, global_paser[LB_PASER], "(");
         match_text(p, global_paser[RB_PASER], ")");

+ 17 - 1
paser/syntax.c

@@ -1266,7 +1266,8 @@ void eq_number(p_status *status, token_node *list){  // 因试分解
         get_pop_token(status, list, symbol);
 
         if((symbol.type == EQ_PASER && !status->not_match_eq) || symbol.type == AADD_PASER || symbol.type == ASUB_PASER || symbol.type == AMUL_PASER || symbol.type == ADIV_PASER|| 
-            symbol.type == AMOD_PASER || symbol.type == AINTDIV_PASER || symbol.type == APOW_PASER){  // 模式2/3
+            symbol.type == AMOD_PASER || symbol.type == AINTDIV_PASER || symbol.type == APOW_PASER || symbol.type == ABITAND_PASER || symbol.type == ABITOR_PASER || symbol.type == ABITNOTOR_PASER || 
+            symbol.type == ALEFT_PASER || symbol.type == ARIGHT_PASER){  // 模式2/3
             get_right_token(status, list, hide_list, right);  // 回调右边
             if(right.type != NON_hide_list){
                 paser_error("Don't get a hide_list");
@@ -1303,6 +1304,21 @@ void eq_number(p_status *status, token_node *list){  // 因试分解
             case APOW_PASER:
                 code_tmp->code.operation.type = APOW_func;
                 break;
+            case ABITAND_PASER:
+                code_tmp->code.operation.type = ABITAND_func;
+                break;
+            case ABITOR_PASER:
+                code_tmp->code.operation.type = ABITOR_func;
+                break;
+            case ABITNOTOR_PASER:
+                code_tmp->code.operation.type = ABITNOTOR_func;
+                break;
+            case ALEFT_PASER:
+                code_tmp->code.operation.type = ABITLEFT_func;
+                break;
+            case ARIGHT_PASER:
+                code_tmp->code.operation.type = ABITRIGHT_func;
+                break;
             }
             code_tmp->code.operation.left_exp = left.data.statement_value;
             code_tmp->code.operation.right_exp = right.data.statement_value;

+ 31 - 1
paser/token.h

@@ -3,7 +3,7 @@
 
 #include "../inter/interpreter.h"
 
-#define MAX_PASER_SIZE 93
+#define MAX_PASER_SIZE 106
 #define INT_PASER 0
 #define DOUBLE_PASER 1
 #define ENTER_PASER 2
@@ -97,6 +97,19 @@
 #define PROTECT_PASER 90
 #define PUBLIC_PASER 91
 #define PRIVATE_PASER 92
+#define ABITAND_PASER 93
+#define ABITOR_PASER 94
+#define ABITNOTOR_PASER 95
+#define ALEFT_PASER 96
+#define ARIGHT_PASER 97
+#define ILEFT_PASER 98
+#define IRIGHT_PASER 99
+#define ISLEFT_PASER 100
+#define ISRIGHT_PASER 101
+#define BOOLNOTOR_PASER 102
+#define BOOLIS_PASER 103
+#define BOOLSAND_PASER 104
+#define BOOLSOR_PASER 105
 
 // 获取并返回一个token
 #define get_pop_token(status,list,new_token) \
@@ -234,6 +247,23 @@ typedef enum token_type
     CLS = CLS_PASER,
     ACTION = ACTION_PASER,
     SETUP = SETUP_PASER,
+    INLINE = INLINE_PASER,
+    PROTECT = PROTECT_PASER,
+    PUBLIC = PUBLIC_PASER,
+    PRIVATE = PRIVATE_PASER,
+    ABITAND = ABITAND_PASER,
+    ABITOR = ABITOR_PASER,
+    ABITNOTOR = ABITNOTOR_PASER,
+    ALEFT = ALEFT_PASER,
+    ARIGHT = ARIGHT_PASER,
+    ILEFT = ILEFT_PASER,
+    IRIGHT = IRIGHT_PASER,
+    ISLEFT = ISLEFT_PASER,
+    ISRIGHT = ISRIGHT_PASER,
+    BOOLNOTOR = BOOLNOTOR_PASER,
+    BOOLIS = BOOLIS_PASER,
+    BOOLSAND = BOOLSAND_PASER,
+    BOOLSOR = BOOLSOR_PASER,
 
     // 特殊符号
     BAD_token = -2,