|
Hier ein Beispiel für eine Pascal-Sourcecode-Formatierung mit PB:
1) Die unformatierte Eingabedatei
Ich habe die Prozedur “GetSym” aus PB selbst als Beispiel
genommen. Diese Prozedur bildet den Symbol-Scanner: Sie
gliedert den Zeichenstrom in logische Symbole, die vom Parser
weiterverarbeitet werden.
{ ---------- Scanner: Zeichenketten -> Symbole ---------- }
procedure GetSym ;
var
zweier : boolean ;
{ -- noetig im Zus. mit autoKommentaren : }
outKommentar_da : boolean ; { true, wenn Kommentar ausgegeben wurde }
autoKommentar_da : boolean ; { dto, autoKommentar }
NewLine_da : boolean ; { true, wenn Eingabe Zeilenende hatte }
Space_da : boolean ; { true, nach Symbol Space folgte }
begin
{ merke Zeile des letzten Tokens }
inLineNr_Prev_Token := inLineNr_This_Token ;
outkommentar_da := false ;
autokommentar_da := false ;
newline_da := false ;
space_da := false ; repeat
sym := '' ;
while (ch = space) or (ch = eoline) do begin
{ -- white-space zeichen ueberspringen }
case ch of
space : begin
if not space_da or not (skipkommentar or spacekompression)
then putchar(' ', true) ; { multi-spaces evtl unterdruecken }
space_da := true ;
end ; eoline : begin
if not autokommentar_da and not outkommentar_da and autodoc
then begin
{ autokommentar vor newline einfuegen, wenn noch keiner da }
if not space_da then putchar(' ', true) ;
putautokommentar ;
autokommentar_da := true ; end ;
space_da := false ; { da neue zeile }
newline_da := true ;
putchar(eoline, false) ; end ;
end ; getchar(ch) ;
end;
inlinenr_this_token := inlinenr ;
{ merke zeilennr. am anfang des tokens.
am ende des tokens ist 'ch' vielleicht schon in der nächsten zeile }
symposin := incolumn ;
sym := sym + ch ; getchar(ch) ;
symart := sa_simple ;
if sym[1] = eofile
then begin symart := sa_structword ; symtoken := _endoffile end
else if sym[1] in ['_', 'a'..'z', 'a'..'z'] then scan_identifier
else if sym[1] in ['0'..'9'] then scan_nummer
else if sym[1] = '''' then scan_stringliteral
else begin
if sym[1] in ['(', '<', '>', ':', '.', '*', '/'] then begin
zweier := false ;
case sym[1] of
'(' : zweier := (ch in ['*', '.']) ;
'<' : zweier := (ch in ['>', '=']) ;
'>' : zweier := (ch = '=') ;
':' : zweier := (ch = '=') ;
'.' : zweier := (ch = '.') ;
'*' : zweier := (ch = '*') ;
'/' : zweier := (ch = '/') ;
end ;
if zweier then begin
sym := sym + ch ; getchar(ch) ;
symart := sa_double ; end ;
end;
if not classifysym(sym, symtoken, symart)
then begin symtoken := _unknown ;
symart := sa_simple ; end ;
end ;
if symart = sa_comment then
outkommentar_da := scan_kommentar ;
{ checken, ob's ein kommentar ist }
until symart <> sa_comment ;
if not newline_da and not autokommentar_da and not outkommentar_da
then putautokommentar ;
instatement := true ; end ;
|
|
2) Die Aufrufzeile
pb.exe /bs /br /i1 /t8 /fi /d6 test_bad.pas test_good.pas
-
Alle Schlüsselworte sollen GROSS geschrieben werden (/bs, /br)
- Pro Eben nur 1 Space einrücken (/i1)
- Tabs auf 8er-Position erweitern (/t8)
-
Identifier so schreiben, wie beim ersten Vorkommen in der Source (/fi)
- Automatische Kommentare nach 6 Zeilen (/d6)
3) Die formatierte Ausgabedatei:
{ ---------- Scanner: Zeichenketten -> Symbole ---------- }
PROCEDURE GetSym ;
VAR
zweier : boolean ;
{ -- noetig im Zus. mit autoKommentaren : }
outKommentar_da : boolean ; { true, wenn Kommentar ausgegeben wurde }
autoKommentar_da : boolean ; { dto, autoKommentar }
NewLine_da : boolean ; { true, wenn Eingabe Zeilenende hatte }
Space_da : boolean ; { true, nach Symbol Space folgte }
BEGIN { "PROCEDURE GetSym" }
{ merke Zeile des letzten Tokens }
inLineNr_Prev_Token := inLineNr_This_Token ;
outKommentar_da := false ;
autoKommentar_da := false ;
NewLine_da := false ;
Space_da := false ; REPEAT
Sym := '' ;
WHILE (ch = SPACE) OR (ch = EOLINE) DO BEGIN
{ -- white-space zeichen ueberspringen }
CASE ch OF
SPACE : BEGIN
IF NOT Space_da OR NOT (skipKommentar OR SpaceKompression)
THEN PutChar(' ', true) ; { multi-spaces evtl unterdruecken }
Space_da := true ;
END ;
EOLINE : BEGIN
IF NOT autoKommentar_da AND NOT outKommentar_da AND autodoc
THEN BEGIN
{ autokommentar vor newline einfuegen, wenn noch keiner da }
IF NOT Space_da THEN PutChar(' ', true) ;
putautokommentar ;
autoKommentar_da := true ;
END ;
Space_da := false ; { da neue zeile }
NewLine_da := true ;
PutChar(EOLINE, false) ;
END { "CASE ch OF EOLINE :" } ;
END { "CASE ch" } ;
getchar(ch) ;
END{ "WHILE (ch = SPACE) OR (ch = EOLINE)" } ;
inLineNr_This_Token := inLineNr ;
{ merke zeilennr. am anfang des tokens.
am ende des tokens ist 'ch' vielleicht schon in der nächsten zeile }
SymPosIn := inColumn ;
Sym := Sym + ch ; getchar(ch) ;
SymArt := sa_simple ;
IF Sym[1] = EOFILE
THEN BEGIN SymArt := sa_structword ; SymToken := _endoffile END
ELSE IF Sym[1] IN ['_', 'a'..'z', 'a'..'z'] THEN scan_identifier
ELSE IF Sym[1] IN ['0'..'9'] THEN scan_nummer
ELSE IF Sym[1] = '''' THEN scan_stringliteral
ELSE BEGIN
IF Sym[1] IN ['(', '<', '>', ':', '.', '*', '/'] THEN BEGIN
zweier := false ;
CASE Sym[1] OF
'(' : zweier := (ch IN ['*', '.']) ;
'<' : zweier := (ch IN ['>', '=']) ;
'>' : zweier := (ch = '=') ;
':' : zweier := (ch = '=') ;
'.' : zweier := (ch = '.') ;
'*' : zweier := (ch = '*') ;
'/' : zweier := (ch = '/') ;
END { "CASE Sym[1]" } ;
IF zweier THEN BEGIN
Sym := Sym + ch ; getchar(ch) ;
SymArt := sa_double ;
END ;
END{ "IF Sym[1] IN ['(', '<', '>', ':', '.', '*', '/']" } ;
IF NOT classifysym(Sym, SymToken, SymArt)
THEN BEGIN
SymToken := _unknown ;
SymArt := sa_simple ;
END ;
END { "IF Sym[1] = '''' ... ELSE" } ;
IF SymArt = sa_comment THEN
outKommentar_da := scan_kommentar ;
{ checken, ob's ein kommentar ist }
UNTIL SymArt <> sa_comment ;
IF NOT NewLine_da AND NOT autoKommentar_da AND NOT outKommentar_da
THEN putautokommentar ;
inStatement := true ;
END { "PROCEDURE GetSym" } ;
|
|
|