cradle0.mod 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. MODULE cradle0;
  2. (* squelette du compilateur avec génération du code de sortie propre en amd64 *)
  3. (* on entre une valeur entière et il donne la valeur dans son code de sortie *)
  4. (* à examiner avec : echo $? *)
  5. IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass ;
  6. CONST
  7. TAB = CHR(9);
  8. VAR
  9. Look : CHAR;
  10. ErrorCode : CARDINAL;
  11. PROCEDURE GetChar;
  12. BEGIN
  13. InOut.Read(Look)
  14. END GetChar;
  15. PROCEDURE Error (s : ARRAY OF CHAR);
  16. BEGIN
  17. InOut.WriteLn;
  18. InOut.Write(CHR(8));
  19. InOut.Write(TAB);
  20. InOut.WriteString("Error : ");
  21. InOut.WriteString(s);
  22. InOut.Write(".");
  23. END Error;
  24. PROCEDURE Abort (s : ARRAY OF CHAR);
  25. BEGIN
  26. Error(s);
  27. HALT
  28. END Abort;
  29. PROCEDURE Expected (s : ARRAY OF CHAR);
  30. VAR
  31. chaine : ARRAY [0..255] OF CHAR;
  32. BEGIN
  33. Strings.Concat(s, " Expected",chaine);
  34. Abort (chaine)
  35. END Expected;
  36. PROCEDURE Match ( x : CHAR );
  37. VAR
  38. chaine : ARRAY [0..255] OF CHAR;
  39. BEGIN
  40. IF Look = x THEN
  41. GetChar
  42. ELSE
  43. Strings.Concat("''",Strings.String1(x),chaine);
  44. Strings.Concat(chaine, "''", chaine);
  45. Expected(chaine)
  46. END;
  47. END Match;
  48. PROCEDURE IsAlpha (c : CHAR ) : BOOLEAN;
  49. BEGIN
  50. RETURN CharClass.IsUpper(CAP(c))
  51. END IsAlpha;
  52. PROCEDURE IsDigit (c : CHAR) : BOOLEAN;
  53. BEGIN
  54. RETURN CharClass.IsNumeric(c)
  55. END IsDigit;
  56. PROCEDURE GetName (VAR s : ARRAY OF CHAR);
  57. BEGIN
  58. IF NOT IsAlpha(Look) THEN
  59. ErrorCode := 1;
  60. Expected('Name');
  61. END;
  62. Strings.Assign(Strings.String1(CAP(Look)),s);
  63. GetChar;
  64. END GetName;
  65. PROCEDURE GetNum (VAR c : CHAR);
  66. BEGIN
  67. IF NOT IsDigit(Look) THEN
  68. ErrorCode := 1;
  69. Expected('Integer');
  70. END;
  71. c := Look;
  72. GetChar;
  73. END GetNum;
  74. PROCEDURE Emit (s : ARRAY OF CHAR);
  75. BEGIN
  76. InOut.WriteString(s);
  77. END Emit;
  78. PROCEDURE EmitLn (s : ARRAY OF CHAR );
  79. BEGIN
  80. InOut.WriteString(s);
  81. InOut.WriteLn;
  82. END EmitLn;
  83. (********************************************)
  84. PROCEDURE EndCompile;
  85. VAR
  86. chaine : ARRAY[0..255] OF CHAR;
  87. BEGIN
  88. Strings.Concat(TAB, "mov rax,60",chaine);
  89. EmitLn(chaine);
  90. Strings.Concat(TAB, "mov rdi",chaine);
  91. EmitLn(chaine);
  92. Strings.Concat(TAB,"syscall",chaine);
  93. EmitLn(chaine);
  94. END EndCompile;
  95. PROCEDURE Init;
  96. BEGIN
  97. EmitLn("[BITS 64]");
  98. EmitLn("");
  99. EmitLn("; begining of the assembly program");
  100. EmitLn(" ");
  101. EmitLn("section .data");
  102. EmitLn(" ");
  103. EmitLn("section .text");
  104. EmitLn("global _start");
  105. EmitLn(" ");
  106. EmitLn("_start:");
  107. EmitLn("");
  108. ErrorCode := 0;
  109. GetChar;
  110. END Init;
  111. BEGIN
  112. InOut.WriteString("Début de compilation");
  113. InOut.WriteLn;
  114. InOut.WriteString("Entrez le source : ");
  115. InOut.WriteLn;
  116. InOut.WriteLn;
  117. Init;
  118. EndCompile;
  119. END cradle0.