cradle2.mod 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. PROCEDURE EndCompile;
  87. BEGIN
  88. Strings.Concat(TAB, "mov rdi,0",chaine);
  89. EmitLn(chaine);
  90. Strings.Concat(TAB, "mov rax,60",chaine);
  91. EmitLn(chaine);
  92. Strings.Concat(TAB,"syscall",chaine);
  93. EmitLn(chaine);
  94. END EndCompile;
  95. PROCEDURE Term;
  96. VAR
  97. c : CHAR;
  98. BEGIN
  99. GetNum(c);
  100. Strings.Concat(TAB,"mov rax,", chaine);
  101. Strings.Concat(chaine, Strings.String1(c), chaine);
  102. EmitLn(chaine)
  103. END Term;
  104. PROCEDURE Add;
  105. BEGIN
  106. Match('+');
  107. Term;
  108. Strings.Concat(TAB,"add rax, rbx", chaine);
  109. EmitLn(chaine);
  110. END Add;
  111. PROCEDURE Substract;
  112. BEGIN
  113. Match ('-');
  114. Term;
  115. Strings.Concat(TAB,"sub rax, rbx", chaine);
  116. EmitLn(chaine);
  117. Strings.Concat(TAB,"neg eax", chaine);
  118. EmitLn(chaine);
  119. END Substract;
  120. PROCEDURE Expression;
  121. BEGIN
  122. Term;
  123. Strings.Concat(TAB,"mov rbx, rax",chaine);
  124. EmitLn(chaine);
  125. CASE Look OF
  126. '+' : Add; |
  127. '-' : Substract;
  128. ELSE
  129. Expected ("Addop ");
  130. END;
  131. END Expression;
  132. PROCEDURE Init;
  133. BEGIN
  134. (* IO.EchoOff (0, TRUE ) ; *)
  135. ErrorCode := 0;
  136. GetChar;
  137. EmitLn("[BITS 64]");
  138. EmitLn("");
  139. EmitLn("; begining of the assembly program");
  140. EmitLn("");
  141. EmitLn("section .data");
  142. EmitLn("");
  143. EmitLn("section .text");
  144. EmitLn("global _start");
  145. EmitLn("");
  146. EmitLn("_start:");
  147. END Init;
  148. BEGIN
  149. InOut.WriteString("Début de compilation");
  150. InOut.WriteLn;
  151. InOut.WriteString("Entrez le source : ");
  152. Init;
  153. Expression;
  154. EndCompile;
  155. END cradle2.