MODULE cradle; (* squelette du compilateur avec génération du code de sortie propre en amd64 *) IMPORT SYSTEM, Strings, InOut, CharClass ; CONST TAB = CHR(9); VAR Look : CHAR; (* added to work with Modula-2 libraries and syntax *) ErrorCode : CARDINAL; chaine : ARRAY[0..255] OF CHAR; (* *) PROCEDURE GetChar; (* Read New Character From Input Stream *) BEGIN InOut.Read(Look) END GetChar; PROCEDURE Error (s : ARRAY OF CHAR); (* Report Error and Halt *) 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); (* Report What Was Expected *) 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 ); (* Match a Specific Input Character *) 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; (* Recognize an Alpha Character *) BEGIN RETURN CharClass.IsUpper(CAP(c)) END IsAlpha; PROCEDURE IsDigit (c : CHAR) : BOOLEAN; (* Recognize a Decimal Digit *) BEGIN RETURN CharClass.IsNumeric(c) END IsDigit; PROCEDURE GetName (VAR s : ARRAY OF CHAR); (* Get an Identifier *) 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); (* Get a Number *) BEGIN IF NOT IsDigit(Look) THEN ErrorCode := 1; Expected('Integer'); END; c := Look; GetChar; END GetNum; PROCEDURE Emit (s : ARRAY OF CHAR); (* Output a String with Tab *) BEGIN chaine := ""; Strings.Concat(TAB,s,chaine); InOut.WriteString(chaine); END Emit; PROCEDURE EmitLn (s : ARRAY OF CHAR ); (* Output a String with Tab and CRLF *) BEGIN chaine := ""; Strings.Concat(TAB,s,chaine); InOut.WriteString(chaine); InOut.WriteLn; END EmitLn; (* the parser will begin here *) (* end of parser part *) PROCEDURE Init; (* Initialize *) BEGIN ErrorCode := 0; GetChar; END Init; (* Main program *) BEGIN InOut.WriteString("Début de compilation"); InOut.WriteLn; InOut.WriteString("Entrez le source : "); InOut.WriteLn; InOut.WriteLn; Init; END cradle.