Răsfoiți Sursa

feat: 支持使用do语句

支持do开头的if和while语句
支持do while语句
SongZihuan 4 ani în urmă
părinte
comite
2c8da3db79
6 a modificat fișierele cu 79 adăugiri și 8 ștergeri
  1. 1 0
      include/token.h
  2. 0 4
      main.c
  3. 65 1
      parser/grammar.c
  4. 1 0
      parser/include/__grammar.h
  5. 0 1
      src/parameter.c
  6. 12 2
      src/runbranch.c

+ 1 - 0
include/token.h

@@ -117,6 +117,7 @@
 #define IMPORT -27
 #define VARCONTROL -28
 #define ASSERT -29
+#define DO_BRANCH -30
 
 #define printTokenEnter(tk, debug, type, message) do{ \
 writeLog(debug, type, message, NULL); \

+ 0 - 4
main.c

@@ -21,13 +21,9 @@ int main(int argc, char *argv[]) {
 
 
 /** TODO-szh List
- * f(x) = x * 2 表达式
- * 合适形参检查
  * 装饰器
  * 官方函数
  * 官方类
- * do 语句
- * do...while语句
  * for 循环
  * with as 语句
  * goto 语句

+ 65 - 1
parser/grammar.c

@@ -99,6 +99,9 @@ void parserCommand(PASERSSIGNATURE){
         case MATHER_DEF :
             status = commandCallBack_(CALLPASERSSIGNATURE, parserDef, FUNCTION, &st, "Command: call def/class\n");
             break;
+        case MATHER_DO :
+            status = commandCallBack_(CALLPASERSSIGNATURE, parserDo, DO_BRANCH, &st, "Command: call do\n");
+            break;
         case MATHER_IF :
             status = commandCallBack_(CALLPASERSSIGNATURE, parserIf, IF_BRANCH, &st, "Command: call if\n");
             break;
@@ -221,7 +224,6 @@ void parserImport(PASERSSIGNATURE) {
             goto return_;
         }
 
-
         mul_:
         st = makeFromImportStatement(opt, as, pt);
     }
@@ -285,6 +287,68 @@ void parserControl(PASERSSIGNATURE, MakeControlFunction callBack, int type, bool
     return;
 }
 
+void parserDo(PASERSSIGNATURE){
+    Statement *st = NULL;
+    Statement *do_code = NULL;
+    long int line = delToken(pm);
+    if (readBackToken(pm) == MATHER_WHILE){  // do...while语句
+        if (!callChildStatement(CALLPASERSSIGNATURE, parserWhile, WHILE_BRANCH, &st, "Don't get a while code"))
+            goto error_;
+        st->u.while_branch.type = do_while_;
+    }
+    else {
+        if (!callParserCode(CALLPASERSSIGNATURE, &do_code, "Don't get a if...else code", line))
+            goto error_;
+
+        again:
+        switch (readBackToken(pm)){
+            case MATHER_IF: {
+                StatementList *do_sl = NULL;
+                if (!callChildStatement(CALLPASERSSIGNATURE, parserIf, IF_BRANCH, &st, "Don't get a if code after do"))
+                    goto error_;
+                do_sl = makeStatementList(NULL, NULL, do_code, do_b);
+                do_sl->next = st->u.if_branch.if_list;
+                st->u.if_branch.if_list = do_sl;
+                break;
+            }
+            case MATHER_WHILE:
+                if (!callChildStatement(CALLPASERSSIGNATURE, parserWhile, WHILE_BRANCH, &st, "Don't get a if code after do"))
+                    goto error_;
+                st->u.while_branch.first = do_code;
+                break;
+            case MATHER_DO: {
+                long int tmp_line = delToken(pm);
+                if (readBackToken(pm) != MATHER_WHILE){
+                    syntaxError(pm, syntax_error, tmp_line, 1, "Don't get while after do");
+                    goto error_;
+                }
+                if (!callChildStatement(CALLPASERSSIGNATURE, parserWhile, WHILE_BRANCH, &st, "Don't get a while code"))
+                    goto error_;
+                st->u.while_branch.type = do_while_;
+                st->u.while_branch.first = do_code;
+                break;
+            }
+            case MATHER_ENTER:
+                delToken(pm);
+                goto again;
+            default: {
+                Token *tmp = popNewToken(pm->tm);
+                syntaxError(pm, syntax_error, tmp->line, 1, "Get don't support branch after do");
+                backToken_(pm, tmp);
+                goto error_;
+            }
+        }
+    }
+
+    addStatementToken(DO_BRANCH, st, pm);
+    return;
+
+    error_:
+    freeStatement(do_code);
+    freeStatement(st);
+    return;
+}
+
 /**
  * 条件分支匹配
  * parserIf:

+ 1 - 0
parser/include/__grammar.h

@@ -21,6 +21,7 @@ typedef int (*TailFunction)(PASERSSIGNATURE, Token *, Statement **);
 void parserCommand(PASERSSIGNATURE);
 void parserControl(PASERSSIGNATURE, MakeControlFunction callBack, int type, bool must_operation, char *message);
 void parserDef(PASERSSIGNATURE);
+void parserDo(PASERSSIGNATURE);
 void parserIf(PASERSSIGNATURE);
 void parserWhile(PASERSSIGNATURE);
 void parserTry(PASERSSIGNATURE);

+ 0 - 1
src/parameter.c

@@ -592,7 +592,6 @@ FatherValue *setFatherCore(FatherValue *father_tmp) {
     return base_father;
 }
 
-
 bool checkFormal(Parameter *pt) {
     enum {
         Formal_1,

+ 12 - 2
src/runbranch.c

@@ -33,7 +33,7 @@ ResultType ifBranch(INTER_FUNCTIONSIG) {
     setResultCore(&finally_tmp);
 
     var_list = pushVarList(var_list, inter);
-    for (; if_list != NULL; if_list = if_list->next){
+    for (PASS; if_list != NULL; if_list = if_list->next){
         freeResult(result);
         if (if_list->type == if_b){
             LinkValue *condition_value = NULL;
@@ -102,19 +102,28 @@ ResultType ifBranch(INTER_FUNCTIONSIG) {
 
 ResultType whileBranch(INTER_FUNCTIONSIG) {
     StatementList *while_list = st->u.while_branch.while_list;
+    Statement *first = st->u.while_branch.first;
     Statement *after = st->u.while_branch.after;
     Statement *else_st = st->u.while_branch.else_list;
     Statement *finally = st->u.while_branch.finally;
     bool set_result = true;
     bool is_break = false;
+    bool do_while = st->u.while_branch.type == do_while_;
 
     Result finally_tmp;
     setResultCore(result);
     setResultCore(&finally_tmp);
 
     var_list = pushVarList(var_list, inter);
+
+    if (first != NULL && cycleBranchSafeInterStatement(CALL_INTER_FUNCTIONSIG(first, var_list, result, father)))
+        set_result = false;
+    else
+        freeResult(result);
+
     while (!is_break){
         LinkValue *condition_value = NULL;
+        bool condition = false;
 
         freeResult(result);
         if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(while_list->condition, var_list, result, father))){
@@ -133,7 +142,8 @@ ResultType whileBranch(INTER_FUNCTIONSIG) {
             freeResult(result);  // 赋值的返回值被丢弃
         }
 
-        bool condition = checkBool(condition_value->value);
+        condition = do_while || checkBool(condition_value->value);
+        do_while = false;
         if (condition){
             if (cycleBranchSafeInterStatement(CALL_INTER_FUNCTIONSIG(while_list->code, var_list, result, father))){
                 set_result = false;