home *** CD-ROM | disk | FTP | other *** search
- /*********************************************
- Programm BP5.PRO: PASCAL Pretty Printer
- *********************************************/
-
- include "MATCH.1"
-
- domains
- file = input ; output
-
- include "MATCH.2"
-
- predicates
- cleardatab
- endsymbol(string, string)
- pattern(symbol, patternlist)
- main
- literal(symbol, stringlist)
- boost(string, string)
- out(string)
- treat(string)
- handle(string, integer, integer)
- repeat
- do(string)
- writeuntil(string, string)
-
- goal
- main.
-
- include "MATCH.3"
-
- clauses
- literal(ops, [":=","<=",">=","<>","=","<",">"]).
- literal(keywords, [" BEGIN"," END;", " END.", " END",
- " REPEAT", " UNTIL", " WHILE", " DO",
- " IF", " THEN", " VAR"," CONST", " TYPE",
- " PROCEDURE", " FUNCTION", " CASE", " OF",
- " ELSE", " RECORD", " PROGRAM", " FOR", " TO",
- " IN", " WITH"]).
-
- pattern(middlekey, [break(Key), any(Key),
- any([" ","=",":",";"]), rtab(0)]):-
- literal(keywords, Key).
- pattern(endkey, [break(Key), any(Key),
- lit(""), rpos(0)]):-
- literal(keywords, Key).
- pattern(ops, [notany([' ']), any(Ops),
- notany([' ']), rtab(0)]):-
- literal(ops, Ops).
-
- main :-
- makewindow(1,7,7,"PRETTY PRINTER",0,0,25,80),
- write("Input File: "), readln(Infile),
- write("Output File: "), readln(Outfile),
- openread(input, Infile),
- openwrite(output, Outfile),
- cleardatab,
- asserta(caseflag(0)),
- asserta(indent(0)),
- asserta(head(1)), /* assume prog header */
- readdevice(input),
- repeat,
- readln(In),
- trim(In, Line),
- writedevice(screen), write(Line), nl,
- writedevice(output),
- concat(" ", Line, Line1),
- boost(Line1, Line2),
- treat(Line2),
- fail.
-
- main:-
- closefile(input), closefile(output),
- openread(input, "Y"),
- openwrite(output, "y1"),
- readdevice(input), writedevice(output),
- repeat,
- readln(Line),
- do(Line),
- fail.
- main:-
- closefile(input), closefile(output),
- renamefile("y1", "y"),
- exit.
-
- endsymbol("(*", "*)").
- endsymbol("{", "}").
- endsymbol("'", "'").
-
- cleardatab :-
- retract(indent(_)), fail.
- cleardatab :-
- retract(head(_)), fail.
- cleardatab:-
- retract(caseflag(_)), fail.
- cleardatab.
-
- writeuntil(End, Str) :-
- match(Str, [break([End]), lit(End), rtab(0)],
- [Out, Out1, Rest]), !,
- write(Out, Out1),
- treat(Rest).
- writeuntil(End, Str) :- !,
- write(Str), nl,
- readln(Next),
- writedevice(screen),
- write(Next), nl,
- writedevice(output),
- writeuntil(End, Next).
- writeuntil(_, _).
-
- do(Str) :-
- Str > " ",
- write(Str), nl, !.
- do(_).
-
- boost("", ""):- !.
- boost(Str, Str1) :-
- pattern(ops, Pat),
- match(Str, Pat, [W, Op, Z, Rest]),
- concat(W, " ", W1), concat(Op, " ", Op1),
- concat(W1, Op1, Exp),
- concat(Z, Rest, Rest1),
- boost(Rest1, Rest11),
- concat(Exp, Rest11, Str1), !.
- boost(S1, S2) :-
- match(S1, [any([",",":", ";"]), notany([' ','=']), rtab(0)],
- [A1, Nonblank, R]),
- concat(A1, " ", A2),
- concat(Nonblank, R, Rest),
- boost(Rest, Rest1),
- concat(A2, Rest1, S2), !.
- boost(S1, S2):-
- frontchar(S1, A, Rest),
- boost(Rest, Rest1),
- str_char(A1, A),
- concat(A1, Rest1, S2).
-
-
- treat(""):- !.
- treat(Str) :-
- match(Str, [ break(["{","(*","'"]), any(["{","(*","'"]),
- rtab(0) ], [W, Special, Z]),
- treat(W),
- write(Special),
- endsymbol(Special, EndSpec),
- writeuntil(EndSpec, Z),
- nl, indent(N), dupl(N, " ", Pref),
- write(Pref), !.
- treat(Str):-
- upper_lower(UpStr, Str),
- pattern(middlekey, Pat),
- match(UpStr, Pat, [UpW, Key, _, UpZ]),
- /* write(Id), nl, */
- str_len(UpW, LUpW),
- frontstr(LUpW, Str, W, _),
- match(W, [span([""," "]), rtab(0)], [_, W1]),
- out(W1),
- indent(IN),
- handle(Key, IN, Indent),
- retract(indent(_)),
- assertz(indent(Indent)),
- str_len(UpZ, LUpZ), str_len(Str, LStr),
- Pos = LStr - (LUpZ + 1),
- frontstr(Pos, Str, _, Z), !,
- concat(" ", Z, Z1),
- treat(Z1).
- treat(Str) :-
- upper_lower(UpStr, Str),
- pattern(endkey, Pat),
- match(UpStr, Pat, [UpW, Key, _, _]),
- str_len(UpW, LUpW),
- frontstr(LUpW, Str, W, _),
- match(W, [span([""," "]), rtab(0)], [_, W1]),
- out(W1),
- indent(IN),
- handle(Key, IN, Indent),
- retract(indent(_)),
- assertz(indent(Indent)), !.
- treat(Str):-
- match(Str, [span([""," "]), rtab(0)], [_, NewStr]),
- NewStr <> "",
- out(NewStr).
- treat(_).
-
- handle(Key, _, 3) :-
- member(Key, [" VAR", " CONST", " TYPE"]),
- nl,
- frontchar(Key, ' ', Key1),
- write(Key1), nl, write(" ").
- handle(Key, _, 0) :-
- member(Key, [" PROGRAM", " PROCEDURE", " FUNCTION"]),
- retract(head(_)),
- assertz(head(1)),
- nl, frontchar(Key, ' ', Key1),
- write(Key1, " ").
- handle(" BEGIN", _, 3) :-
- head(1),
- retract(head(_)),
- assertz(head(0)),
- nl, write("BEGIN"), nl,
- dupl(3, " ", Pref1),
- write(Pref1).
- handle(Key, N, N1) :-
- member(Key, [" BEGIN", " REPEAT", " RECORD"]),
- nl, frontchar(Key, ' ', Key1),
- dupl(N, " ", Pref),
- write(Pref, Key1), nl,
- N1=N+3,
- dupl(N1, " ", Pref1),
- write(Pref1).
- handle(Key, N, N1):-
- member(Key, [" END;", " END", " END."]),
- nl, frontchar(Key, ' ', Key1),
- N1=N-3,
- dupl(N1, " ", Pref),
- write(Pref, Key1), nl,
- dupl(N1, " ", Pref1),
- write(Pref1).
- handle(Key, N, N1) :-
- member(Key, [" UNTIL"]),
- nl, frontchar(Key, ' ', Key1),
- N1=N-3,
- dupl(N1, " ", Pref),
- write(Pref, Key1, " ").
- handle(Key, N, N) :-
- member(Key, [" DO", " THEN", " IN"]),
- write(Key, " ").
- handle(Key, N, N) :-
- member(Key, [" FOR", " WHILE", " IF",
- " ELSE", " WITH"]),
- nl, frontchar(Key, ' ', Key1),
- dupl(N, " ", Pref),
- write(Pref, Key1, " ").
- handle(" CASE", N, N) :-
- nl, dupl(N, " ", Pref),
- write(Pref, "CASE "),
- retract(caseflag(_)),
- asserta(caseflag(1)).
- handle(" OF", N, N1) :-
- caseflag(1),
- retract(caseflag(_)), assertz(caseflag(0)),
- write(" OF"), nl, N1 = N +3,
- dupl(N1, " ", Pref), write(Pref).
- handle(" OF", N, N) :-
- write(" OF ").
-
- out(""):- !.
- out(Str) :-
- frontchar(Str, ';', Rest),
- write(";"), nl,
- indent(M), dupl(M, " ", Pref),
- write(Pref), !,
- match(Rest, [span([""," "]), rtab(0)], [_, W1]),
- out(W1).
- out(Str) :-
- frontchar(Str, A, Rest),
- write(A), out(Rest).
-
- repeat.
- repeat:- not(eof(input)),
- repeat.
- /****************Ende BP5***********************/
-