home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 05 / pascal / strukto3.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-02  |  26.1 KB  |  753 lines

  1. (*----------------------------------------------------------------------*)
  2. (*                       STRUKTO3.PAS                                   *)
  3. (*              Pascal-Quell-Datei verarbeiten                          *)
  4.  
  5. procedure Source_bearbeiten;
  6. var Wort, Wort_norm,
  7.     Dummy, Begriff     : Text110;
  8.     Source_Zeile       : Text255;
  9.     Verteiler          : integer;
  10.     Source_File        : text;
  11.     File_Ende, Dummy1  : boolean;
  12.  
  13.   procedure Lies_Zeile (var Satz : Text255);
  14.   type Kommentar = Text2;
  15.   var  Ort       : integer;
  16.  
  17.      function Loesche (Satz : Text255) : Text255;
  18.      const Anfu = '''';
  19.      var Ort, Von, Bis  : integer;
  20.          Verbleib, Test : Text110;
  21.          Such           : Text2;
  22.          Anfu_exist     : boolean;
  23.      begin
  24.        Verbleib   := '';
  25.        Ort        := pos (Anfu, Satz);
  26.        Anfu_exist := (Ort > 0);
  27.        if (pos ('{', Satz) in [1..Ort]) or (pos ('(*', Satz) in [1..Ort])
  28.          then Anfu_Exist := false;
  29.        repeat
  30.          if Anfu_exist
  31.            then begin
  32.                   Test := copy (Satz, 1, Ort);
  33.                   delete (Satz, 1, Ort);
  34.                 end
  35.            else begin
  36.                   Test := Satz;
  37.                   Satz := '';
  38.                 end;
  39.          repeat
  40.            Such := '}';
  41.            Von  := pos ('(*', Test);
  42.            if Von = 0
  43.              then Von  := pos ('{', Test)
  44.              else Such := '*)';
  45.            Bis  := pos (Such, Test);
  46.            if ((Ort > Von) and (Von > 0)) and ((Ort < Bis) or (Bis = 0))
  47.              then Anfu_Exist := false;
  48.            if Bis > 0
  49.              then delete (Test, Von, Bis - Von + length (Such))
  50.              else if Von > 0
  51.                     then begin
  52.                            delete (Test, Von, 255);
  53.                            Von      := 0;
  54.                            repeat
  55.                              if Satz = ''
  56.                                then begin
  57.                                       readln (Quell_datei, Satz);
  58.                                       File_Ende := eof (Quell_datei);
  59.                                     end;
  60.                              Bis  := pos (Such, Satz);
  61.                              if Bis = 0
  62.                                then Satz := '';
  63.                            until Bis > 0;
  64.                            delete (Satz,1, Bis + length (Such) - 1);
  65.                            Bis        := 0;
  66.                            Ort        := pos (Anfu,Satz);
  67.                          end;
  68.            if Anfu_exist
  69.              then begin
  70.                     Ort        := pos (Anfu, Satz);
  71.                     Test       := Test + copy (Satz, 1, Ort);
  72.                     delete (Satz, 1, Ort);
  73.                     Ort        := pos (Anfu, Satz);
  74.                   end;
  75.            Anfu_Exist := (Ort > 0);
  76.          until Von + Bis = 0;
  77.          Verbleib := Verbleib + Test;
  78.        until (Test = '') and (Satz = '');
  79.        Loesche := Verbleib;
  80.      end;    (* Loesche *)
  81.  
  82.   begin    (* Lies_Zeile *)
  83.     repeat
  84.       readln (Quell_Datei, Satz);
  85.       File_Ende := eof (Quell_Datei);
  86.       Satz      := Loesche (Satz);
  87.       Ort       := 1;
  88.       while Satz [Ort] = ' ' do
  89.         Ort := succ (Ort);
  90.       delete (Satz, 1, Ort - 1);
  91.       Ort       := length (Satz);
  92.       while Satz [Ort] = ' ' do
  93.         Ort := pred (Ort);
  94.       delete (Satz, Ort + 1, 255);
  95.     until (length (Satz) >= 1) or File_Ende;
  96.   end;    (* Lies_Zeile *)
  97.  
  98.   procedure Wort_finden (var Satz : Text255;var Wort_gross,Wort_norm : Text110;
  99.                                              var Begrenzer : boolean);
  100.   var   k                         : char;
  101.         Zaehler                   : integer;
  102.         Ende, Anfuehrungs_Zeichen : boolean;
  103.         Zwischen                  : Text255;
  104.  
  105.     function Label_Gefunden : boolean;
  106.     var Help, Help1 : LabelPtrTyp;
  107.         A           : Text110;
  108.         Ort         : integer;
  109.     begin
  110.       a    := copy (Wort_Gross, 1, pos (':', Wort_Gross) - 1);
  111.       Help := LabelStart;
  112.       while (Help <> nil) and (a <> Help^.Entry) do
  113.       begin
  114.         Help1 := Help;
  115.         Help  := Help^.Next;
  116.       end;
  117.       if a = Help^.Entry
  118.         then begin
  119.                Ort  := succ (pos (':', Wort_Gross));
  120.                Lab  := ' ' + copy (Wort_norm, 1, pos (':',Wort_norm) - 1)
  121.                                                                      + ' :';
  122.                Satz := copy (Wort_norm, Ort, length (Wort_norm)) + ' ' + Satz;
  123.                if Help = LabelStart
  124.                  then LabelStart  := LabelStart^.Next
  125.                  else Help1^.Next := Help^.Next;
  126.                dispose (Help);
  127.                Label_Gefunden := true;
  128.              end
  129.         else Label_Gefunden := false;
  130.     end;    (* Label_Gefunden *)
  131.  
  132.   begin
  133.     repeat
  134.       Zaehler              := 1;
  135.       Anfuehrungs_Zeichen  := false;
  136.       while Satz [Zaehler] = ' ' do
  137.         Zaehler := succ (Zaehler);
  138.       delete (Satz, 1, Zaehler - 1);
  139.       Zaehler              := 1;
  140.       Wort_gross           := '';
  141.       Wort_norm            := '';
  142.       repeat
  143.         k         := Satz [Zaehler];
  144.         if K = ''''
  145.           then Anfuehrungs_Zeichen := not (Anfuehrungs_Zeichen);
  146.         Begrenzer := not (Anfuehrungs_Zeichen) and
  147.                     ((K = ';') or ((Wort_gross = 'END') and (K = '.')));
  148.         Ende      := Begrenzer or (not (Anfuehrungs_Zeichen) and (K = ' '));
  149.         if not Ende
  150.           then begin
  151.                  Wort_gross := Wort_gross + upcase (K);
  152.                  Wort_norm  := Wort_norm + K;
  153.                  Zaehler    := succ (Zaehler);
  154.                end;
  155.         if Zaehler >= pred (length (Satz))
  156.           then begin
  157.                  Lies_Zeile (Zwischen);
  158.                  Satz       := Satz + ' ' + Zwischen;
  159.                end;
  160.       until Ende;
  161.       if Wort_Gross = 'END'
  162.         then begin
  163.                while (Satz [Zaehler] = ' ') and (Zaehler < length (Satz)) do
  164.                  delete (Satz, Zaehler, 1);
  165.                if not (Satz [Zaehler] in [';', '.'])
  166.                  then insert (' ', Satz, Zaehler);
  167.                insert (' ', Satz, succ (Zaehler));
  168.              end;
  169.       delete (Satz, 1, Zaehler);
  170.     until (Wort <> '') or OF_Fall or File_Ende or Ende;
  171.     if pos (':', Wort_Gross) = 0
  172.       then begin
  173.              Zaehler := 1;
  174.              while (Satz [Zaehler] = ' ') and (Zaehler <= length (Satz)) do
  175.                Zaehler := succ (Zaehler);
  176.              if (Satz [Zaehler] = ':') and (Satz [Zaehler + 1] <> '=')
  177.                then begin
  178.                       Wort_Gross := Wort_Gross + ':';
  179.                       Wort_Norm  := Wort_Norm + ':';
  180.                       delete (Satz, 1, Zaehler);
  181.                     end;
  182.            end;
  183.     if pos (':', Wort_Gross) > 0
  184.       then if Label_Gefunden
  185.              then Wort_Finden (Satz, Wort_Gross, Wort_norm, Begrenzer);
  186.   end;    (* Wort_finden *)
  187.  
  188.   function Wort_isolieren (var Source_Satz : Text255;
  189.                                           Suche : Text110) : Text110;
  190.   var  Ausdruck           : Text110;
  191.        Begrenzer          : boolean;
  192.        Ort, Zahl, Fehler  : integer;
  193.   begin
  194.     Ausdruck     := '';
  195.     repeat
  196.       Wort_finden (Source_Satz, Wort, Wort_norm, Begrenzer);
  197.       if Begrenzer
  198.         then Source_Satz := ' ; ' + Source_Satz;
  199.       Begrenzer := (Wort = Suche);
  200.       Ort := pos (Suche, Wort);
  201.       val (copy (Wort, 1, Ort - 1), Zahl, Fehler);
  202.       if (Ort > 1) and (Fehler = 0)
  203.         then begin
  204.                delete (Wort_Norm, Ort, length (Suche));
  205.                Source_Satz := Suche + ' ' + Source_Satz;
  206.              end;
  207.       if not (Begrenzer)
  208.         then Ausdruck := Ausdruck + ' ' + Wort_norm;
  209.     until Begrenzer;
  210.     Wort_isolieren := Ausdruck;
  211.   end;    (* Wort_isolieren *)
  212.  
  213.   procedure Case_Fall (var Source_Satz : Text255); forward;
  214.  
  215.   procedure Verteile_Schluessel (Begriff : Text110;
  216.                               var Anweisungs_Ende : boolean); forward;
  217.  
  218.   procedure Ende (var Source_Satz : Text255); forward;
  219.  
  220.   procedure Schreibe_Struktur (Zeichen : Text2; Aussage : Text110);
  221.   var Ausgeben : boolean;
  222.   begin
  223.     if (Zeichen = '#P') and (Lab <> '')
  224.       then Schreibe_Struktur ('A', '');
  225.     Ausgeben := Aussage <> ' ';
  226.     if Ausgeben
  227.       then Aussage := Lab + Aussage;
  228.     if STG_Schreiben
  229.       then writeln (STG_Datei, Zeichen : 2, Aussage);
  230.     if Druck_Ziel <> ohne
  231.       then begin
  232.              with Struktur^ do
  233.              begin
  234.                Symbol      :=  Zeichen;
  235.                Bezeichnung :=  copy (Aussage, 2, 255);
  236.                if length (Symbol) > 1
  237.                  then Symbol_schliessen (Symbol [2])
  238.                  else Symbol_auf (Symbol);
  239.              end;
  240.              Zeile := Zeile + 1;
  241.            end
  242.       else write ('.');
  243.     if Ausgeben
  244.       then Lab := '';
  245.   end;    (* Schreibe_Struktur *)
  246.  
  247.   procedure Schleife_Beginnt (Zeichen : char);
  248.   var Schluessel, Dummy : boolean;
  249.       Zwischen          : Blockzeiger;
  250.   begin
  251.     Block^.Zeichen  := Zeichen;
  252.     Zwischen        := Block;
  253.     new (Block);
  254.     Block^.Last     := Zwischen;
  255.     repeat
  256.       Wort_finden (Source_Zeile, Wort, Wort_norm, Dummy);
  257.       Schluessel := (Wort = 'END');
  258.       if not Schluessel
  259.         then Verteile_Schluessel (Wort, Dummy);
  260.     until Schluessel;
  261.     Ende (Source_Zeile);
  262.   end;   (* Schleife_Beginnt *)
  263.  
  264.   procedure Naechstes_Wort (Zeichen : char; var Source_Satz : Text255);
  265.   var   Anweisungs_Ende : boolean;
  266.         Zwischen        : Blockzeiger;
  267.   begin
  268.     Wort_Finden (Source_Satz, Wort, Wort_Norm, Anweisungs_Ende);
  269.     if (Zeichen = 'O') and (Wort = '')
  270.       then begin
  271.              Wort      := '(leer)';
  272.              Wort_Norm := Wort;
  273.            end;
  274.     if Wort = 'BEGIN'
  275.       then Schleife_Beginnt (Zeichen)
  276.       else begin
  277.              Block^.Zeichen := Zeichen;
  278.              Zwischen       := Block;
  279.              new (Block);
  280.              Block^.Last    := Zwischen;
  281.              Verteile_Schluessel (Wort, Anweisungs_Ende);
  282.              Block          := Block^.Last;
  283.              Zeichen        := Block^.Zeichen;
  284.              Wort_Finden (Source_Satz, Wort, Wort_norm, Anweisungs_Ende);
  285.              if Anweisungs_Ende
  286.                then Source_Satz := Wort_norm + ';' + Source_Satz
  287.                else Source_Satz := Wort_norm + ' ' + Source_Satz;
  288.              if (Zeichen = 'I') and  (Wort <> 'ELSE') or (Zeichen <> 'I')
  289.                then if Zeichen = 'O'
  290.                      then Case_Fall (Source_Satz)
  291.                      else begin
  292.                             if Zeichen = 'E'
  293.                               then Zeichen := 'I';
  294.                             if Zeichen <> 'M'
  295.                               then Schreibe_Struktur ('#' + Zeichen, ' ');
  296.                           end;
  297.            end;
  298.   end;    (* Naechstes_Wort *)
  299.  
  300.   function Begriff_Check (Begriff : Text110) : integer;
  301.   var  i       : integer;
  302.        Treffer : boolean;
  303.   begin
  304.     i       := 1;
  305.     Treffer := false;
  306.     while not (Treffer) and (i <> 0) do
  307.       if Schluessel [i].Key = Begriff
  308.         then Treffer := true
  309.         else if Schluessel [i].Key > Begriff
  310.                then i := Schluessel [i].Last
  311.                else i := Schluessel [i].Next;
  312.     Begriff_Check := i;
  313.   end;    (* Begriff_Check *)
  314.  
  315.   procedure Label_Eintragen (var Satz : Text255);
  316.   var Help            : LabelPtrTyp;
  317.       Anweisungs_Ende : boolean;
  318.   begin
  319.     repeat
  320.       Wort_Finden (Satz, Wort, Wort_Norm, Anweisungs_Ende);
  321.       while (pos (',', Wort) > 0) and (Wort <> ',') do
  322.       begin
  323.         new (Help);
  324.         Help^.Next  := LabelStart;
  325.         Help^.Entry := copy (Wort, 1, pos (',', Wort) - 1);
  326.         delete (Wort, 1, pos (',', Wort));
  327.         LabelStart  := Help;
  328.       end;
  329.       if (Wort <> ',') and (Wort <> '')
  330.         then begin
  331.                new (Help);
  332.                Help^.Next  := LabelStart;
  333.                Help^.Entry := Wort;
  334.                LabelStart  := Help;
  335.              end;
  336.      until Anweisungs_Ende;
  337.    end;    (* Label_Eintragen *)
  338.  
  339.   procedure Prog_Proc_Fkt (var  Source_Satz : Text255; Overlays : boolean);
  340.   var  Titel    : Text110;
  341.        Dummy    : boolean;
  342.        Zwischen : Namezeiger;
  343.        Ort      : integer;
  344.   begin
  345.     if Overlays
  346.       then Wort_Finden (Source_Satz, Wort, Titel, Dummy);
  347.     Wort_Finden (Source_Satz, Wort, Titel, Dummy);
  348.     Ort         := pos ('(', Titel);
  349.     if Ort > 0
  350.       then delete (Titel, Ort, 255)
  351.       else begin
  352.              Ort := pos (':', Titel);
  353.              if Ort > 0
  354.                then delete (Titel, Ort, 255);
  355.            end;
  356.     Titel_Zeiger^.Block := 'P';
  357.     Titel_Zeiger^.Name  := ' ' + Titel;
  358.     Zwischen    := Titel_Zeiger;
  359.     new (Titel_Zeiger);
  360.     Titel_Zeiger^.Last  := Zwischen;
  361.     repeat
  362.       Wort_Finden (Source_Satz, Wort, Wort_Norm, Dummy);
  363.       if (Wort = 'FORWARD') or (Wort = 'EXTERNAL')
  364.         then Titel_Zeiger := Titel_Zeiger^.Last;
  365.       if Wort = 'LABEL'
  366.         then Label_Eintragen (Source_Zeile);
  367.     until (Wort = 'BEGIN') or (Wort = 'PROCEDURE') or
  368.           (Wort = 'FUNCTION') or (Wort = 'OVERLAY');
  369.     if Dummy
  370.       then Source_Satz := Wort_norm + ';' + Source_Satz
  371.       else Source_Satz := Wort_Norm + ' ' + Source_Satz;
  372.   end;    (* Prog_Proc_Fkt *)
  373.  
  374.   procedure Unit_Implementation (var Source_Satz : Text255);
  375.   var Titel    :  Text110;
  376.       Dummy    : boolean;
  377.       Zwischen : NameZeiger;
  378.   begin
  379.     Wort_Finden (Source_Satz, Wort, Titel, Dummy);
  380.     Titel_Zeiger^.Block := 'P';
  381.     Titel_Zeiger^.Name  := ' ' + Titel;
  382.     Zwischen            := Titel_Zeiger;
  383.     new (Titel_Zeiger);
  384.     Titel_Zeiger^.Last  := Zwischen;
  385.     repeat
  386.       Wort_Finden (Source_Satz, Wort, Wort_norm, Dummy);
  387.     until Wort = 'IMPLEMENTATION';
  388.     repeat
  389.       Wort_Finden (Source_Satz, Wort, Wort_norm, Dummy);
  390.     until (Wort = 'BEGIN') or (Wort = 'PROCEDURE') or (Wort = 'FUNCTION');
  391.     if Dummy
  392.       then Source_Satz := Wort_norm + ';' + Source_Satz
  393.       else Source_Satz := Wort_norm + ' ' + Source_Satz;
  394.   end;    (* Unit_Implementation *)
  395.  
  396.   procedure Ausdruck (var Source_Satz : Text255);
  397.   var  Schluessel, Anweisungs_Ende : boolean;
  398.        Anweisung                   : Text110;
  399.        Ort, i, Zahl                : integer;
  400.   begin
  401.     Anweisung := '';
  402.     repeat
  403.       Wort_Finden (Source_Satz, Wort, Wort_norm, Anweisungs_Ende);
  404.       Schluessel := (Wort = 'END') or (Wort = 'ELSE') or (Wort = 'UNTIL');
  405.       if not (Schluessel)
  406.         then Anweisung := Anweisung + ' ' + Wort_Norm;
  407.     until Schluessel or Anweisungs_Ende or File_Ende;
  408.     if Schluessel and (Lab <> '')
  409.       then begin
  410.              Anweisung := Anweisung + Lab;
  411.              Lab       := '';
  412.            end;
  413.     if Anweisung <> ' '
  414.       then begin
  415.              Ort      := pos (':=', Anweisung);
  416.              Zahl     := 0;
  417.              for i := 1 to Ort do
  418.                if Anweisung [i] = ''''
  419.                  then Zahl := succ (Zahl);
  420.              if odd (Zahl) or (Ort = 0)
  421.                then Schreibe_Struktur ('U', Anweisung)
  422.                else Schreibe_Struktur ('A', Anweisung);
  423.            end;
  424.     if Schluessel
  425.       then Source_Satz := Wort + ' ' + Source_Satz;
  426.   end;    (* Ausdruck *)
  427.  
  428.   procedure Beginn;
  429.   var  Zwischen : Blockzeiger;
  430.        Name     : Text110;
  431.   begin
  432.     if Titel_Zeiger^.Last = nil
  433.       then begin
  434.              Name           := 'No-Name';
  435.              Block^.Zeichen := 'P';
  436.            end
  437.       else begin
  438.              Titel_Zeiger   := Titel_Zeiger^.Last;
  439.              Name           := Titel_Zeiger^.Name;
  440.              Block^.Zeichen := Titel_Zeiger^.Block;
  441.            end;
  442.     Schreibe_Struktur (Block^.Zeichen, Name);
  443.     Zwischen     := Block;
  444.     new (Block);
  445.     Block^.Last  := Zwischen;
  446.   end;   (* Beginn *)
  447.  
  448.   procedure Ende;
  449.   var  Zeichen         : char;
  450.        Anweisungs_Ende : boolean;
  451.   begin
  452.     if Block^.Last = nil
  453.       then Zeichen := ' '
  454.       else begin
  455.              Block   := Block^.Last;
  456.              Zeichen := Block^.Zeichen;
  457.            end;
  458.     if Zeichen <> 'M'
  459.       then begin
  460.              Wort_Finden (Source_Satz, Wort, Wort_norm, Anweisungs_Ende);
  461.              if Anweisungs_Ende
  462.                then Source_Satz := Wort_norm + ';' + Source_Satz
  463.                else Source_Satz := Wort_norm + ' ' + Source_Satz;
  464.              if (Zeichen = 'I') and (Wort <> 'ELSE') or (Zeichen <> 'I')
  465.                then if Zeichen = 'O'
  466.                       then Case_Fall (Source_Satz)
  467.                       else if Zeichen = 'E'
  468.                              then Schreibe_Struktur ('#I', ' ')
  469.                              else Schreibe_Struktur ('#' + Zeichen, ' ');
  470.            end;
  471.   end;    (* Ende *)
  472.  
  473.   procedure If_Then_Else (var Source_Satz : Text255);
  474.   var  Schluessel : boolean;
  475.   begin
  476.     Schreibe_Struktur ('I', Wort_isolieren (Source_Satz, 'THEN'));
  477.     Schreibe_Struktur ('T', ' ');
  478.     Naechstes_Wort ('I', Source_Satz);
  479.     Wort_finden (Source_Satz, Wort, Wort_norm, Schluessel);
  480.     if Wort = 'ELSE'
  481.       then begin
  482.              Schreibe_Struktur ('E', ' ');
  483.              Naechstes_Wort ('E', Source_Satz);
  484.            end
  485.       else if Schluessel
  486.              then Source_Satz := Wort_norm + ';' + Source_Satz
  487.              else Source_Satz := Wort_norm + ' ' + Source_Satz;
  488.   end;    (* If_Then_Else *)
  489.  
  490.   procedure Case_Of (var Source_Satz : Text255);
  491.   var Verteiler  : Text110;
  492.       Schluessel : boolean;
  493.       Zwischen   : Blockzeiger;
  494.   begin
  495.     Verteiler      := '';
  496.     repeat
  497.       Wort_finden (Source_Satz, Wort, Wort_norm, Schluessel);
  498.       Schluessel := (Wort = 'OF');
  499.       if not (Schluessel)
  500.         then Verteiler := Verteiler + ' ' + Wort_norm;
  501.     until Schluessel;
  502.     Schreibe_Struktur ('C', Verteiler);
  503.     Block^.Zeichen := 'C';
  504.     Zwischen       := Block;
  505.     new (Block);
  506.     Block^.Last    := Zwischen;
  507.     Case_offen     := true;
  508.     Case_Fall (Source_Satz);
  509.   end;    (* Case_Of *)
  510.  
  511.   procedure Case_Fall;
  512.   var Begriff               : Text110;
  513.       Schluessel, Semikolon : boolean;
  514.       Ort                   : integer;
  515.   begin
  516.     Begriff := '';
  517.     repeat
  518.       Wort_finden (Source_Satz, Wort, Wort_norm, Semikolon);
  519.       Schluessel := (Wort = ':');
  520.       Ort := pos (':', Wort);
  521.       if Ort > 1
  522.         then begin
  523.                if Semikolon
  524.                  then Wort_norm := Wort_norm + ';';
  525.                Source_Satz := ': ' + copy (Wort_norm, Ort + 1, 255) + ' '
  526.                                                               + Source_Satz;
  527.                delete (Wort_Norm, Ort, 255);
  528.              end;
  529.       if not (Schluessel)
  530.         then Begriff := Begriff + ' ' + Wort_norm;
  531.     until Schluessel or (Wort = 'ELSE') or (Wort = 'END');
  532.     if Wort <> 'END'
  533.       then begin
  534.              Schreibe_Struktur ('O', Begriff);
  535.              OF_Fall  := true;
  536.              Naechstes_Wort ('O', Source_Satz);
  537.              OF_Fall  := false;
  538.            end
  539.       else begin
  540.              Case_offen := false;
  541.              Ende (Source_Satz);
  542.            end;
  543.   end;    (* Case_Fall *)
  544.  
  545.   procedure While_do (var Source_Satz : Text255);
  546.   begin
  547.     Schreibe_Struktur ('W', Wort_isolieren (Source_Satz, 'DO'));
  548.     Naechstes_Wort ('W', Source_Satz);
  549.   end;    (* While_do *)
  550.  
  551.   procedure For_do (var Source_Satz : Text255);
  552.   var Variable, Beginn,
  553.       Ende, Var1, Indikator : Text110;
  554.       Zahl, Fehler          : integer;
  555.       Dummy, Schluessel     : boolean;
  556.   begin
  557.     Wort_finden (Source_Satz, Wort, Variable, Dummy);
  558.     Zahl := pos (':=', Variable);
  559.     if Zahl > 0
  560.       then begin
  561.              delete (Variable, Zahl, 2);
  562.              Source_Satz  := copy (Variable, Zahl, 255) + ' ' + Source_Satz;
  563.              delete (Variable, Zahl, 255);
  564.            end
  565.       else begin
  566.              Wort_finden (Source_Satz, Wort, Var1, Dummy);
  567.              Source_Satz := copy (Var1, 3, 255) + ' ' + Source_Satz;
  568.            end;
  569.     Beginn   := '';
  570.     repeat
  571.       Wort_finden (Source_Satz, Indikator, Wort_norm, Schluessel);
  572.       Schluessel := (Indikator = 'TO') or (Indikator = 'DOWNTO');
  573.       if not (Schluessel)
  574.         then Beginn := Beginn + ' ' + Wort_norm;
  575.     until Schluessel;
  576.     Ende     := Wort_isolieren (Source_Satz, 'DO');
  577.     Zahl     := 1;
  578.     while Beginn [Zahl] = ' ' do
  579.       Zahl   := succ (Zahl);
  580.     delete (Beginn, 1, Zahl - 1);
  581.     val (Beginn, Zahl, Fehler);
  582.     Var1     := Variable;
  583.     Variable := Variable + ' := ' + Variable;
  584.     if Indikator = 'TO'
  585.     then  begin
  586.             if Fehler = 0
  587.               then begin
  588.                      Zahl   := Zahl - 1;
  589.                      str (Zahl, Beginn);
  590.                    end
  591.               else Beginn := Beginn + ' - 1';
  592.             Variable := Variable + ' + 1';
  593.             Ende     := ' <' + Ende;
  594.           end
  595.     else begin
  596.            if Fehler = 0
  597.              then begin
  598.                     Zahl   := Zahl + 1;
  599.                     str (Zahl, Beginn);
  600.                   end
  601.              else Beginn := Beginn + ' + 1 ';
  602.            Variable := Variable + ' - 1';
  603.            Ende     := ' >' + Ende;
  604.          end;
  605.     Ende     := Var1 + Ende;
  606.     Schreibe_Struktur ('A', ' ' + Var1 + ' := ' + Beginn);
  607.     Schreibe_Struktur ('W', ' ' + Ende);
  608.     Schreibe_Struktur ('A', ' ' + Variable);
  609.     Naechstes_Wort ('W', Source_Satz);
  610.   end;    (* For_Do *)
  611.  
  612.   procedure Repeat_Until (var Source_Satz : Text255);
  613.   var  Zwischen                    : Blockzeiger;
  614.        Ausdruck                    : Text110;
  615.        Schluessel, Anweisungs_Ende,
  616.        Leer_Schleife               : boolean;
  617.        Ort                         : integer;
  618.   begin
  619.     Schreibe_Struktur ('R', ' ');
  620.     Block^.Zeichen  := 'R';
  621.     Zwischen        := Block;
  622.     new (Block);
  623.     Block^.Last     := Zwischen;
  624.     Leer_schleife   := true;
  625.     repeat
  626.       Wort_finden (Source_Satz, Wort, Wort_norm, Anweisungs_Ende);
  627.       Schluessel := (Wort = 'UNTIL');
  628.       Ort        := pos ('UNTIL', Wort);
  629.       if Ort > 1
  630.         then begin
  631.                delete (Wort, Ort, 5);
  632.                delete (Wort_norm, Ort, 5);
  633.                Source_Satz := 'UNTIL ' + Source_Satz;
  634.              end;
  635.       if not Schluessel
  636.         then begin
  637.                Leer_Schleife := false;
  638.                Verteile_Schluessel (Wort, Anweisungs_Ende);
  639.              end;
  640.     until Schluessel;
  641.     if Leer_Schleife
  642.       then Schreibe_Struktur ('A', ' (leer)');
  643.     Ausdruck := '';
  644.     Block    := Block^.Last;
  645.     repeat
  646.       Wort_finden (Source_Satz, Wort, Wort_norm, Anweisungs_Ende);
  647.       Schluessel := (Wort = 'END') or (Wort = 'ELSE') or (Wort = 'UNTIL');
  648.       if not Schluessel
  649.        then Ausdruck := Ausdruck + ' ' + Wort_norm;
  650.     until Schluessel or Anweisungs_Ende;
  651.     Schreibe_Struktur ('#R', Ausdruck);
  652.     if Schluessel
  653.       then Source_Satz := Wort + ' ' + Source_Satz;
  654.   end;    (* Repeat_Until *)
  655.  
  656.   procedure With_Do (var Source_Satz : Text255);
  657.   var Dummy : boolean;
  658.   begin
  659.     repeat
  660.       Wort_finden (Source_Satz, Wort, Wort_norm, Dummy);
  661.     until Wort = 'DO';
  662.     Naechstes_Wort ('M', Source_Satz);
  663.   end;    (* With_Do *)
  664.  
  665.   procedure Go_To (var Source_Satz : Text255);
  666.   var Dummy : boolean;
  667.   begin
  668.     Wort_Finden (Source_Satz, Wort, Wort_norm, Dummy);
  669.     Wort_norm := ' GOTO ' + Wort_norm;
  670.     Schreibe_Struktur ('A', Wort_norm);
  671.   end;    (* Go_To *)
  672.   
  673.   procedure Verteile_Schluessel;
  674.   var Verteiler : integer;
  675.   begin
  676.       Verteiler := Begriff_Check (Begriff);
  677.       case Verteiler of
  678.              1  : Prog_Proc_Fkt (Source_Zeile, true);
  679.              2  : For_do (Source_Zeile);
  680.              3  : Repeat_Until (Source_Zeile);
  681.              4  : Case_of (Source_Zeile);
  682.              5  : Go_to (Source_Zeile);
  683.              7  : While_do (Source_Zeile);
  684.              8  : Beginn;
  685.              9  : Ende (Source_Zeile);
  686.             11  : If_Then_else (Source_Zeile);
  687.             13  : Unit_Implementation (Source_Zeile);
  688.             14  : With_do (Source_Zeile);
  689.       6, 10,12  : Prog_Proc_Fkt (Source_Zeile, false);
  690.              0  : begin
  691.                     if Anweisungs_Ende
  692.                       then Source_Zeile := Wort_norm + '; ' + Source_Zeile
  693.                       else Source_Zeile := Wort_norm + ' ' + Source_Zeile;
  694.                   Ausdruck (Source_Zeile);
  695.                 end;
  696.     end;
  697.   end;    (* Verteile_Schluessel *)
  698.  
  699.   procedure Source_Init;
  700.   var  i  : integer;
  701.   begin
  702.     OF_Fall        := false;
  703.     Lab            := '';
  704.     HProg_Gefunden := false;
  705.     repeat
  706.       Datei_Name (Source_Name, true, 'Quell-Datei', 19);
  707.       assign (Quell_Datei, Source_Name);
  708.       {$I-}  reset (Quell_Datei);   {$I+}
  709.       Datei_Status (Source_Name);
  710.     until Datei_ok or (length (Source_Name) < 2);
  711.     if length (Source_Name) > 1
  712.       then begin
  713.              if STG_schreiben
  714.                then begin
  715.                       Datei_Name (Struktur_Name, false, 'Ausgabe-Datei', 19);
  716.                       if Struktur_Name = ''
  717.                         then begin
  718.                                i             := pos ('.', Source_Name);
  719.                                Struktur_Name := copy (Source_Name, 1, i - 1);
  720.                              end;
  721.                       assign (STG_Datei,  Struktur_Name + '.STG');
  722.                       rewrite (STG_Datei);
  723.                     end;
  724.              new (Block);
  725.              Block^.Last         := nil;
  726.              new (Titel_Zeiger);
  727.              Titel_Zeiger^.Last  := nil;
  728.            end;
  729.   end;    (* Source_Init *)
  730.  
  731. begin
  732.   Source_Init;
  733.   Zeile  := 1;
  734.   if Datei_ok and (Source_Name <> '')
  735.     then begin
  736.            Init_Phase;
  737.            Lies_Zeile (Source_Zeile);
  738.            repeat
  739.              Wort_finden (Source_Zeile, Wort, Wort_norm, Dummy1);
  740.              Verteile_Schluessel (Wort, Dummy1);
  741.            until (length (Source_Zeile) < 2) and File_Ende;
  742.            if STG_Schreiben
  743.              then begin
  744.                     close (STG_Datei);
  745.                     Zu_Lang := true;
  746.                   end;
  747.            Nachlauf;
  748.          end;
  749. end;    (* Source_bearbeiten *)
  750. (*----------------------------------------------------------------------*)
  751. (*                    Ende von STRUKTO3.PAS                             *)
  752.  
  753.