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

fix: 赋值表达式从左到右执行

setOperationFromToken添加is_right参数, 声明是否表达式从左往右执行
 *)正常的非is_right表达式中, st, left和right的关系如下:
    [st]
    /  \
    | [right]
    |   /  \
    |   | [right.right]
    | [right.left]
  [left]
   /  \
   |  [left.right]
 [left.left]
 *) 若是is_right语句, 则为:
    [left]
    /  \
    |   [st]
    |   /  \
    |   | [right]
    | [left.right]
 [left.left]
SongZihuan 4 жил өмнө
parent
commit
30e816dcef

+ 3 - 1
include/__grammar.h

@@ -38,7 +38,9 @@ void parserCallBack(PASERSSIGNATURE);
 void parserFactor(PASERSSIGNATURE);
 void parserAssignment(PASERSSIGNATURE);
 void parserTuple(PASERSSIGNATURE);
-void twoOperation(PASERSSIGNATURE, void (*callBack)(PASERSSIGNATURE), int (*getSymbol)(PASERSSIGNATURE, int symbol, Statement **st), int, int, char *, char *);
+void twoOperation(ParserMessage *pm, Inter *inter, void (*callBack)(ParserMessage *, Inter *),
+                  int (*getSymbol)(ParserMessage *, Inter *, int, Statement **), int type, int self_type,
+                  char *call_name, char *self_name, bool is_right);
 void tailOperation(PASERSSIGNATURE, void (*callBack)(PASERSSIGNATURE), int (*tailFunction)(PASERSSIGNATURE, Token *left_token,  Statement **st), int , int , char *, char *);
 
 void syntaxError(ParserMessage *pm, int status, int num, ...);

+ 1 - 1
include/statement.h

@@ -129,7 +129,7 @@ typedef struct StatementList{
 
 Statement *makeStatement();
 Statement *makeOperationStatement(int type);
-struct Token *setOperationFromToken(Statement *st, struct Token *left, struct Token *right, int type);
+struct Token *setOperationFromToken(Statement **st_ad, struct Token *left, struct Token *right, int type, bool is_right);
 
 Statement *makeTupleStatement(struct Parameter *pt, int type);
 Statement *makeFunctionStatement(Statement *name, Statement *function, struct Parameter *pt);

+ 0 - 1
main.c

@@ -119,5 +119,4 @@ void freeArgs(){
 
 /*
  *  TODO-szh 列表、字典
- *  TODO-szh 赋值语句从右执行到左边
  */

+ 7 - 3
parser/__grammar.c

@@ -1,6 +1,9 @@
 #include "__grammar.h"
 
-inline void twoOperation(PASERSSIGNATURE, void (*callBack)(PASERSSIGNATURE), int (*getSymbol)(PASERSSIGNATURE, int , Statement **), int type, int self_type, char *call_name, char *self_name){
+inline void twoOperation(ParserMessage *pm, Inter *inter, void (*callBack)(ParserMessage *, Inter *),
+                         int (*getSymbol)(ParserMessage *, Inter *, int, Statement **), int type, int self_type,
+                         char *call_name, char *self_name, bool is_right) {
+    bool is_right_ = false;
     while(true){
         Token *left_token = NULL, *right_token = NULL;
         struct Statement *st = NULL;
@@ -41,9 +44,10 @@ inline void twoOperation(PASERSSIGNATURE, void (*callBack)(PASERSSIGNATURE), int
             goto return_;
         }
 
-        right_token= popAheadToken(pm);
-        addToken_(pm, setOperationFromToken(st, left_token, right_token, self_type));
+        right_token = popAheadToken(pm);
+        addToken_(pm, setOperationFromToken(&st, left_token, right_token, self_type, is_right_));
         writeLog_(pm->grammar_debug, GRAMMAR_DEBUG, "Polynomial: get base value(right) success[push polynomial]\n", NULL);
+        is_right_ = is_right;  // 第一次is_right不生效
     }
     return_:
     return;

+ 3 - 3
parser/grammar.c

@@ -615,7 +615,7 @@ bool switchAssignment(PASERSSIGNATURE, int symbol, Statement **st){
 }
 void parserAssignment(PASERSSIGNATURE){
     return twoOperation(CALLPASERSSIGNATURE, parserTuple, switchAssignment, TUPLE, ASSIGNMENT,
-                        "polynomial", "assignment");
+                        "polynomial", "assignment", true);
 }
 
 /**
@@ -672,7 +672,7 @@ bool switchPolynomial(PASERSSIGNATURE, int symbol, Statement **st){
 }
 void parserPolynomial(PASERSSIGNATURE){
     return twoOperation(CALLPASERSSIGNATURE, parserFactor, switchPolynomial, FACTOR, POLYNOMIAL,
-            "factor", "polynomial");
+                        "factor", "polynomial", false);
 }
 
 /**
@@ -697,7 +697,7 @@ bool switchFactor(PASERSSIGNATURE, int symbol, Statement **st){
 }
 void parserFactor(PASERSSIGNATURE){
     return twoOperation(CALLPASERSSIGNATURE, parserCallBack, switchFactor, CALLBACK, FACTOR,
-                        "call back", "factor");
+                        "call back", "factor", false);
 }
 
 int tailCall(PASERSSIGNATURE, Token *left_token, Statement **st){

+ 14 - 3
src/statement.c

@@ -7,16 +7,27 @@ Statement *makeStatement(){
     return tmp;
 }
 
-Token *setOperationFromToken(Statement *st, Token *left, Token *right, int type) {
+struct Token *setOperationFromToken(Statement **st_ad, struct Token *left, struct Token *right, int type, bool is_right) {
     Token *new_token = NULL;
-    st->u.operation.left = left->data.st;
-    st->u.operation.right = right->data.st;
+    Statement *st = *st_ad, *left_st = left->data.st;
+    if (is_right && left->data.st->type == operation && left_st->u.operation.OperationType == st->u.operation.OperationType){
+        st->u.operation.left = left_st->u.operation.right;
+        left_st->u.operation.right = st;
+        st->u.operation.right = right->data.st;
+
+        st = left_st;  // left_st是主中心
+    }
+    else{
+        st->u.operation.left = left_st;
+        st->u.operation.right = right->data.st;
+    }
     new_token = makeToken();
     new_token->token_type = type;
     new_token->data.st = st;
 
     freeToken(left, true, false);
     freeToken(right, true, false);
+    *st_ad = st;
     return new_token;
 }