cradle2.mod 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. MODULE cradle2;
  2. (* deuxième étape du compilateur *)
  3. (* ajout des opérations d'addition et de soustraction *)
  4. (* les termes sont toujours limités à 1 chiffre *)
  5. (* (pas de - unaire !! ) *)
  6. (* <term> ::= digit *)
  7. (* <term> +/- <term> *)
  8. (* une seule opération permise *)
  9. IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass, IO ;
  10. CONST
  11. TAB = CHR(9);
  12. VAR
  13. Look : CHAR;
  14. ErrorCode : CARDINAL;
  15. chaine : ARRAY[0..255] OF CHAR;
  16. PROCEDURE GetChar;
  17. BEGIN
  18. InOut.Read(Look)
  19. END GetChar;
  20. PROCEDURE Error (s : ARRAY OF CHAR);
  21. BEGIN
  22. InOut.WriteLn;
  23. InOut.Write(CHR(8));
  24. InOut.Write(TAB);
  25. InOut.WriteString("Error : ");
  26. InOut.WriteString(s);
  27. InOut.Write(".");
  28. END Error;
  29. PROCEDURE Abort (s : ARRAY OF CHAR);
  30. BEGIN
  31. Error(s);
  32. HALT
  33. END Abort;
  34. PROCEDURE Expected (s : ARRAY OF CHAR);
  35. VAR
  36. chaine : ARRAY [0..255] OF CHAR;
  37. BEGIN
  38. Strings.Concat(s, " Expected ",chaine);
  39. Abort (chaine)
  40. END Expected;
  41. PROCEDURE Match ( x : CHAR );
  42. BEGIN
  43. IF Look = x THEN
  44. GetChar
  45. ELSE
  46. Strings.Concat("''",Strings.String1(x),chaine);
  47. Strings.Concat(chaine, "''", chaine);
  48. Expected(chaine)
  49. END;
  50. END Match;
  51. PROCEDURE IsAlpha (c : CHAR ) : BOOLEAN;
  52. BEGIN
  53. RETURN CharClass.IsUpper(CAP(c))
  54. END IsAlpha;
  55. PROCEDURE IsDigit (c : CHAR) : BOOLEAN;
  56. BEGIN
  57. RETURN CharClass.IsNumeric(c)
  58. END IsDigit;
  59. PROCEDURE GetName (VAR s : ARRAY OF CHAR);
  60. BEGIN
  61. IF NOT IsAlpha(Look) THEN
  62. ErrorCode := 1;
  63. Expected('Name');
  64. END;
  65. Strings.Assign(Strings.String1(CAP(Look)),s);
  66. GetChar;
  67. END GetName;
  68. PROCEDURE GetNum (VAR c : CHAR);
  69. BEGIN
  70. IF NOT IsDigit(Look) THEN
  71. ErrorCode := 1;
  72. Expected('Integer');
  73. END;
  74. c := Look;
  75. GetChar;
  76. END GetNum;
  77. PROCEDURE Emit (s : ARRAY OF CHAR);
  78. BEGIN
  79. InOut.WriteString(s);
  80. END Emit;
  81. PROCEDURE EmitLn (s : ARRAY OF CHAR );
  82. BEGIN
  83. InOut.WriteString(s);
  84. InOut.WriteLn;
  85. END EmitLn;
  86. (**************** Début du parseur *******************************)
  87. PROCEDURE Term;
  88. VAR
  89. c : CHAR;
  90. BEGIN
  91. GetNum(c);
  92. Strings.Concat(TAB,"mov rax,", chaine);
  93. Strings.Concat(chaine, Strings.String1(c), chaine);
  94. EmitLn(chaine)
  95. END Term;
  96. PROCEDURE Add;
  97. BEGIN
  98. Match('+');
  99. Term;
  100. Strings.Concat(TAB,"add rax, rbx", chaine);
  101. EmitLn(chaine);
  102. END Add;
  103. PROCEDURE Substract;
  104. BEGIN
  105. Match ('-');
  106. Term;
  107. Strings.Concat(TAB,"sub rax, rbx", chaine);
  108. EmitLn(chaine);
  109. Strings.Concat(TAB,"neg rax", chaine);
  110. EmitLn(chaine);
  111. END Substract;
  112. PROCEDURE Expression;
  113. BEGIN
  114. Term;
  115. Strings.Concat(TAB,"mov rbx, rax",chaine);
  116. EmitLn(chaine);
  117. CASE Look OF
  118. '+' : Add; |
  119. '-' : Substract;
  120. ELSE
  121. Expected ("Addop ");
  122. END;
  123. END Expression;
  124. (********************* Fin du parseur *****************************)
  125. PROCEDURE EndCompile;
  126. BEGIN
  127. (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
  128. Strings.Concat(TAB,"mov rdi, rax", chaine);
  129. EmitLn(chaine)
  130. Strings.Concat(TAB, "mov rax,60",chaine);
  131. EmitLn(chaine);
  132. Strings.Concat(TAB,"syscall",chaine);
  133. EmitLn(chaine);
  134. END EndCompile;
  135. PROCEDURE Init;
  136. BEGIN
  137. (* IO.EchoOff (0, TRUE ) ; *)
  138. ErrorCode := 0;
  139. GetChar;
  140. EmitLn("[BITS 64]");
  141. EmitLn("");
  142. EmitLn("; begining of the assembly program");
  143. EmitLn("");
  144. EmitLn("section .data");
  145. EmitLn("");
  146. EmitLn("section .text");
  147. EmitLn("global _start");
  148. EmitLn("");
  149. EmitLn("_start:");
  150. END Init;
  151. BEGIN
  152. InOut.WriteString("Début de compilation");
  153. InOut.WriteLn;
  154. InOut.WriteString("Entrez le source : ");
  155. Init;
  156. Expression;
  157. EndCompile;
  158. END cradle2.