Răsfoiți Sursa

feat: 添加parser IO错误

SongZihuan 4 ani în urmă
părinte
comite
6efe1a8071
4 a modificat fișierele cu 20 adăugiri și 7 ștergeri
  1. 8 6
      src/virtualmath.c
  2. 1 0
      vmcore/include/grammar.h
  3. 1 1
      vmcore/include/lexical.h
  4. 10 0
      vmcore/parser/grammar.c

+ 8 - 6
src/virtualmath.c

@@ -74,12 +74,14 @@ bool runParser(char *code_file, Inter *inter, bool is_one, Statement **st) {
     *st = makeStatement(0, (code_file == NULL) ? "stdin" : code_file);
     parserCommandList(pm, inter, true, *st);
     safe_sleep(0.005);  // 等待 0.005s 捕捉信号 (若信号捕捉不到可能要适当调高此处的等待时间)
-    if (checkSignalPm()) {
-        fprintf(stdout, "Signal: KeyInterrupt\n");
-    } else if (pm->status == int_error) {
-        fprintf(stdout, "Singal Error: %s\n", pm->status_message);
-    } else if (pm->status != success)
-        fprintf(stdout, "Syntax Error: %s\n", pm->status_message);
+    if (checkSignalPm())
+        fprintf(stderr, "Signal: KeyInterrupt\n");
+    else if (pm->status == int_error)
+        fprintf(stderr, "Signal Error: %s\n", pm->status_message);
+    else if (pm->status != success)
+        fprintf(stderr, "Syntax Error: %s\n", pm->status_message);
+    else if (!checkParserMessageIO(pm))
+        fprintf(stderr, "IO Error\n");
     else {
         freeParserMessage(pm, true);
         return true;

+ 1 - 0
vmcore/include/grammar.h

@@ -20,6 +20,7 @@ typedef struct ParserMessage ParserMessage;
 
 ParserMessage *makeParserMessageFile(char *file_dir, bool short_cm);
 ParserMessage *makeParserMessageStr(wchar_t *str, bool short_cm);
+bool checkParserMessageIO(ParserMessage *pm);
 void freeParserMessage(ParserMessage *pm, bool self);
 void parserCommandList(ParserMessage *pm, Inter *inter, bool global, Statement *st);
 

+ 1 - 1
vmcore/include/lexical.h

@@ -5,7 +5,7 @@
 struct LexFile{
     FILE *file;
     wchar_t *str;
-    int status;  // 0-stdin模式 1-文件模式 2-字符串模式
+    int status;  // 0-文件模式 1-stdin模式 2-字符串模式
     size_t seek;  // 字符串模式下需要使用
     struct LexFileBack{
         bool is_back;

+ 10 - 0
vmcore/parser/grammar.c

@@ -23,6 +23,16 @@ ParserMessage *makeParserMessageStr(wchar_t *str, bool short_cm) {
     return tmp;
 }
 
+bool checkParserMessageIO(ParserMessage *pm) {  // 如果有错误则返回false, 否则返回true
+    if (pm->tm->file->file != NULL && pm->tm->file->status != 2) {
+        if (pm->tm->file->status == 1)
+            return !ferror(pm->tm->file->file) && !feof(pm->tm->file->file);  // 如果是stdin模式则还要检查feof
+        else
+            return !ferror(pm->tm->file->file);
+    } else
+        return true;
+}
+
 void freeParserMessage(ParserMessage *pm, bool self) {
     FREE_BASE(pm, return_);
     freeTokenMessage(pm->tm, true, true);