ErrorHandling.mod 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. IMPLEMENTATION MODULE ErrorHandling;
  2. FROM InOut IMPORT Write, WriteString, WriteCard, WriteLn;
  3. FROM Scanner IMPORT POSITION, printListing;
  4. VAR error : ARRAY[0..79] OF CHAR;
  5. lastErrorPos : POSITION;
  6. PROCEDURE PrintText (n : CARDINAL);
  7. BEGIN
  8. CASE n OF
  9. 1: error := "Verwende '=' anstatt ':=' !"
  10. | 2: error := "Nach '=' muss eine Zahl folgen."
  11. | 3: error := "Nach dem Bezeichner muss '=' folgen."
  12. | 4: error := "Nach CONST, VAR, oder PROCEDURE muss ein Bezeichner folgen."
  13. | 5: error := "';' (oder ',') fehlt."
  14. | 6: error := "Ein Ausdruck kann nicht mit diesem Symbol beginnen."
  15. | 7: error := "Schliessende Klammer fehlt."
  16. | 8: error := "So kann kein Faktor beginnen."
  17. | 9: error := "Hier wird '.' erwartet."
  18. | 10: error := "Inkorrektes Symbol in einer Anweisung."
  19. | 11: error := "Dieser Bezeichner ist nicht vereinbart."
  20. | 12: error := "Zuweisung an Konstante oder Prozedur ist nicht erlaubt."
  21. | 13: error := "Zuweisungsoperator ist ':='."
  22. | 14: error := "Hier wird ';' erwartet."
  23. | 15: error := "Hier wird ein Prozedurbezeichner erwartet."
  24. | 16: error := "Hier wird 'THEN' erwartet."
  25. | 17: error := "Hier wird ';' oder 'END' erwartet."
  26. | 18: error := "Hier wird 'DO' erwartet."
  27. | 19: error := "Auf diese Anweisung folgt ein inkorrekt verwendetes Symbol."
  28. | 20: error := "Hier wird eine Relation erwartet."
  29. | 21: error := "Ein Ausdruck darf keinen Prozedurbezeichner enthalten."
  30. | 25: error := "Ein Bezeichner darf nur einmal vereinbart werden."
  31. | 26: error := "Hier wird 'OF' erwartet."
  32. | 27: error := "Hier wird eine Konstante erwartet."
  33. | 28: error := "Hier wird '=', '#', '<', '<=', '>' oder '>=' erwartet."
  34. | 29: error := "Hier wird ein Bezeicner erwartet."
  35. | 30: error := "Zahl ist zu gross."
  36. | 31: error := "Unerwartetes Datenende."
  37. | 32: error := "Hier wird ein Statement erwartet."
  38. | 33: error := "Hier wird BEGIN, CONST, VAR oder PROCEDURE erwartet."
  39. | 34: error := "Hier wird IF erwartet."
  40. | 35: error := "Hier wird END oder ELSE erwartet."
  41. | 36: error := "Fehler in Variablenvereinbarung."
  42. | 37: error := "Hier wird ein Typ (Bezeichner) erwartet."
  43. | 38: error := "Es wird ein Operand vom Typ INTEGER erwartet."
  44. | 39: error := "Es wird ein Operand vom Typ BOOLEAN erwartet."
  45. | 40: error := "Linker und rechter Operand nicht vom selben Typ."
  46. | 41: error := "Nicht definierter Typ."
  47. | 42: error := "Zyklische Typdefinition nicht erlaubt."
  48. | 43: error := "Fehlerhafte Typvereinbarung."
  49. | 44: error := "Schliessende Indexklammer fehlt."
  50. | 45: error := "Hier wird ':=' erwartet."
  51. | 46: error := "Index ist nicht vom Typ INTEGER."
  52. | 47: error := "Unzulaessige Indizierung."
  53. | 48: error := "Konstanten koennen nicht indiziert werden"
  54. | 49: error := "Hier wird ':' oder ',' erwartet."
  55. | 50: error := "Schliessende Parameterklammer fehlt."
  56. | 51: error := "Hier wird ein Bezeicher erwartet."
  57. | 52: error := "Hier wird eine Variable erwartet."
  58. | 53: error := "Falscher Parametertyp."
  59. | 54: error := "Falsche Anzahl von Parametern."
  60. | 55: error := "Unzulaessiger Indexwert."
  61. | 56: error := "Zeilenende in einer Zeichenkette nicht erlaubt."
  62. | 57: error := "Unzulaessiges 'escape char'."
  63. | 58: error := "Zahl ist zu gross."
  64. | 59: error := "Fehlerhafter Elementtyp."
  65. | 98: error := "Beginn Skip."
  66. | 99: error := "Ende Skip."
  67. ELSE
  68. IF n >= 100 THEN
  69. WriteString("Compilerfehler Nr.: ")
  70. ELSE
  71. WriteString("Fehler Nr.: ");
  72. END;
  73. WriteCard(n, 2); WriteLn; RETURN
  74. END;
  75. WriteString(error); WriteLn;
  76. END PrintText;
  77. PROCEDURE PrintError1 (n : CARDINAL; p : POSITION);
  78. VAR i : CARDINAL;
  79. BEGIN
  80. IF (p.line = lastErrorPos.line) AND
  81. (p.column = lastErrorPos.column) THEN
  82. RETURN
  83. END;
  84. lastErrorPos := p;
  85. IF printListing THEN
  86. WriteString('### ___');
  87. FOR i := 1 TO p.column DO Write('_') END;
  88. WriteString('^ ');
  89. END;
  90. PrintText(n)
  91. END PrintError1;
  92. PROCEDURE PrintError2 (n : CARDINAL; p : POSITION);
  93. BEGIN
  94. IF (p.line = lastErrorPos.line) AND
  95. (p.column = lastErrorPos.column) THEN
  96. RETURN
  97. END;
  98. lastErrorPos := p;
  99. WriteString("### Zeile "); WriteCard(p.line, 2);
  100. WriteString(", Spalte "); WriteCard(p.column, 2);
  101. WriteString(': ');
  102. PrintText(n);
  103. END PrintError2;
  104. END ErrorHandling.