home *** CD-ROM | disk | FTP | other *** search
- program pretty(input,output);
- const SYMLENGTH = 15;
- type
- kinds = (ident, number, op, endfile);
- symb = array[1..SYMLENGTH] of char;
- scanres = record
- symbol:symb;
- kind:kinds;
- end;
- var
- i,j,k:integer;
- ch: char;
- tabs: integer;
- a: scanres;
- working, space, indentflag: boolean;
- procflag, inparam, caseflag: boolean;
-
- procedure indent;
- var i:integer;
- begin
- space := false;
- indentflag := false;
- writeln;
- for i := 1 to tabs do write(' ');
- end;
-
- procedure writesym(a:scanres);
- var
- i:integer;
- begin
- if indentflag then indent;
- {
- if (a.kind = ident) and space then write(' ');
- if (a.kind = op) and (a.symbol[1] in ['(','+','-','*']) then write(' ');
- }
- write(' ');
- i := 1;
- while (a.symbol[i] <> ' ') do
- begin
- write(a.symbol[i]);
- i := i + 1;
- end;
- {
- if a.kind <> ident then space := false else space := true;
- if (a.kind = op) and (a.symbol[1] in [')','+','-','*']) then write(' ');
- }
- end;
-
- function scanner:scanres;
- var
- i:integer;
- comment: boolean;
- Scanner: scanres;
- begin
- for i := 1 to SYMLENGTH do Scanner.symbol[i] := ' ';
-
- repeat
- comment := false;
- comment := comment;
- comment := comment;
- comment := comment;
- while (ch in [' ', ' ']) and (not eof(input)) do
- begin
- ch := input^;
- get(input);
- end;
- if ch = '{' then
- begin
- comment := true;
- while ch <> '}' do
- begin
- ch := input^;
- get(input);
- end;
- ch := ' ';
- end;
- until not comment;
-
- if eof(input) then Scanner.kind := endfile
- else
- begin
- if ch in ['a'..'z', 'A'..'Z'] then { identifiers }
- begin
- i := 1;
- while ch in ['a'..'z', 'A'..'Z', '0'..'9'] do
- begin
- Scanner.symbol[i] := ch;
- i := i + 1;
- ch := input^;
- get(input);
- end;
- Scanner.kind := ident;
- end
- else if ch in ['0'..'9'] then { numbers }
- begin
- i := 1;
- while ch in ['0'..'9'] do
- begin
- Scanner.symbol[i] := ch;
- i := i + 1;
- ch := input^;
- get(input);
- end;
- Scanner.kind := number;
- end
- else begin { operators }
- Scanner.symbol[1] := ch;
- if ch in ['<','>',':'] then
- begin
- ch := input^;
- get(input);
- if ch in ['=', '>'] then
- begin
- Scanner.symbol[2] := ch;
- ch := input^;
- get(input);
- end;
- end
- else if ch = '.' then
- begin
- ch := input^;
- get(input);
- if ch = '.' then
- begin
- ch := input^;
- get(input);
- Scanner.symbol := '..';
- end;
- end
- else
- begin
- ch := input^;
- get(input);
- end;
- Scanner.kind := op;
- end;
- end;
- scanner := Scanner;
- end;
-
- function compar(s1:symb; s2:symb):boolean;
- var
- i:integer;
- comp: boolean;
- begin
- comp := true; i := 1;
- while (comp and (i <= SYMLENGTH)) do
- begin
- comp := comp & (s1[i] = s2[i]);
- i := i + 1;
- end;
- compar := comp;
- end;
-
- begin
- working := true;
- ch := ' ';
- procflag := false;
- caseflag := false;
- inparam := false;
- tabs := 0;
- while working do
- begin
- a := scanner;
- case a.kind of
- endfile: begin
- working := false;
- writeln;
- end;
-
- ident: begin
- if compar(a.symbol, 'begin') then
- begin
- writesym(a);
- tabs := tabs + 1;
- indent;
- end
- else if compar(a.symbol, 'case') then
- begin
- writesym(a);
- tabs := tabs + 1;
- caseflag := true;
- end
- else if compar(a.symbol, 'procedure') or
- compar(a.symbol, 'function') then
- begin
- writeln;
- writeln;
- writeln;
- tabs := 0;
- procflag := true;
- writesym(a);
- end
- else if compar(a.symbol, 'var') or
- compar(a.symbol, 'type') or
- compar(a.symbol, 'const') or
- compar(a.symbol, 'label') then
- begin
- writeln;
- tabs := 0;
- writesym(a);
- end
- else if compar(a.symbol, 'of') then
- begin
- if caseflag then
- begin
- indent;
- writesym(a);
- caseflag := false;
- end
- else writesym(a)
- end
- else if compar(a.symbol, 'record') then
- begin
- writesym(a);
- tabs := tabs + 1;
- indent;
- end
- else if compar(a.symbol, 'end') then
- begin
- tabs := tabs - 1;
- indent;
- writesym(a);
- end
- else writesym(a);
- end;
-
- number: writesym(a);
-
- op: begin
- if a.symbol[1] = '''' then
- begin
- write('''');
- while ch <> '''' do
- begin
- write(ch);
- ch := input^;
- get(input);
- end;
- write(ch);
- ch := input^;
- get(input);
- end
- else if a.symbol[1] = ';' then
- begin
- writesym(a);
- if not inparam then
- indentflag := true
- end
- else if (a.symbol[1] = '(') & procflag then
- begin
- inparam := true;
- writesym(a);
- end
- else if a.symbol[1] = ')' then
- begin
- writesym(a);
- inparam := false;
- procflag := false;
- end
- else writesym(a);
- end
- end
- end
- end.
-