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

feat: 加入assert断言语句

SongZihuan 4 жил өмнө
parent
commit
654cf83c13
9 өөрчлөгдсөн 72 нэмэгдсэн , 18 устгасан
  1. 1 0
      include/run.h
  2. 5 0
      include/statement.h
  3. 3 1
      include/token.h
  4. 14 7
      main.c
  5. 4 0
      parser/grammar.c
  6. 1 0
      parser/syntax.c
  7. 4 1
      src/run.c
  8. 27 9
      src/runbranch.c
  9. 13 0
      src/statement.c

+ 1 - 0
include/run.h

@@ -40,6 +40,7 @@ ResultType regoIf(INTER_FUNCTIONSIG);
 ResultType restartCode(INTER_FUNCTIONSIG);
 ResultType returnCode(INTER_FUNCTIONSIG);
 ResultType raiseCode(INTER_FUNCTIONSIG);
+ResultType assertCode(INTER_FUNCTIONSIG);
 
 ResultType includeFile(INTER_FUNCTIONSIG);
 ResultType importFile(INTER_FUNCTIONSIG);

+ 5 - 0
include/statement.h

@@ -32,6 +32,7 @@ struct Statement{
         import_file,
         from_import_file,
         default_var,
+        assert,
     } type;
     union StatementU{
         struct base_value{
@@ -156,6 +157,9 @@ struct Statement{
                 nonlocal_,
             } default_type;
         } default_var;
+        struct {
+            struct Statement *conditions;
+        } assert;
     }u;
     long int line;
     char *code_file;
@@ -204,6 +208,7 @@ Statement *makeRegoStatement(Statement *times, long int line, char *file);
 Statement *makeRestartStatement(Statement *times, long int line, char *file);
 Statement *makeReturnStatement(Statement *value, long int line, char *file);
 Statement *makeRaiseStatement(Statement *value, long int line, char *file);
+Statement *makeAssertStatement(Statement *conditions, long int line, char *file);
 Statement *makeIncludeStatement(Statement *file, long int line, char *file_dir);
 Statement *makeImportStatement(Statement *file, Statement *as);
 Statement *makeFromImportStatement(Statement *file, Parameter *as, Parameter *pt);

+ 3 - 1
include/token.h

@@ -87,8 +87,9 @@
 #define MATHER_LINK 73
 #define MATHER_RAISE 74
 #define MATHER_FROM 75
+#define MATHER_ASSERT 76
 
-#define MATHER_MAX 76
+#define MATHER_MAX 77
 
 // 从-6开始是为了避开status的特殊值,尽管这并没有什么影响
 #define COMMAND -6
@@ -114,6 +115,7 @@
 #define POINT -26
 #define IMPORT -27
 #define VARCONTROL -28
+#define ASSERT -29
 
 #define printTokenEnter(tk, debug, type, message) do{ \
 writeLog(debug, type, message, NULL); \

+ 14 - 7
main.c

@@ -20,10 +20,17 @@ int main(int argc, char *argv[]) {
 }
 
 
-/**
- * TODO-szh 断言
- * TODO-szh 代码块
- * TODO-szh 类super语句
- * TODO-szh 取反符号 -
- * TODO-szh 字面量后缀
- */
+/** TODO-szh List
+ * 断言
+ * 内嵌代码块
+ * 字面量后缀
+ * 官方函数
+ * 官方类
+ * do 语句
+ * do...while语句
+ * for 循环
+ * with as 语句
+ * goto 语句
+ * label 标签
+ * yield 语句
+ */

+ 4 - 0
parser/grammar.c

@@ -131,6 +131,10 @@ void parserCommand(PASERSSIGNATURE){
         case MATHER_RAISE :
             status = commandCallControl_(CALLPASERSSIGNATURE, makeRaiseStatement, RAISE, &st,
                                          "Command: call raise\n", false, NULL);
+        case MATHER_ASSERT :
+            status = commandCallControl_(CALLPASERSSIGNATURE, makeAssertStatement, ASSERT, &st,
+                                         "Command: call assert\n", true,
+                                         "parserAssert: Don't get conditions after assert");
             break;
         case MATHER_INCLUDE :
             status = commandCallControl_(CALLPASERSSIGNATURE, makeIncludeStatement, INCLUDE, &st,

+ 1 - 0
parser/syntax.c

@@ -246,6 +246,7 @@ int getMatherStatus(LexFile *file, LexMathers *mathers) {
         strMatherMacro(MATHER_LINK, "->");
         strMatherMacro(MATHER_RAISE, "raise");
         strMatherMacro(MATHER_FROM, "from");
+        strMatherMacro(MATHER_ASSERT, "assert");
 
         status = checkoutMather(mathers, MATHER_MAX);
     }

+ 4 - 1
src/run.c

@@ -79,12 +79,15 @@ ResultType runStatement(INTER_FUNCTIONSIG) {
         case default_var:
             type = setDefault(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
             break;
+        case assert:
+            type = assertCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
+            break;
         default:
             setResult(result, inter, father);
             break;
     }
 
-    if (result->value->aut == auto_aut)
+    if (run_continue_type(type) && result->value->aut == auto_aut)
         result->value->aut = st->aut;
     gc_run(inter, 1, 0, 0, var_list);
     return type;

+ 27 - 9
src/runbranch.c

@@ -1,10 +1,12 @@
 #include "__run.h"
 
-#define checkNumber(new_result) do{ \
-if (!isType(new_result->value->value, number)){ \
-setResultError(result, inter, "TypeException", "Don't get a number value", st, father, true); \
-return result->type; \
-}}while(0) /*该Macro只适用于控制分支*/
+bool checkNumber(INTER_FUNCTIONSIG){
+    if (!isType(result->value->value, number)) {
+        setResultError(result, inter, "TypeException", "Don't get a number value", st, father, true);
+        return false;
+    }
+    return true;
+}
 
 bool checkBool(Value *value){
     switch (value->type) {
@@ -245,7 +247,8 @@ ResultType breakCycle(INTER_FUNCTIONSIG){
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.break_cycle.times, var_list, result, father)))
         return result->type;
 
-    checkNumber(result);
+    if (checkNumber(CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
+        return result->type;
     times_int = (int)result->value->value->data.num.num;
     freeResult(result);
 
@@ -266,7 +269,8 @@ ResultType continueCycle(INTER_FUNCTIONSIG){
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.continue_cycle.times, var_list, result, father)))
         return result->type;
 
-    checkNumber(result);
+    if (checkNumber(CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
+        return result->type;
     times_int = (int)result->value->value->data.num.num;
     freeResult(result);
 
@@ -287,7 +291,8 @@ ResultType regoIf(INTER_FUNCTIONSIG){
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.rego_if.times, var_list, result, father)))
         return result->type;
 
-    checkNumber(result);
+    if (checkNumber(CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
+        return result->type;
     times_int = (int)result->value->value->data.num.num;
     freeResult(result);
 
@@ -308,7 +313,8 @@ ResultType restartCode(INTER_FUNCTIONSIG){
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.restart.times, var_list, result, father)))
         return result->type;
 
-    checkNumber(result);
+    if (checkNumber(CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
+        return result->type;
     times_int = (int)result->value->value->data.num.num;
     freeResult(result);
 
@@ -351,3 +357,15 @@ ResultType raiseCode(INTER_FUNCTIONSIG){
     result->error = connectError(makeError("RaiseException", "Exception was raise by user", st->line, st->code_file), result->error);
     return result->type;
 }
+
+ResultType assertCode(INTER_FUNCTIONSIG){
+    setResultCore(result);
+    if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.raise_code.value, var_list, result, father)))
+        return result->type;
+
+    if (checkBool(result->value->value))
+        setResult(result, inter, father);
+    else
+        setResultError(result, inter, "AssertException", "Raise by user", st, father, true);
+    return result->type;
+}

+ 13 - 0
src/statement.c

@@ -194,6 +194,13 @@ Statement *makeRaiseStatement(Statement *value, long int line, char *file){
     return tmp;
 }
 
+Statement *makeAssertStatement(Statement *conditions, long int line, char *file){
+    Statement *tmp = makeStatement(line, file);
+    tmp->type = assert;
+    tmp->u.assert.conditions = conditions;
+    return tmp;
+}
+
 Statement *makeIncludeStatement(Statement *file, long int line, char *file_dir){
     Statement *tmp = makeStatement(line, file_dir);
     tmp->type = include_file;
@@ -340,6 +347,9 @@ void freeStatement(Statement *st){
             case default_var:
                 freeParameter(st->u.default_var.var, true);
                 break;
+            case assert:
+                freeStatement(st->u.assert.conditions);
+                break;
             default:
                 break;
         }
@@ -471,6 +481,9 @@ Statement *copyStatementCore(Statement *st){
         case default_var:
             new->u.default_var.var = copyParameter(st->u.default_var.var);
             break;
+        case assert:
+            new->u.assert.conditions = copyStatement(st->u.assert.conditions);
+            break;
         default:
             break;
     }