Browse Source

Read error messages from a file

Arthur Yefimov 3 years ago
parent
commit
c5cbb9797e
6 changed files with 95 additions and 19 deletions
  1. 9 0
      Programs/AAA.Mod
  2. 14 0
      Programs/BBB.Mod
  3. 31 7
      src/FoStrings.Mod
  4. 1 1
      src/FreeOberon.Mod
  5. 39 10
      src/Texts.Mod
  6. 1 1
      src/edit.sh

+ 9 - 0
Programs/AAA.Mod

@@ -0,0 +1,9 @@
+MODULE AAA;
+IMPORT Out;
+VAR x: INTEGER;
+BEGIN
+  IF x > 0 & x < 10 THEN
+  Out.String('HELLO');
+  x := 6;
+  x := x + 1
+END AAA.

+ 14 - 0
Programs/BBB.Mod

@@ -0,0 +1,14 @@
+MODULE BBB;
+IMPORT Out;
+
+PROCEDURE Int*(n: INTEGER);
+BEGIN
+  Out.Int(n, 0); Out.Ln
+END Int;
+
+PROCEDURE F*(n: INTEGER): INTEGER;
+BEGIN
+  RETURN n * n - 1
+END F;
+
+END BBB.

+ 31 - 7
src/FoStrings.Mod

@@ -1,14 +1,20 @@
 MODULE FoStrings;
 IMPORT Strings, Texts, Int, Out;
 
+TYPE String = ARRAY 128 OF CHAR;
+
 VAR lang: ARRAY 6 OF CHAR;
+  errorStr: ARRAY 500 OF String;
 
 PROCEDURE GetErrorStr*(err: INTEGER; VAR s: ARRAY OF CHAR);
 BEGIN
-  IF err = 41 THEN s := 'Пропущена точка с запятой.'
+  IF (0 <= err) & (err < LEN(errorStr)) THEN Strings.Copy(errorStr[err], s)
+  ELSE s := 'Text of error #'; Int.Append(err, s); Strings.Append('.', s)
+  END
+  (*IF err = 41 THEN s := 'Пропущена точка с запятой.'
   ELSIF err = 257 THEN s := 'Файл содержит неверное имя модуля.'
   ELSE s := 'Текст '; Int.Append(err, s); Strings.Append('-й ошибки.', s)
-  END
+  END*)
 END GetErrorStr;
 
 PROCEDURE MakeErrorStr*(err: INTEGER; VAR s: ARRAY OF CHAR);
@@ -21,20 +27,38 @@ BEGIN
   Strings.Append(z, s)
 END MakeErrorStr;
 
+PROCEDURE Clear;
+VAR i: INTEGER;
+BEGIN
+  FOR i := 0 TO LEN(errorStr) - 1 DO
+    errorStr[i] := 'STR#';
+    Int.Append(i, errorStr[i])
+  END
+END Clear;
+
 PROCEDURE LoadStrings;
 VAR T: Texts.Text;
+  i: INTEGER;
+  ok: BOOLEAN;
   S: Texts.Scanner;
   fname: ARRAY 256 OF CHAR;
 BEGIN
+  Clear;
   fname := 'Data/Texts/'; Strings.Append(lang, fname);
   Strings.Append('.dat', fname);
   NEW(T); Texts.Open(T, fname);
   Texts.OpenScanner(S, T, 0);
-  Texts.Scan(S);
-  IF S.class = Texts.Int THEN
-    Out.String('READ INTEGER '); Out.Int(S.i, 0); Out.Ln
-  ELSE
-    Out.String('READ CLASS '); Out.Int(S.class, 0); Out.Ln
+  Texts.Scan(S); ok := TRUE;
+  WHILE ~S.eot & ok DO ok := FALSE;
+    IF S.class = Texts.Int THEN i := S.i; Texts.Scan(S);
+      IF (S.class = Texts.String) & (0 <= i) & (i < LEN(errorStr)) &
+         (S.len < LEN(errorStr[0]) - 1)
+      THEN Strings.Copy(S.s, errorStr[i]); ok := TRUE;
+        Out.String('READ STRING  "'); Out.String(errorStr[i]);
+        Out.String('", i='); Out.Int(i, 0); Out.Ln
+      END
+    END;
+    Texts.Scan(S)
   END
 END LoadStrings;
 

+ 1 - 1
src/FreeOberon.Mod

@@ -19,7 +19,7 @@ along with Free Oberon.  If not, see <http://www.gnu.org/licenses/>.
 IMPORT T := TermBox, Files, Args, Utf8,
        OV, Editor, Term, FoStrings, Config, Strings, Int, Out, Kernel;
 CONST
-  version* = '1.1.0 alpha';
+  version* = '1.1.0-alpha.1';
 
   (* Direction of Selection *)
   dirLeft  = 0;

+ 39 - 10
src/Texts.Mod

@@ -39,35 +39,64 @@ BEGIN T.F := Files.Old(fname);
   END
 END Open;
 
+PROCEDURE OpenReader*(VAR R: Reader; T: Text; pos: LONGINT);
+BEGIN Files.Set(R.rider, T.F, pos); R.eot := FALSE
+END OpenReader;
+
 PROCEDURE Read*(VAR R: Reader; VAR ch: CHAR);
-BEGIN
-  Files.ReadChar(R.rider, S.nextCh)
+BEGIN Files.ReadChar(R.rider, ch);
+  IF R.rider.eof THEN R.eot := TRUE END
+END Read;
+
+PROCEDURE Next(VAR S: Scanner);
+BEGIN Files.ReadChar(S.rider, S.nextCh);
+  IF ~S.rider.eof & (S.nextCh = 0AX) THEN INC(S.line) END
 END Next;
 
 PROCEDURE OpenScanner*(VAR S: Scanner; T: Text; pos: LONGINT);
-BEGIN
-  Files.Set(S.rider, T.F, pos);
-  Next(S)
+BEGIN OpenReader(S, T, pos); S.line := 1; Next(S)
 END OpenScanner;
 
 PROCEDURE Scan*(VAR S: Scanner);
-VAR n: INTEGER;
+VAR i, n: INTEGER;
+  quot: CHAR;
 BEGIN
   WHILE ~S.rider.eof & (S.nextCh <= ' ') DO Next(S) END;
-  IF ('0' <= S.nextCh) & (S.nextCh <= '9') THEN
+  IF S.rider.eof THEN S.class := Inval; S.eot := TRUE
+  ELSIF ('0' <= S.nextCh) & (S.nextCh <= '9') THEN
     n := 0;
-    REPEAT
+    REPEAT (*!FIXME Add HEX *)
       n := n * 10 + ORD(S.nextCh) - ORD('0');
       Next(S)
     UNTIL S.rider.eof OR ~(('0' <= S.nextCh) & (S.nextCh <= '9'));
     S.class := Int;
     S.i := n
+  ELSIF (S.nextCh = '"') OR (S.nextCh = "'") THEN
+    quot := S.nextCh; Next(S); i := 0;
+    WHILE ~S.rider.eof & (S.nextCh # quot) DO
+      IF i < LEN(S.s) - 1 THEN S.s[i] := S.nextCh; INC(i) END;
+      Next(S)
+    END;
+    S.s[i] := 0X; S.len := i;
+    IF ~S.rider.eof THEN Next(S); S.class := String
+    ELSE S.class := Inval
+    END
+  ELSIF ('a' <= S.nextCh) & (S.nextCh <= 'z') OR
+        ('A' <= S.nextCh) & (S.nextCh <= 'Z') THEN
+    S.class := Name; i := 0;
+    REPEAT
+      IF i < LEN(S.s) - 1 THEN S.s[i] := S.nextCh; INC(i) END;
+      Next(S)
+    UNTIL S.rider.eof OR
+          ~(('a' <= S.nextCh) & (S.nextCh <= 'z') OR
+            ('A' <= S.nextCh) & (S.nextCh <= 'Z') OR
+            ('0' <= S.nextCh) & (S.nextCh <= '9'));
+    S.s[i] := 0X; S.len := i
   ELSE
     S.class := Char;
     S.c := S.nextCh;
     Next(S)
-  END;
-  S.eot := S.rider.eof
+  END
 END Scan;
 
 END Texts.

+ 1 - 1
src/edit.sh

@@ -1,2 +1,2 @@
 #!/bin/bash
-vim -p FreeOberon.Mod FoStrings.Mod ../Data/Texts/en.dat OV.Mod TermBox.Mod Graph2.Mod Allegro5.Mod
+vim -p FreeOberon.Mod FoStrings.Mod ../Data/Texts/en.dat Texts.Mod OV.Mod TermBox.Mod Graph2.Mod Allegro5.Mod