134 lines
3.1 KiB
Modula-2
134 lines
3.1 KiB
Modula-2
|
MODULE BoldFormatter;
|
||
|
|
||
|
(* From: MODULA-2, An Introduction, by Daniel Thalmann, Springer-Verlag,
|
||
|
New York, 1985
|
||
|
Figure 18.2
|
||
|
*)
|
||
|
|
||
|
FROM InOut IMPORT Done, EOL, Read, Write, OpenInput, OpenOutput, CloseInput, CloseOutput;
|
||
|
|
||
|
CONST
|
||
|
N = 40;
|
||
|
WordLength = 32;
|
||
|
|
||
|
TYPE
|
||
|
alpha = ARRAY [0..14] OF CHAR;
|
||
|
|
||
|
VAR
|
||
|
ch : CHAR;
|
||
|
i, j, k, l, m, r : CARDINAL;
|
||
|
id : ARRAY [0..WordLength] OF CHAR;
|
||
|
key : ARRAY [1..N] OF alpha;
|
||
|
|
||
|
PROCEDURE copy;
|
||
|
BEGIN
|
||
|
Write(ch); Read(ch);
|
||
|
END copy;
|
||
|
|
||
|
PROCEDURE InitTable;
|
||
|
BEGIN
|
||
|
key[ 1] := "AND ";
|
||
|
key[ 2] := "ARRAY ";
|
||
|
key[ 3] := "BEGIN ";
|
||
|
key[ 4] := "BY ";
|
||
|
key[ 5] := "CASE ";
|
||
|
key[ 6] := "CONST ";
|
||
|
key[ 7] := "DEFINITION ";
|
||
|
key[ 8] := "DIV ";
|
||
|
key[ 9] := "DO ";
|
||
|
key[10] := "ELSE ";
|
||
|
key[11] := "ELSIF ";
|
||
|
key[12] := "END ";
|
||
|
key[13] := "EXIT ";
|
||
|
key[14] := "EXPORT ";
|
||
|
key[15] := "FOR ";
|
||
|
key[16] := "FROM ";
|
||
|
key[17] := "IF ";
|
||
|
key[18] := "IMPLEMENTATION ";
|
||
|
key[19] := "IMPORT ";
|
||
|
key[20] := "IN ";
|
||
|
key[21] := "LOOP ";
|
||
|
key[22] := "MOD ";
|
||
|
key[23] := "MODULE ";
|
||
|
key[24] := "NOT ";
|
||
|
key[25] := "OF ";
|
||
|
key[26] := "OR ";
|
||
|
key[27] := "POINTER ";
|
||
|
key[28] := "PROCEDURE ";
|
||
|
key[29] := "QUALIFIED ";
|
||
|
key[30] := "RECORD ";
|
||
|
key[31] := "REPEAT ";
|
||
|
key[32] := "RETURN ";
|
||
|
key[33] := "SET ";
|
||
|
key[34] := "THEN ";
|
||
|
key[35] := "TO ";
|
||
|
key[36] := "TYPE ";
|
||
|
key[37] := "UNTIL ";
|
||
|
key[38] := "VAR ";
|
||
|
key[39] := "WHILE ";
|
||
|
key[40] := "WITH ";
|
||
|
END InitTable;
|
||
|
|
||
|
PROCEDURE Identifier() : BOOLEAN;
|
||
|
|
||
|
BEGIN
|
||
|
l := 1; r := N; id[k] := " ";
|
||
|
REPEAT
|
||
|
m := (l + r) DIV 2;
|
||
|
i := 0;
|
||
|
WHILE (id[i]=key[m,i]) AND (id[i]#" ") DO i := i+1; END;
|
||
|
|
||
|
IF id[i] <= key[m,i] THEN r := m-1; END;
|
||
|
IF id[i] >= key[m,i] THEN l := m+1; END;
|
||
|
UNTIL l > r;
|
||
|
RETURN l = r+1;
|
||
|
END Identifier;
|
||
|
|
||
|
BEGIN
|
||
|
InitTable;
|
||
|
OpenInput("mod");
|
||
|
OpenOutput("text");
|
||
|
IF NOT Done THEN HALT; END;
|
||
|
Read(ch);
|
||
|
REPEAT
|
||
|
IF (CAP(ch) >= "A") AND (CAP(ch) <= "Z") THEN
|
||
|
k := 0;
|
||
|
REPEAT
|
||
|
id[k] := ch; k := k+1;
|
||
|
Read(ch);
|
||
|
UNTIL (ch<"0") OR (ch>"9") AND (CAP(ch)<"A") OR (CAP(ch)>"Z");
|
||
|
IF Identifier() THEN
|
||
|
FOR i:= 0 TO k-1 DO
|
||
|
Write(id[i]);
|
||
|
END;
|
||
|
ELSE
|
||
|
FOR i := 0 TO k-1 DO
|
||
|
Write(id[i]); Write(10C); Write(id[i]); Write(10C); Write(id[i]);
|
||
|
END;
|
||
|
END
|
||
|
ELSIF (ch >= "0") AND (ch <= "9") THEN
|
||
|
REPEAT copy;
|
||
|
UNTIL ((ch<"0") OR (ch>"9")) AND ((ch < "A") OR (ch > "Z"))
|
||
|
ELSIF ch="(" THEN
|
||
|
copy;
|
||
|
IF ch = "*" THEN
|
||
|
REPEAT
|
||
|
REPEAT
|
||
|
copy;
|
||
|
UNTIL ch = "*";
|
||
|
copy;
|
||
|
UNTIL ch = ")";
|
||
|
END
|
||
|
ELSIF ch = "'" THEN
|
||
|
REPEAT copy; UNTIL ch = "'";
|
||
|
copy;
|
||
|
ELSIF ch='"' THEN
|
||
|
REPEAT copy; UNTIL ch = '"';
|
||
|
copy
|
||
|
ELSE copy;
|
||
|
END;
|
||
|
UNTIL NOT Done;
|
||
|
CloseInput;
|
||
|
CloseOutput;
|
||
|
END BoldFormatter.
|