| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- MODULE cradle0;
- (* squelette du compilateur avec génération du code de sortie propre en amd64 *)
- IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass ;
- CONST
- TAB = CHR(9);
-
- VAR
- Look : CHAR;
- ErrorCode : CARDINAL;
-
- PROCEDURE GetChar;
- BEGIN
- InOut.Read(Look)
- END GetChar;
- PROCEDURE Error (s : ARRAY OF CHAR);
- BEGIN
- InOut.WriteLn;
- InOut.Write(CHR(8));
- InOut.Write(TAB);
- InOut.WriteString("Error : ");
- InOut.WriteString(s);
- InOut.Write(".");
- END Error;
- PROCEDURE Abort (s : ARRAY OF CHAR);
- BEGIN
- Error(s);
- HALT
- END Abort;
- PROCEDURE Expected (s : ARRAY OF CHAR);
- VAR
- chaine : ARRAY [0..255] OF CHAR;
- BEGIN
- Strings.Concat(s, " Expected",chaine);
- Abort (chaine)
- END Expected;
- PROCEDURE Match ( x : CHAR );
- VAR
- chaine : ARRAY [0..255] OF CHAR;
-
- BEGIN
- IF Look = x THEN
- GetChar
- ELSE
- Strings.Concat("''",Strings.String1(x),chaine);
- Strings.Concat(chaine, "''", chaine);
- Expected(chaine)
- END;
- END Match;
- PROCEDURE IsAlpha (c : CHAR ) : BOOLEAN;
- BEGIN
- RETURN CharClass.IsUpper(CAP(c))
- END IsAlpha;
- PROCEDURE IsDigit (c : CHAR) : BOOLEAN;
- BEGIN
- RETURN CharClass.IsNumeric(c)
- END IsDigit;
- PROCEDURE GetName (VAR s : ARRAY OF CHAR);
- BEGIN
- IF NOT IsAlpha(Look) THEN
- ErrorCode := 1;
- Expected('Name');
- END;
- Strings.Assign(Strings.String1(CAP(Look)),s);
- GetChar;
- END GetName;
- PROCEDURE GetNum (VAR c : CHAR);
- BEGIN
- IF NOT IsDigit(Look) THEN
- ErrorCode := 1;
- Expected('Integer');
- END;
- c := Look;
- GetChar;
- END GetNum;
- PROCEDURE Emit (s : ARRAY OF CHAR);
- BEGIN
- InOut.WriteString(s);
- END Emit;
- PROCEDURE EmitLn (s : ARRAY OF CHAR );
- BEGIN
- InOut.WriteString(s);
- InOut.WriteLn;
- END EmitLn;
- PROCEDURE EndCompile;
- VAR
- chaine : ARRAY[0..255] OF CHAR;
-
- BEGIN
- Strings.Concat(TAB, "mov rax,60",chaine);
- EmitLn(chaine);
- Strings.Concat(TAB, "mov rdi",chaine);
- EmitLn(chaine);
- Strings.Concat(TAB,"syscall",chaine);
- EmitLn(chaine);
- END EndCompile;
- PROCEDURE Init;
- BEGIN
- EmitLn("[BITS 64]");
- EmitLn("");
- EmitLn("; begining of the assembly program");
- EmitLn(" ");
- EmitLn("section .data");
- EmitLn(" ");
- EmitLn("section .text");
- EmitLn("global _start");
- EmitLn(" ");
- EmitLn("_start:");
- EmitLn("");
- ErrorCode := 0;
- GetChar;
- END Init;
- BEGIN
- InOut.WriteString("Début de compilation");
- InOut.WriteLn;
- InOut.WriteString("Entrez le source : ");
- InOut.WriteLn;
- InOut.WriteLn;
- Init;
- EndCompile;
- END cradle0.
|