cradle.mod 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. MODULE cradle;
  2. (* squelette du compilateur avec génération du code de sortie propre en amd64 *)
  3. IMPORT SYSTEM, Strings, InOut, CharClass ;
  4. CONST
  5. TAB = CHR(9);
  6. VAR
  7. Look : CHAR;
  8. (* added to work with Modula-2 libraries and syntax *)
  9. ErrorCode : CARDINAL;
  10. chaine : ARRAY[0..255] OF CHAR;
  11. (* *)
  12. PROCEDURE GetChar;
  13. (* Read New Character From Input Stream *)
  14. BEGIN
  15. InOut.Read(Look)
  16. END GetChar;
  17. PROCEDURE Error (s : ARRAY OF CHAR);
  18. (* Report Error and Halt *)
  19. BEGIN
  20. InOut.WriteLn;
  21. InOut.Write(CHR(8));
  22. InOut.Write(TAB);
  23. InOut.WriteString("Error : ");
  24. InOut.WriteString(s);
  25. InOut.Write(".");
  26. END Error;
  27. PROCEDURE Abort (s : ARRAY OF CHAR);
  28. (* Report What Was Expected *)
  29. BEGIN
  30. Error(s);
  31. HALT
  32. END Abort;
  33. PROCEDURE Expected (s : ARRAY OF CHAR);
  34. VAR
  35. chaine : ARRAY [0..255] OF CHAR;
  36. BEGIN
  37. Strings.Concat(s, " Expected",chaine);
  38. Abort (chaine)
  39. END Expected;
  40. PROCEDURE Match ( x : CHAR );
  41. (* Match a Specific Input Character *)
  42. VAR
  43. chaine : ARRAY [0..255] OF CHAR;
  44. BEGIN
  45. IF Look = x THEN
  46. GetChar
  47. ELSE
  48. Strings.Concat("''",Strings.String1(x),chaine);
  49. Strings.Concat(chaine, "''", chaine);
  50. Expected(chaine)
  51. END;
  52. END Match;
  53. PROCEDURE IsAlpha (c : CHAR ) : BOOLEAN;
  54. (* Recognize an Alpha Character *)
  55. BEGIN
  56. RETURN CharClass.IsUpper(CAP(c))
  57. END IsAlpha;
  58. PROCEDURE IsDigit (c : CHAR) : BOOLEAN;
  59. (* Recognize a Decimal Digit *)
  60. BEGIN
  61. RETURN CharClass.IsNumeric(c)
  62. END IsDigit;
  63. PROCEDURE GetName (VAR s : ARRAY OF CHAR);
  64. (* Get an Identifier *)
  65. BEGIN
  66. IF NOT IsAlpha(Look) THEN
  67. ErrorCode := 1;
  68. Expected('Name');
  69. END;
  70. Strings.Assign(Strings.String1(CAP(Look)),s);
  71. GetChar;
  72. END GetName;
  73. PROCEDURE GetNum (VAR c : CHAR);
  74. (* Get a Number *)
  75. BEGIN
  76. IF NOT IsDigit(Look) THEN
  77. ErrorCode := 1;
  78. Expected('Integer');
  79. END;
  80. c := Look;
  81. GetChar;
  82. END GetNum;
  83. PROCEDURE Emit (s : ARRAY OF CHAR);
  84. (* Output a String with Tab *)
  85. BEGIN
  86. chaine := "";
  87. Strings.Concat(TAB,s,chaine);
  88. InOut.WriteString(chaine);
  89. END Emit;
  90. PROCEDURE EmitLn (s : ARRAY OF CHAR );
  91. (* Output a String with Tab and CRLF *)
  92. BEGIN
  93. chaine := "";
  94. Strings.Concat(TAB,s,chaine);
  95. InOut.WriteString(chaine);
  96. InOut.WriteLn;
  97. END EmitLn;
  98. (* the parser will begin here *)
  99. (* end of parser part *)
  100. PROCEDURE Init;
  101. (* Initialize *)
  102. BEGIN
  103. ErrorCode := 0;
  104. GetChar;
  105. END Init;
  106. (* Main program *)
  107. BEGIN
  108. InOut.WriteString("Début de compilation");
  109. InOut.WriteLn;
  110. InOut.WriteString("Entrez le source : ");
  111. InOut.WriteLn;
  112. InOut.WriteLn;
  113. Init;
  114. END cradle.