PB: Beispiel-Aufruf

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" } ;

[pb] [Beispiel]