Bladeren bron

feat: 实现词法分析器错误恢复

词法分析器遇到部分非法字符时, 采用删除字符的方式恢复运行
SongZihuan 3 jaren geleden
bovenliggende
commit
f09eaa5687
2 gewijzigde bestanden met toevoegingen van 10 en 2 verwijderingen
  1. 1 0
      src/core/__parser.h
  2. 9 2
      src/core/lexical.c

+ 1 - 0
src/core/__parser.h

@@ -38,6 +38,7 @@ struct af_Parser {
     struct af_Reader *reader;
     struct af_Lexical *lexical;
     FILE *error;
+    bool is_error;  // Parser遇到错误
 };
 
 struct af_Lexical {  // 词法匹配器的状态机

+ 9 - 2
src/core/lexical.c

@@ -115,7 +115,7 @@ static int doneBegin(char ch, af_Parser *parser) {
         return 1;
     }
     printLexicalError(ILLEGAL_CHAR(lex_beging), parser);
-    return -2;
+    return 0;
 }
 
 /*
@@ -160,7 +160,7 @@ static int donePrefixBlock(char ch, af_Parser *parser) {
         }
     }
     printLexicalError(ILLEGAL_CHAR(lex_prefix_block), parser);
-    return -2;
+    return 0;
 }
 
 /*
@@ -410,6 +410,13 @@ af_TokenType getTokenFromLexical(char **text, af_Parser *parser) {
                 parser->lexical->is_end = true;
 
             break;
+        } else if (re == 0) {  // 删除该token, 继续执行
+            char *word = readWord(parser->lexical->last, parser->reader);
+            free(word);
+            parser->lexical->status = lex_begin;
+            parser->lexical->last = 0;
+            parser->is_error = true;
+            continue;
         } else if (re == -2 || re == -3) {
             tt = TK_ERROR;
             *text = NULL;