Explorar o código

feat: 支持使用#定义注释

'#' 可定义一行注释直到行末,不包括换行
’##‘ 可以定义区间注释,区间内一起被忽略
'\' 和'#'效果相同,但包含换行
SongZihuan %!s(int64=4) %!d(string=hai) anos
pai
achega
e01f351ea0
Modificáronse 10 ficheiros con 116 adicións e 53 borrados
  1. 2 0
      include/inter.h
  2. 7 6
      include/lexical.h
  3. 2 0
      include/syntax.h
  4. 2 1
      include/token.h
  5. 0 2
      main.c
  6. 1 0
      parser/grammar.c
  7. 2 2
      parser/lexical.c
  8. 92 36
      parser/syntax.c
  9. 6 4
      src/inter.c
  10. 2 2
      src/runbranch.c

+ 2 - 0
include/inter.h

@@ -18,6 +18,8 @@ struct Inter{
         char *var_num_prefix;
         char *var_defualt;
         char *object_init;
+        char *object_enter;
+        char *object_exit;
     } data;
 };
 

+ 7 - 6
include/lexical.h

@@ -21,12 +21,13 @@ struct LexMather{
     char *second_str;
     enum LexMatherStatus{
         LEXMATHER_START=1,
-        LEXMATHER_ING,
-        LEXMATHER_INGPOINT,
-        LEXMATHER_INGSECOND,
-        LEXMATHER_INGPASS,
-        LEXMATHER_END,
-        LEXMATHER_END_SECOND,
+        LEXMATHER_ING_1,
+        LEXMATHER_ING_2,
+        LEXMATHER_ING_3,
+        LEXMATHER_ING_4,
+        LEXMATHER_ING_5,
+        LEXMATHER_END_1,
+        LEXMATHER_END_2,
         LEXMATHER_MISTAKE,
     } status;
 };

+ 2 - 0
include/syntax.h

@@ -10,5 +10,7 @@ void stringMather(int p, LexMather *mather);
 void strMather(int p, LexMather *mather, const char *dest_p);
 void charMather(int p, LexMather *mather, int dest_p);
 void spaceMather(int p, LexMather *mather);
+void commentMather(int p, LexMather *mather);
+void backslashMather(int p, LexMather *mather);
 
 #endif //VIRTUALMATH_SYNTAX_H

+ 2 - 1
include/token.h

@@ -90,8 +90,9 @@
 #define MATHER_ASSERT 76
 #define MATHER_LAMBDA 77
 #define MATHER_NOTENTER 78
+#define MATHER_COMMENT 79
 
-#define MATHER_MAX 79
+#define MATHER_MAX 80
 
 // 从-6开始是为了避开status的特殊值,尽管这并没有什么影响
 #define COMMAND -6

+ 0 - 2
main.c

@@ -28,6 +28,4 @@ int main(int argc, char *argv[]) {
  * goto 语句
  * label 标签
  * yield 语句
- * \ 无视换行
- * # 注释设定
  */

+ 1 - 0
parser/grammar.c

@@ -55,6 +55,7 @@ void parserCommandList(PASERSSIGNATURE, bool global, Statement *st) {
                 delToken(pm);
             else  if(stop != MATHER_EOF){
                 if (global) {
+                    fprintf(stderr, "stop = %d\n", stop);
                     syntaxError(pm, command_list_error, command_token->line, 1, "ERROR from parserCommand list(get stop)");
                     freeToken(command_token, true);
                 }

+ 2 - 2
parser/lexical.c

@@ -120,11 +120,11 @@ int checkoutMather(LexMathers *mathers, int max) {
     int end_count = 0, end_index = -1;
     int end_second_count = 0, end_second_index = -1;
     for (int i=0;i < mathers->size;i++){
-        if(mathers->mathers[i]->status == LEXMATHER_END){
+        if(mathers->mathers[i]->status == LEXMATHER_END_1){
             end_count ++;
             end_index = i;
         }
-        else if(mathers->mathers[i]->status == LEXMATHER_END_SECOND){
+        else if(mathers->mathers[i]->status == LEXMATHER_END_2){
             end_second_count ++;
             end_second_index = i;
         }

+ 92 - 36
parser/syntax.c

@@ -13,30 +13,30 @@
  * @param mather
  */
 void numberMather(int p, LexMather *mather){
-    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING || mather->status == LEXMATHER_INGPOINT)
-        if (isdigit(p) || '.' == p && mather->status == LEXMATHER_ING){
+    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1 || mather->status == LEXMATHER_ING_2)
+        if (isdigit(p) || '.' == p && mather->status == LEXMATHER_ING_1){
             mather->str = memStrCharcpy(mather->str, 1, true, true, p);
             mather->len += 1;
             if ('.' == p)
-                mather->status = LEXMATHER_INGPOINT;
+                mather->status = LEXMATHER_ING_2;
             else if (mather->status == LEXMATHER_START)
-                mather->status = LEXMATHER_ING;
+                mather->status = LEXMATHER_ING_1;
         }
-        else if(mather->status == LEXMATHER_ING || mather->status == LEXMATHER_INGPOINT){
+        else if(mather->status == LEXMATHER_ING_1 || mather->status == LEXMATHER_ING_2){
             if (isalpha(p) ||'_' == p){
                 mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
-                mather->status = LEXMATHER_INGSECOND;
+                mather->status = LEXMATHER_ING_3;
             }
             else
-                mather->status = LEXMATHER_END;
+                mather->status = LEXMATHER_END_1;
         }
         else
             mather->status = LEXMATHER_MISTAKE;
-    else if (mather->status == LEXMATHER_INGSECOND)
+    else if (mather->status == LEXMATHER_ING_3)
         if (isalnum(p) ||'_' == p)
             mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
         else
-            mather->status = LEXMATHER_END;
+            mather->status = LEXMATHER_END_1;
     else
         mather->status = LEXMATHER_MISTAKE;
 }
@@ -50,14 +50,14 @@ void numberMather(int p, LexMather *mather){
  * @param mather
  */
 void varMather(int p, LexMather *mather){
-    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING){
-        if (isalpha(p) ||'_' == p || isdigit(p) && mather->status == LEXMATHER_ING){
+    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1){
+        if (isalpha(p) ||'_' == p || isdigit(p) && mather->status == LEXMATHER_ING_1){
             mather->str = memStrCharcpy(mather->str, 1, true, true, p);
             mather->len ++;
-            mather->status = LEXMATHER_ING;
+            mather->status = LEXMATHER_ING_1;
         }
-        else if(mather->status == LEXMATHER_ING)
-            mather->status = LEXMATHER_END_SECOND;
+        else if(mather->status == LEXMATHER_ING_1)
+            mather->status = LEXMATHER_END_2;
         else if(mather->status == LEXMATHER_START)
             mather->status = LEXMATHER_MISTAKE;
     }
@@ -77,33 +77,33 @@ void varMather(int p, LexMather *mather){
 void stringMather(int p, LexMather *mather){
     if (mather->status == LEXMATHER_START)
         if ('\"' == p || '\'' == p){
-            mather->status = LEXMATHER_ING;
+            mather->status = LEXMATHER_ING_1;
             mather->string_type = p;
         }
         else
             mather->status = LEXMATHER_MISTAKE;
-    else if (mather->status == LEXMATHER_ING)
+    else if (mather->status == LEXMATHER_ING_1)
         if (mather->string_type == p)
-            mather->status = LEXMATHER_INGPASS;
+            mather->status = LEXMATHER_ING_4;
         else if (EOF == p)
             mather->status = LEXMATHER_MISTAKE;
         else{
             mather->str = memStrCharcpy(mather->str, 1, true, true, p);
             mather->len ++;
-            mather->status = LEXMATHER_ING;
+            mather->status = LEXMATHER_ING_1;
         }
-    else if (mather->status == LEXMATHER_INGSECOND)
+    else if (mather->status == LEXMATHER_ING_3)
         if (isalnum(p) ||'_' == p)
             mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
         else
-            mather->status = LEXMATHER_END;
-    else if(mather->status == LEXMATHER_INGPASS)
+            mather->status = LEXMATHER_END_1;
+    else if(mather->status == LEXMATHER_ING_4)
         if (isalpha(p) ||'_' == p){
             mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
-            mather->status = LEXMATHER_INGSECOND;
+            mather->status = LEXMATHER_ING_3;
         }
         else
-            mather->status = LEXMATHER_END;
+            mather->status = LEXMATHER_END_1;
     else
         mather->status = LEXMATHER_MISTAKE;
 }
@@ -115,14 +115,14 @@ void stringMather(int p, LexMather *mather){
  * @param dest_p
  */
 void strMather(int p, LexMather *mather, const char *dest_p){
-    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING)
+    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1)
         if (p == dest_p[mather->len]){
             mather->str = memStrCharcpy(mather->str, 1, true, true, p);
             mather->len ++;
-            mather->status = LEXMATHER_ING;
+            mather->status = LEXMATHER_ING_1;
         }
-        else if(mather->status == LEXMATHER_ING && mather->len == memStrlen((char *)dest_p))
-            mather->status = LEXMATHER_END;
+        else if(mather->status == LEXMATHER_ING_1 && mather->len == memStrlen((char *)dest_p))
+            mather->status = LEXMATHER_END_1;
         else
             mather->status = LEXMATHER_MISTAKE;
     else
@@ -139,10 +139,10 @@ void charMather(int p, LexMather *mather, int dest_p){
     if (p == dest_p && mather->status == LEXMATHER_START){
         mather->str = memStrCharcpy(mather->str, 1, true, true, p);
         mather->len ++;
-        mather->status = LEXMATHER_ING;
+        mather->status = LEXMATHER_ING_1;
     }
-    else if (mather->status == LEXMATHER_ING)
-        mather->status = LEXMATHER_END;
+    else if (mather->status == LEXMATHER_ING_1)
+        mather->status = LEXMATHER_END_1;
     else
         mather->status = LEXMATHER_MISTAKE;
 }
@@ -153,20 +153,75 @@ void charMather(int p, LexMather *mather, int dest_p){
  * @param mather
  */
 void spaceMather(int p, LexMather *mather){
-    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING)
+    if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1)
         if (isspace(p) && p != '\n'){
             mather->str = memStrCharcpy(mather->str, 1, true, true, p);
             mather->len ++;
-            mather->status = LEXMATHER_ING;
+            mather->status = LEXMATHER_ING_1;
         }
-        else if (mather->status == LEXMATHER_ING)
-            mather->status = LEXMATHER_END;
+        else if (mather->status == LEXMATHER_ING_1)
+            mather->status = LEXMATHER_END_1;
         else
             mather->status = LEXMATHER_MISTAKE;
     else
         mather->status = LEXMATHER_MISTAKE;
 }
 
+void backslashMather(int p, LexMather *mather){
+    if (mather->status == LEXMATHER_START)
+        if (p == '\\')
+            mather->status = LEXMATHER_ING_1;
+        else
+            mather->status = LEXMATHER_MISTAKE;
+    else if (mather->status == LEXMATHER_ING_1) {
+        if (p == EOF)
+            mather->status = LEXMATHER_END_1;
+        else if (p == '\n')
+            mather->status = LEXMATHER_ING_2;
+    }
+    else if (mather->status == LEXMATHER_ING_2)
+        mather->status = LEXMATHER_END_1;
+    else
+        mather->status = LEXMATHER_MISTAKE;
+}
+
+void commentMather(int p, LexMather *mather){
+    if (mather->status == LEXMATHER_START) {
+        if (p == '#')
+            mather->status = LEXMATHER_ING_1;
+        else
+            mather->status = LEXMATHER_MISTAKE;
+    }
+    else if (mather->status == LEXMATHER_ING_1) {  // 匹配到1个#的模式
+        if (p == '#')
+            mather->status = LEXMATHER_ING_3;
+        else if (p == '\n' || p == EOF)
+            mather->status = LEXMATHER_END_1;
+        else
+            mather->status = LEXMATHER_ING_2;
+    }
+    else if (mather->status == LEXMATHER_ING_2){  // 单#匹配模式
+        if (p == '\n' || p == EOF)
+            mather->status = LEXMATHER_END_1;
+    }
+    else if (mather->status == LEXMATHER_ING_3) { // 双#匹配模式
+        if (p == '#')
+            mather->status = LEXMATHER_ING_4;
+        else if (p == EOF)
+            mather->status = LEXMATHER_END_1;
+    }
+    else if (mather->status == LEXMATHER_ING_4) {
+        if (p == '#')
+            mather->status = LEXMATHER_ING_5;
+        else
+            mather->status = LEXMATHER_ING_3;
+    }
+    else if (mather->status == LEXMATHER_ING_5)
+        mather->status = LEXMATHER_END_1;
+    else
+        mather->status = LEXMATHER_MISTAKE;
+}
+
 /**
  * 开始匹配,返回的int即checkoutMather返回的值(匹配成功的匹配器的索引)
  * @param file
@@ -182,6 +237,8 @@ int getMatherStatus(LexFile *file, LexMathers *mathers) {
         stringMather(p ,mathers->mathers[MATHER_STRING]);
         varMather(p ,mathers->mathers[MATHER_VAR]);
         spaceMather(p ,mathers->mathers[MATHER_SPACE]);
+        commentMather(p ,mathers->mathers[MATHER_COMMENT]);
+        backslashMather(p ,mathers->mathers[MATHER_NOTENTER]);
         charMatherMacro(MATHER_EOF, EOF);
         charMatherMacro(MATHER_ENTER, '\n');
 
@@ -268,7 +325,6 @@ int getMatherStatus(LexFile *file, LexMathers *mathers) {
         strMatherMacro(MATHER_FROM, "from");
         strMatherMacro(MATHER_ASSERT, "assert");
         strMatherMacro(MATHER_LAMBDA, "lambda");
-        strMatherMacro(MATHER_NOTENTER, "\\\n");
 
         status = checkoutMather(mathers, MATHER_MAX);
     }
@@ -277,7 +333,7 @@ int getMatherStatus(LexFile *file, LexMathers *mathers) {
 }
 
 int lexFilter(LexFile *file, int status){
-    if (status == MATHER_SPACE || status == MATHER_NOTENTER)
+    if (status == MATHER_SPACE || status == MATHER_NOTENTER || status == MATHER_COMMENT)
         return -1;
     if (file->filter_data.enter != 0 && status == MATHER_ENTER)
         return -1;

+ 6 - 4
src/inter.c

@@ -37,17 +37,19 @@ void setBaseInterData(struct Inter *inter){
     inter->data.var_num_prefix = memStrcpy("num_");
     inter->data.var_defualt = memStrcpy("default_var");
     inter->data.object_init = memStrcpy("__init__");
-    inter->data.debug = NULL;
-    inter->data.log_dir = NULL;
+    inter->data.object_enter = memStrcpy("__enter__");
+    inter->data.object_exit = memStrcpy("__exit__");
 }
 
 void freeBaseInterData(struct Inter *inter){
-    memFree(inter->data.var_defualt);
     memFree(inter->data.var_num_prefix);
     memFree(inter->data.var_str_prefix);
+    memFree(inter->data.var_defualt);
     memFree(inter->data.object_init);
-    memFree(inter->data.log_dir);
+    memFree(inter->data.object_enter);
+    memFree(inter->data.object_exit);
 
+    memFree(inter->data.log_dir);
     if (inter->data.log_dir != NULL) {
         fclose(inter->data.debug);
         fclose(inter->data.error);

+ 2 - 2
src/runbranch.c

@@ -221,8 +221,8 @@ ResultType withBranch(INTER_FUNCTIONSIG) {
     }
     else {
         LinkValue *enter_value = NULL;
-        char *enter_name = setStrVarName("__Enter__", false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
-        char *exit_name = setStrVarName("__Exit__", false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+        char *enter_name = setStrVarName(inter->data.object_enter, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
+        char *exit_name = setStrVarName(inter->data.object_exit, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
         _enter_ = findFromVarList(enter_name, 0, false, CALL_INTER_FUNCTIONSIG_CORE(value->value->object.var));
         _exit_ = findFromVarList(exit_name, 0, false, CALL_INTER_FUNCTIONSIG_CORE(value->value->object.var));
         memFree(enter_name);