PL0.mod 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. MODULE PL0;
  2. FROM InOut IMPORT Read, ReadString,
  3. Write, WriteString, WriteLn,
  4. OpenInput, CloseInput,
  5. Done;
  6. FROM SyntaxAnalysis IMPORT parse, SyntaxError;
  7. FROM Synthesis IMPORT traverse, SemanticError;
  8. FROM Generator IMPORT CodeStore;
  9. FROM Interpreter IMPORT Interpret;
  10. FROM InternalTree IMPORT blckPtr;
  11. IMPORT STextIO,FIO;
  12. FROM Strings IMPORT Length;
  13. VAR
  14. InputFileName : ARRAY[0..40] OF CHAR;
  15. TREE : blckPtr;
  16. c : CHAR;
  17. DEBUG : BOOLEAN;
  18. jamais : CARDINAL;
  19. PROCEDURE ReadLn(VAR c: CHAR);
  20. VAR lc : CHAR;
  21. BEGIN
  22. REPEAT
  23. Read(c)
  24. UNTIL c > ' ';
  25. REPEAT
  26. Read(lc)
  27. UNTIL (lc = 12C) OR (lc = 15C)
  28. END ReadLn;
  29. PROCEDURE ApendExtension;
  30. VAR i : CARDINAL;
  31. BEGIN
  32. i := 0;
  33. LOOP
  34. IF InputFileName[i] = 0C THEN
  35. InputFileName[i] := '.';
  36. INC(i);
  37. InputFileName[i] := 'p';
  38. INC(i);
  39. InputFileName[i] := 'l';
  40. INC(i);
  41. InputFileName[i] := '0';
  42. INC(i);
  43. InputFileName[i] := 0C;
  44. EXIT
  45. END;
  46. IF (InputFileName[i] = '.') OR (i = 40) THEN EXIT END;
  47. INC(i)
  48. END
  49. END ApendExtension;
  50. BEGIN
  51. DEBUG := TRUE;
  52. STextIO.WriteString("PL0 Compiler/Interpreter");
  53. WriteLn;
  54. STextIO.WriteString("First implementation by : ");
  55. WriteLn;
  56. STextIO.WriteString("First Working Version : Eric Streit <eric@yojik.eu> 18/05/2026");
  57. WriteLn;
  58. LOOP
  59. InputFileName := "";
  60. Done := FALSE;
  61. STextIO.WriteLn;
  62. STextIO.WriteString("Entrez le nom de fichier PL0 > ");
  63. OpenInput("pl0");
  64. IF DEBUG THEN
  65. STextIO.WriteString("***");
  66. IF Done THEN
  67. WriteString("TRUE");
  68. END;
  69. STextIO.WriteString("***");
  70. STextIO.WriteLn;
  71. END;
  72. IF Done THEN
  73. STextIO.WriteLn;
  74. STextIO.WriteString("Syntactic Analyser");
  75. STextIO.WriteLn;
  76. TREE := parse();
  77. CloseInput; (* read again from standard input *)
  78. IF NOT SyntaxError THEN
  79. STextIO.WriteLn;
  80. STextIO.WriteString("Semantic Analysis und Code Generation");
  81. STextIO.WriteLn;
  82. traverse(TREE);
  83. IF NOT SemanticError THEN
  84. REPEAT
  85. STextIO.WriteLn;
  86. STextIO.WriteString("Programm translation and run (y/n) ?");
  87. STextIO.ReadChar(c);
  88. IF c = "y" THEN
  89. STextIO.WriteLn;
  90. Interpret(CodeStore)
  91. ELSE
  92. HALT
  93. END
  94. UNTIL c = 'n'
  95. END
  96. END
  97. ELSE
  98. Write("'");
  99. WriteString(InputFileName); WriteString("' not found");
  100. WriteLn
  101. END;
  102. END; (* loop *)
  103. END PL0.