{Notationstypen:  } (*)
  i                     (x)   Integer
  c                     (x)   Cardinal
                         b    Byte
  a                    Arraytypen
  s                    String
  p                    Pointer auf Typ
  (x)                  Extendedtypen
                         zd   TZustandsDeklaration
                         ed   TEreignisdeklaration
                         e    TEreignis
                         c    TCountdown
                         s    TSteuerungsBefehle
                         b    TBefehl
                         u    TUeberGang
                         gd   TGruppenDeklaration
                         gzd  TGruppenZustandsDeklaration
                         gu   TArrayOfGruppenUeberGang
                         dgz  TDecodeGruppenZustand
                     sba      (sbaEIN,sbaAUS)
                     sbr      (sbrSN,sbrWO)
                     sbt      (sbtFuss,sbtAuto)
                     sbf      (sbfRot,sbfGelb,sbfGruen)
                     bt       (btEreignis,btCountdown,btSteuerung)
                     gzds     (gzdsOld,gzdsPositiv,gzdsNegativ)
(*)
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, NewColorMemo, ComCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;  //Dient als Menüleiste
    Label2: TLabel;  //Dient als Menüitem (Öffnen)
    Label1: TLabel;  //Dient als Menüitem (Speichern)
    Label3: TLabel; //Dient als Menüitem (Speichern unter)
    OpenDialog1: TOpenDialog; //Öffnendialog für T-Dateien
    SaveDialog1: TSaveDialog; //Speicher dialog
    memo1: TNewColorMemo;//Eine alte von mir programmierte Komponente für
                         //Syntaxhighlighting, leider reicht der Platz für eine
                         //genaue Beschreibung nicht aus. Sie arbeitet, indem sie den Text in Zeilen aufteilt und jede Zeile zeichenweise analysiert. Wobei zwischen jedem Übergang von Symbolen zu Buchstaben, bzw. zurück der Text zwischen den beiden Übergängen mit einer Keywordsliste vergleicht und ihn dann entweder mit Symbol, Zahl, Kommentar, Textfont zeichnet.
                         //Es fehlen Kommentare, da sie Ursprünglich nicht für Veröffentlichung gedacht war   
    BenHighlighter1: TBenHighlighter; //Eine Komponente die die Fonts für das memo1 festlegt.
    StatusBar1: TStatusBar; //Eine (unbenutzte) Statusbar, am unteren Bildrand
    procedure Label2Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    procedure Label3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen}
    procedure SaveToFile(filename_s:string); //Speichert eine T-Datei
    procedure LoadFromFile(filename_s:string); //Öffnet eine   "
    procedure CompilerToFile(filename_s:string); //Erzeugt ein S-Datei
  public
    { Public-Deklarationen}
  end;
  TIntArray=array of integer; //Ein Array von Zahlen

  TZustandsDeklaration =record name_s: string; end; //Ein Typ für Zustandsdeklarationen
  TArrayOfZustandsDeklaration=array of TZustandsDeklaration;
  TEreignisdeklaration=record name_s:string; end; //Ein Typ für Ereignisdeklarationen
  TArrayOfEreignisdeklaration=array of TEreignisdeklaration;
  TEreignis=record dek_xed:TEreignisdeklaration; end; //Ein Typ für Ereignisauslösungen
  TArrayOfEreignis=array of TEreignis;
  TCountdown=record sekundenwert_cb:byte; end;//Ein Typ für Countersetztungen
  TArrayOfCountdown=array of TCountdown;
  TSteuerungsBefehle=record  //Ein Typ für Steuerbefehle
    Art_sba:(sbaEIN,sbaAUS);  Richtung_sbr:(sbrSN,sbrWO);
    Typ_sbt:(sbtFuss,sbtAuto);  Farbe_sbf:(sbfRot,sbfGelb,sbfGruen);
  end;
  TArrayOfSteuerungsBefehle=array of TSteuerungsBefehle;
  TBefehl=record //Ein allgemeiner Typ für Befehle in Übergängen
    typ_bt:(btEreignis,btCountdown,btSteuerung); ereignisdaten_xe: TEreignis;
    countdowndaten_xc: TCountdown; steurungdaten_xs: TSteuerungsBefehle;
  end;
  TArrayOfBefehl=array of TBefehl;
  TUeberGang=record //Ein Typ für Übergänge
    ZustandVorher_xzd:TZustandsDeklaration; ereignis_xed:TEreignisdeklaration;
    steuerbefehle_ab:TArrayOfBefehl; ZustandNacher_xzd:TZustandsDeklaration;
  end;
  TArrayOfUeberGang=array of TUeberGang;
  TGruppenDeklaration=record //Deklaration einer Gruppe von mehrere Zuständen
    zustands_indexe_ai:TIntArray; name_s:string;
  end;
  TArrayOfGruppenDeklaration=array of TGruppenDeklaration;
  TGruppenZustandsDeklaration=record //Deklaration eines Zustandes aus einer Gruppe von mehreren Zuständen
    gruppe_xgd:TGruppenDeklaration;  status_gzds:(gzdsOld,gzdsPositiv,gzdsNegativ);
    name_s:string;
  end;
  TArrayOfGruppenZustandsDeklaration=array of TGruppenZustandsDeklaration;
  TGruppenUeberGang=record //Ein Typ für Gruppenübergänge
    ZustaendeVorher_agzd:TArrayOfGruppenZustandsDeklaration; ereignis_xed:TEreignisdeklaration;
    steuerbefehle_ab:TArrayOfBefehl; ZustaendeNachher_agzd:TArrayOfGruppenZustandsDeklaration;
  end;
  TArrayOfGruppenUeberGang=array of TGruppenUeberGang;
var
  Form1: TForm1;

implementation

{$R *.DFM}

//Diese Proceduren wandeln den jeweils in ihren Namen genannten Typ in einen
//String um. Bei den ArrayOf-Typen bedeutet der Parameter mitZeilenUmbruch_b,
//ob die einzelnen Typen durch Leerzeilen, oder Leerzeichen getrennt werden sollen.
function ZustandsdeklarationToString(dek:TZustandsDeklaration):string;
begin
  result:='(#ZUSTANDSDEKLARATION '+dek.name_s+')';
end;
function ArrayOfZustandsdeklarationToString(adek:TArrayOfZustandsDeklaration;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(adek)-1 do begin
    Result:=result+ZustandsdeklarationToString(adek[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(adek) >= 0 then Result:=result+ZustandsdeklarationToString(adek[high(adek)] );
end;

function EreignisdeklarationToString(dek:TEreignisdeklaration):string;
begin
   if dek.name_s<>'COUNTDOWN-IST-NULL' then result:='(#EREIGNISDEKLARATION '+dek.name_s+')'
   else result:='';
end;
function ArrayOfEreignisdeklarationToString(adek:TArrayOfEreignisdeklaration;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(adek)-1 do begin
    Result:=result+EreignisdeklarationToString(adek[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(adek) >= 0 then
    Result:=result+EreignisdeklarationToString(adek[high(adek)] );
end;
function EreignisToString(erei:TEreignis):string;
begin
      result:='(#EREIGNIS '+erei.dek_xed.name_s+')';
end;
function ArrayOfEreignisToString(aer:TArrayOfEreignis;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(aer)-1 do begin
    Result:=result+EreignisToString(aer[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(aer) >= 0 then
    Result:=result+EreignisToString(aer[high(aer)] );
end;
function CountdownToString(count:TCountdown):string;
begin
      result:='(#COUNTDOWN '+IntToStr(count.sekundenwert_cb)+')';
end;
function ArrayOfCountdownToString(acount:TArrayOfCountdown;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(acount)-1 do begin
    Result:=result+CountdownToString(acount[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(acount) >= 0 then
    Result:=result+CountdownToString(acount[high(acount)] );
end;
function SteuerbefehlToString(bef_xs:TSteuerungsBefehle):string;
begin
  case bef_xs.Art_sba of
    sbaEIN: result:='(#EIN ';
    else    result:='(#AUS ';
  end;
  case bef_xs.Richtung_sbr of
    sbrSN: result:=result+'#SN ';
    else    result:=result+'#WO ';
  end;
  case bef_xs.Typ_sbt of
    sbtFuss: result:=result+'#F ';
    else    result:=result+'#A ';
  end;
  case bef_xs.Farbe_sbf of
    sbfRot: result:=result+'#ROT)';
    sbfGelb: result:=result+'#GELB)';
    else    result:=result+'#GRÜN)';
  end;
end;
function ArrayOfSteuerbefehleToString(abef:TArrayOfSteuerungsBefehle;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(abef)-1 do begin
    Result:=result+SteuerbefehlToString(abef[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(abef) >= 0 then
    Result:=result+SteuerbefehlToString(abef[high(abef)] );
end;
function BefehlToString(bef:TBefehl):string;
begin
  case bef.typ_bt of
    btEreignis:  result:=EreignisToString(bef.ereignisdaten_xe);
    btCountdown: result:=CountdownToString(bef.countdowndaten_xc);
    else         result:=SteuerbefehlToString(bef.steurungdaten_xs);
  end;
end;
function ArrayOfBefehlToString(abef:TArrayOfBefehl;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(abef)-1 do begin
    Result:=result+BefehlToString(abef[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(abef) >= 0 then
    Result:=result+BefehlToString(abef[high(abef)] );
end;
function UebergangToString(ug:TUeberGang):string;
begin
  Result:='(#ÜBERGANGSDEKLARATION '+ug.ZustandVorher_xzd.name_s+' '+ug.ereignis_xed.name_s+' '+ArrayOfBefehlToString(ug.steuerbefehle_ab,false)+' '+ug.ZustandNacher_xzd.name_s+')';
end;
function ArrayOfUebergangToString(aug:TArrayOfUeberGang;mitZeilenUmbruch_b:boolean):string;
var i:integer;
begin
  Result:='';
  for i:=0 to high(aug)-1 do begin
    Result:=result+UebergangToString(aug[i]);
    if mitZeilenUmbruch_b then result:=result+#13#10
    else result:=result+' ';
  end;
  if high(aug) >= 0 then
    Result:=result+UebergangToString(aug[high(aug)] );
end;
procedure TForm1.SaveToFile(filename_s:string);
begin
  SaveDialog1.FileName:=filename_s;
  OpenDialog1.FileName:=filename_s;
  Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.CompilerToFile(filename_s:string);
type
  //Ein Typ der einen S-Zustand, der durch umwandeln eines T-Zustandes entstanden ist,
  //getrennt in einzelne Gruppenzustände und einmal mit dem S-Nameb enthält
  TDecodeGruppenZustand=record
    ara:TArrayOfGruppenZustandsDeklaration;
    name_s:string;
   end;
 TArrayOfDecodeGruppenZustand=array of TDecodeGruppenZustand;
var sl:TStringList;  //Am Schluss erzeugte Stringliste
    i,j,k,l,m:integer; //Schleifenvariablen
    p1:pchar;  //Pchar zeiger, mit dem der Text beim Einlesen durchlaufen wird
    lastChar:char; //Das jeweils letzte Zeichen (pl[-1])
    ZeilenKommentar_b,blockkommentar_b:boolean; //Aktueller Kommentartyp
    //Befehlslisten
    ZustandsDeklarationen_azd:TArrayOfZustandsDeklaration;
    EreignisDeklarationen_aed:TArrayOfEreignisdeklaration;
    ereignisse_ae: TArrayOfEreignis;
    countdowns_ac:TArrayOfCountdown;
    steuerungsbefehle_as:TArrayOfSteuerungsBefehle;
    uebergange_au:TArrayOfUeberGang;
    ZustandsGruppen_agd:TArrayOfGruppenDeklaration;
    GruppenZustaende_agzd:TArrayOfGruppenZustandsDeklaration;
    GruppenUeberGaenge_agu:TArrayOfGruppenUeberGang;

    CaretInAnweisung_b:boolean; //Information zur Caretumgebung
    CaretInUeberGang_b,CaretInGruppenUeberGang_b:boolean; //" " "
    //Informationen zum aktuellen Übergang
    EreignisGelesen_b,ZustaendeGelesen_b,EinZustandGelesen_b:boolean;
    //Informationen zum aktuellen Befehls-Typ
    typ_at:(atUnbekannt,atZustandsDeklaration,atEreignisDeklaration,atEreignis,atCountdown,atSteuerungsBefehle,atUebergang,atZustandsGruppe,atGruppenzustand,atGruppenUeberGang);
    anweisungText_s:string; //Text innerhalb der Anweisung
    letzterUeberGang_pu:^TUeberGang; //Zur vereinfachung ein Zeiger auf den aktuellen Übergang
    letzterGruppenUeberGang_pgu:^TGruppenUeberGang;//" " " " " " " Gruppenübergang
    temperdek_xed:TEreignisdeklaration; //Temporäre Ereignisdeklaration
    tempsteubef_xs:TSteuerungsBefehle; //Temporärer Sreuerbefehl
    Schleifenvariablen_ai:TIntArray; //Schleifenvariablen beim Durchlaufen der rekursiven Funktion
    PosImZustandsArray_i,PosImGruppenZustandsArray_i:integer; //Position im jeweiligen Array
    init_b:boolean; //Erster Aufruf von GenerateOldSZustaendeRek?
    decodeGruppenZustaende_adgz:TArrayOfDecodeGruppenZustand; //Liste von decode-Zuständen
    //Informationen zu Gruppenübergängen bei Erzeugen von S-Übergängen
    GruppeMitPlusMarkiert_b,MitPlusErlaubt_b,Mit_MinusVerboten_b,ZustandErlaubt_b,GruppeErwaehnt_b:boolean;
    //Informationen zu Kommentaren
    InBlockKommentar_b,InZeilenKommentar_b:boolean;
    zeile_i:integer;
    //Erzeugt alle möglichen (alten) Zustände aus den neuen Gruppenzuständen
    //Ähnelt verschachtelten For-Schleifen
    procedure GenerateOldSZustaendeRek(gruppe_i:integer);
    var i,j:integer;
    begin
      if gruppe_i>high(ZustandsGruppen_agd) then exit;
      if init_b then begin //Erster Aufruf?
        //Schleifenvariablenlänge auf die Länge des Zustandgruppenarray setzten, damit
        //es möglich ist von den aufgerufenen Procedures auf die Schleifenvariablen
        //der aufrufenden Procedures zuzugreifen:
        setLength(Schleifenvariablen_ai,length(ZustandsGruppen_agd));
        //Laufvariablen auf die Startwerte setzten
        PosImZustandsArray_i:=high(ZustandsDeklarationen_azd)+1;
        PosImGruppenZustandsArray_i:=0;
        j:=1;
        //Die Anzahl der Gruppenzustände pro jede Gruppe mit einander multipliezieren,
        //um die Anzahl aller Kombination von Gruppenzuständen zu ermitteln.
        for i:=0 to high(schleifenVariablen_ai) do begin
          j:=j*(length(zustandsgruppen_agd[i].Zustands_indexe_ai){+1});
        end;
        //Zustände um die Anzahl der Kombination erhöhen.
        setlength(ZustandsDeklarationen_azd,length(ZustandsDeklarationen_azd)+j);
        setlength(decodeGruppenZustaende_adgz,j);
        init_b:=false;
      end;
      //Alle Zustände in der Gruppe durchlaufen
      for i:=0 to high(ZustandsGruppen_agd[gruppe_i].Zustands_indexe_ai) do begin
        Schleifenvariablen_ai[gruppe_i]:=i; //Schleifenvariable für die anderen Proceduren verfügbar machen
        if gruppe_i<high(SchleifenVariablen_ai) then
          GenerateOldSZustaendeRek(gruppe_i+1) //Nächste Gruppe ebenfalls durchlaufen
         else begin
          //Alle Gruppen durchlaufen, aktive Gruppenzustände speichern
          ZustandsDeklarationen_azd[PosImZustandsArray_i].name_s:='AZ';
          setlength(decodeGruppenZustaende_adgz[PosImGruppenZustandsArray_i].ara,length(schleifenvariablen_ai));
          for j:=0 to high(Schleifenvariablen_ai) do begin
            //Namen für die S-Zustände generieren.
            ZustandsDeklarationen_azd[PosImZustandsArray_i].name_s:=ZustandsDeklarationen_azd[PosImZustandsArray_i].name_s+'-'+GruppenZustaende_agzd[ZustandsGruppen_agd[j].zustands_indexe_ai[Schleifenvariablen_ai[j]]].name_s;
            //Gruppenzustände als decode-Gruppen-Zustände speichern
            decodeGruppenZustaende_adgz[PosImGruppenZustandsArray_i].ara[j].gruppe_xgd.name_s:=ZustandsGruppen_agd[j].name_s;
            decodeGruppenZustaende_adgz[PosImGruppenZustandsArray_i].ara[j].name_s:=GruppenZustaende_agzd[ZustandsGruppen_agd[j].zustands_indexe_ai[Schleifenvariablen_ai[j]]].name_s;
          end;
          //Namen für die S-Zustände als decode-Gruppen-Zustands-Name
          decodeGruppenZustaende_adgz[PosImGruppenZustandsArray_i].name_s:=ZustandsDeklarationen_azd[PosImZustandsArray_i].name_s;
          //Positionen in den Zustandsarray erhöhen
          inc(PosImZustandsArray_i);
          inc(PosImGruppenZustandsArray_i);
         end;
      end;
    end;

    
begin
  sl:=Tstringlist.create;
  try
    if memo1.lines.text[length(memo1.lines.text)]<>#0 then memo1.lines.text:=memo1.lines.text+#0;
    p1:=memo1.lines.GetText;
    lastChar:=#0;
    ZeilenKommentar_b:=false;
    blockkommentar_b:=false;
    CaretInAnweisung_b:=false;
    CaretInUeberGang_b:=false;
    CaretInGruppenUeberGang_b:=false;
    letzterUeberGang_pu:=nil;
    letzterGruppenUeberGang_pgu:=nil;
    anweisungText_s:='';
    typ_at:=atUnbekannt;
    setLength(ZustandsDeklarationen_azd,0);
    setLength(EreignisDeklarationen_aed,0);
    setLength(ereignisse_ae,0);
    setLength(countdowns_ac,0);
    setLength(steuerungsbefehle_as,0);
    setLength(uebergange_au,0);
    setLength(ZustandsGruppen_agd,0);
    setLength(GruppenZustaende_agzd,0);
    setLength(GruppenUeberGaenge_agu,0);
    InBlockKommentar_b:=false;
    InZeilenKommentar_b:=false;
    zeile_i:=1;
    while p1[0] <> #0 do begin
      if (p1[0]=#13) then inc(zeile_i);
      if (p1[0]=#13)and(InZeilenKommentar_b) then begin
        InZeilenKommentar_b:=false;
        lastChar:=p1[0];
        inc(p1);
        continue;
      end;
      if (p1[0] in [' ',#13,#10])and(lastChar in [' ',#13,#10]) then begin
        lastChar:=p1[0];
        inc(p1);
        continue;
      end;
      if (p1[0]='{') then
        Inblockkommentar_b:=true;
      if (p1[0]='}')and(InBlockKommentar_b) then begin
        InBlockKommentar_b:=false;
        lastChar:=p1[0];
        inc(p1);
        continue;
      end;
      if (p1[0]='/') and (lastChar='/') then
        InZeilenKommentar_b:=true;
      if InZeilenKommentar_b or InBlockKommentar_b then begin
        lastChar:=p1[0];
        inc(p1);
        continue;
      end;
      if (p1[0]='/') then begin
        lastChar:=p1[0];
        inc(p1);
        continue;
      end;
      if CaretInAnweisung_b or CaretInUeberGang_b or CaretInGruppenUeberGang_b then begin

        anweisungText_s:=anweisungText_s+p1[0];
        if  typ_at=atUnbekannt then begin
          if anweisungText_s='#ZUSTANDSDEKLARATION ' then begin
            typ_at:=atZustandsDeklaration;
            setLength(ZustandsDeklarationen_azd,length(ZustandsDeklarationen_azd)+1);
            anweisungText_s:='';
          end;
          if anweisungText_s='#EREIGNISDEKLARATION ' then begin
            typ_at:=atEreignisDeklaration;
            setLength(EreignisDeklarationen_aed,length(EreignisDeklarationen_aed)+1);
            anweisungText_s:='';
          end;
          if anweisungText_s='#EREIGNIS ' then begin
            typ_at:=atEreignis;
            if CaretInUeberGang_b then begin
              setLength(letzterUebergang_pu^.steuerbefehle_ab,length(letzterUebergang_pu^.steuerbefehle_ab)+1);
              letzterUeberGang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].typ_bt:=btEreignis;
            end else if CaretInGruppenUeberGang_b then begin
              setLength(letzterGruppenUebergang_pgu^.steuerbefehle_ab,length(letzterGruppenUebergang_pgu^.steuerbefehle_ab)+1);
              letzterGruppenUeberGang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].typ_bt:=btEreignis;
            end else
              setLength(ereignisse_ae,length(ereignisse_ae)+1);
              anweisungText_s:='';
          end;
          if anweisungText_s='#COUNTDOWN ' then begin
            typ_at:=atCountdown;
            if CaretInUeberGang_b then begin
              setLength(letzterUebergang_pu^.steuerbefehle_ab,length(letzterUebergang_pu^.steuerbefehle_ab)+1);
              letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].typ_bt:=btCountdown;
            end else if CaretInGruppenUeberGang_b then begin
              setLength(letzterGruppenUebergang_pgu^.steuerbefehle_ab,length(letzterGruppenUebergang_pgu^.steuerbefehle_ab)+1);
              letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].typ_bt:=btCountdown;
            end else
              setLength(countdowns_ac,length(countdowns_ac)+1);
            anweisungText_s:='';
          end;
          if anweisungText_s='#EIN ' then begin
            typ_at:=atSteuerungsBefehle;
            if CaretInUeberGang_b then begin
              setLength(letzterUebergang_pu^.steuerbefehle_ab,length(letzterUebergang_pu^.steuerbefehle_ab)+1);
              letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].typ_bt:=btSteuerung;
              letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].steurungdaten_xs.Art_sba:=sbaEIN;
            end else if CaretInGruppenUeberGang_b then begin
              setLength(letzterGruppenUebergang_pgu^.steuerbefehle_ab,length(letzterGruppenUebergang_pgu^.steuerbefehle_ab)+1);
              letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].typ_bt:=btSteuerung;
              letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].steurungdaten_xs.Art_sba:=sbaEIN;
            end else begin
              setLength(steuerungsbefehle_as,length(steuerungsbefehle_as)+1);
              steuerungsbefehle_as[high(steuerungsbefehle_as)].Art_sba:=sbaEIN;
            end;
            anweisungText_s:='';
          end;
          if anweisungText_s='#AUS ' then begin
            typ_at:=atSteuerungsBefehle;
            if CaretInUeberGang_b then begin
              setLength(letzterUebergang_pu^.steuerbefehle_ab,length(letzterUebergang_pu^.steuerbefehle_ab)+1);
              letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].typ_bt:=btSteuerung;
              letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].steurungdaten_xs.Art_sba:=sbaAUS;
            end else if CaretInGruppenUeberGang_b then begin
              setLength(letzterGruppenUebergang_pgu^.steuerbefehle_ab,length(letzterGruppenUebergang_pgu^.steuerbefehle_ab)+1);
              letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].typ_bt:=btSteuerung;
              letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].steurungdaten_xs.Art_sba:=sbaAUS;
            end else begin
              setLength(steuerungsbefehle_as,length(steuerungsbefehle_as)+1);
              steuerungsbefehle_as[high(steuerungsbefehle_as)].Art_sba:=sbaAUS;
            end;
            anweisungText_s:='';
          end;
          if anweisungText_s='#ÜBERGANGSDEKLARATION ' then begin
            typ_at:=atUebergang;
            setLength(uebergange_au,length(uebergange_au)+1);
            SetLength(uebergange_au[high(uebergange_au)].steuerbefehle_ab,0);
            letzterUebergang_pu:=@uebergange_au[high(uebergange_au)];
            anweisungText_s:='';
            CaretInAnweisung_b:=false;
            CaretInUeberGang_b:=true;
            EreignisGelesen_b:=false;
            ZustaendeGelesen_b:=false;
          end;
          if anweisungText_s='#GruppenDEKLARATION ' then begin
            typ_at:=atZustandsGruppe;
            setLength(ZustandsGruppen_agd,length(ZustandsGruppen_agd)+1);
            anweisungText_s:='';
          end;
          if anweisungText_s='#GruppenZUSTANDSDEKLARATION ' then begin
            typ_at:=atGruppenzustand;
            setLength(GruppenZustaende_agzd,length(GruppenZustaende_agzd)+1);
            GruppenZustaende_agzd[high(GruppenZustaende_agzd)].gruppe_xgd.name_s:=#0;
            anweisungText_s:='';
          end;
          if anweisungText_s='#GruppenÜBERGANGSDEKLARATION ' then begin
            typ_at:=atGruppenUeberGang;
            setLength(GruppenUeberGaenge_agu,length(GruppenUeberGaenge_agu)+1);
            setLength(GruppenUeberGaenge_agu[high(GruppenUeberGaenge_agu)].steuerbefehle_ab,0);
            setLength(GruppenUeberGaenge_agu[high(GruppenUeberGaenge_agu)].ZustaendeVorher_agzd,0);
            setLength(GruppenUeberGaenge_agu[high(GruppenUeberGaenge_agu)].ZustaendeNachher_agzd,0);
            letzterGruppenUebergang_pgu:=@GruppenUeberGaenge_agu[high(GruppenUeberGaenge_agu)];
            CaretInAnweisung_b:=false;
            CaretInGruppenUeberGang_b:=true;
            EreignisGelesen_b:=false;
            ZustaendeGelesen_b:=false;
            EinZustandGelesen_b:=false;

            anweisungText_s:='';
          end;
        end else begin
          case typ_at of
            atZustandsDeklaration: if (p1[0] in [')',' ',#13,#10]) then begin
                                     ZustandsDeklarationen_azd[high(ZustandsDeklarationen_azd)].name_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                                   end;
            atEreignisDeklaration: if (p1[0] in [')',' ',#13,#10]) then begin
                                     EreignisDeklarationen_aed[high(EreignisDeklarationen_aed)].name_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                                   end;
            atEreignis:            if (p1[0] in [')',' ',#13,#10]) then begin
                                     temperdek_xed.name_s:=#0;
                                     anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                                     for i:=0 to high(EreignisDeklarationen_aed) do begin
                                       if EreignisDeklarationen_aed[i].name_s=anweisungText_s then
                                         temperdek_xed:=EreignisDeklarationen_aed[i];
                                     end;
                                     if temperdek_xed.name_s=#0 then begin
                                       showmessage('Ereignisdeklaration >'+anweisungText_s+'< wurde nicht gefunden in Zeile '+IntToStr(zeile_i));
                                       exit;
                                     end;
                                     if CaretInUeberGang_b then
                                       letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].ereignisdaten_xe.dek_xed:=temperdek_xed
                                      else if CaretInGruppenUeberGang_b then
                                       letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].ereignisdaten_xe.dek_xed:=temperdek_xed
                                      else
                                       ereignisse_ae[high(ereignisse_ae)].dek_xed:=temperdek_xed;
                                   end;
            atCountdown:           if (p1[0] in [')',' ',#13,#10]) then begin
                                     if CaretInUeberGang_b then
                                      letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].countdowndaten_xc.sekundenwert_cb:=StrToInt(copy(anweisungText_s,1,length(anweisungText_s)-1))
                                     else if CaretInGruppenUeberGang_b then
                                       letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].countdowndaten_xc.sekundenwert_cb:=StrToInt(copy(anweisungText_s,1,length(anweisungText_s)-1))
                                     else
                                       countdowns_ac[high(countdowns_ac)].sekundenwert_cb:=StrToInt(copy(anweisungText_s,1,length(anweisungText_s)-1));
                                   end;
            atsteuerungsbefehle: begin
                                   if (p1[0] in [')',' ',#13,#10]) then begin
                                     if CaretInUeberGang_b then
                                       tempsteubef_xs:=letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].steurungdaten_xs
                                      else if CaretInGruppenUeberGang_b then
                                       tempsteubef_xs:=letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].steurungdaten_xs
                                      else
                                       tempsteubef_xs:=steuerungsbefehle_as[high(steuerungsbefehle_as)];
                                     anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                                     if anweisungText_s='#WO' then
                                       tempsteubef_xs.Richtung_sbr:=sbrWO;
                                     if anweisungText_s='#SN' then
                                       tempsteubef_xs.Richtung_sbr:=sbrSN;
                                     if anweisungText_s='#F' then
                                       tempsteubef_xs.Typ_sbt:=sbtFuss;
                                     if anweisungText_s='#A' then
                                       tempsteubef_xs.Typ_sbt:=sbtAuto;
                                     if anweisungText_s='#ROT' then
                                       tempsteubef_xs.Farbe_sbf:=sbfRot;
                                     if anweisungText_s='#GELB'then
                                       tempsteubef_xs.Farbe_sbf:=sbfGelb;
                                     if anweisungText_s='#GRÜN' then
                                       tempsteubef_xs.Farbe_sbf:=sbfGruen;
                                     if CaretInUeberGang_b then
                                       letzterUebergang_pu^.steuerbefehle_ab[high(letzterUebergang_pu^.steuerbefehle_ab)].steurungdaten_xs:=tempsteubef_xs
                                      else if CaretInGruppenUeberGang_b then
                                       letzterGruppenUebergang_pgu^.steuerbefehle_ab[high(letzterGruppenUebergang_pgu^.steuerbefehle_ab)].steurungdaten_xs:=tempsteubef_xs
                                      else
                                       steuerungsbefehle_as[high(steuerungsbefehle_as)]:=tempsteubef_xs;
                                      anweisungText_s:='';
                                   end;
                                 end;
            atZustandsGruppe: begin
                                if (p1[0] in [')',' ',#13,#10]) then begin
                                  anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                                  ZustandsGruppen_agd[high(ZustandsGruppen_agd)].name_s:=anweisungText_s;
                                  setlength(ZustandsGruppen_agd[high(ZustandsGruppen_agd)].zustands_indexe_ai,0)
                                end;
                              end;
            atGruppenzustand: begin
                                if (p1[0] in [')',' ',#13,#10]) then begin
                                  anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                                  if GruppenZustaende_agzd[high(GruppenZustaende_agzd)].gruppe_xgd.name_s=#0 then begin
                                    for i:=0 to high(ZustandsGruppen_agd) do begin
                                      if ZustandsGruppen_agd[i].name_s=anweisungText_s then begin
                                        setlength(ZustandsGruppen_agd[i].zustands_indexe_ai,length(ZustandsGruppen_agd[i].zustands_indexe_ai)+1);
                                        ZustandsGruppen_agd[i].zustands_indexe_ai[high(ZustandsGruppen_agd[i].zustands_indexe_ai)]:=high(GruppenZustaende_agzd);
                                        GruppenZustaende_agzd[high(GruppenZustaende_agzd)].gruppe_xgd:=ZustandsGruppen_agd[i];
                                      end;
                                    end;
                                    if GruppenZustaende_agzd[high(GruppenZustaende_agzd)].gruppe_xgd.name_s=#0 then begin
                                      ShowMessage('Gruppe namens '+anweisungText_s+' wurde nicht gefunden in Zeile '+IntToStr(zeile_i));
                                      exit;
                                    end;
                                    anweisungText_s:='';
                                  end else begin
                                    GruppenZustaende_agzd[high(GruppenZustaende_agzd)].name_s:=anweisungText_s;
                                  end;
                                end;
                              end;
          end;
          if CaretInUeberGang_b and not CaretInAnweisung_b then begin
            if (p1[0] in [')',' ',#13,#10])and(length(anweisungText_s)>1)  then begin
              if ZustaendeGelesen_b =false then begin
                anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                uebergange_au[high(uebergange_au)].ZustandVorher_xzd.name_s:=#0;
                for i:=0 to high(zustandsdeklarationen_azd) do begin
                  if ZustandsDeklarationen_azd[i].name_s=anweisungText_s then
                    uebergange_au[high(uebergange_au)].ZustandVorher_xzd:=zustandsdeklarationen_azd[i];
                end;
                if uebergange_au[high(uebergange_au)].ZustandVorher_xzd.name_s=#0 then begin
                  ShowMessage('Zustandsdeklaration >'+anweisungText_s+'< wurde nicht gefunden in Zeile '+IntToStr(zeile_i));
                  exit;
                end;
                ZustaendeGelesen_b:=true;
                anweisungText_s:='';
              end else if not EreignisGelesen_b then begin
                anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                uebergange_au[high(uebergange_au)].ereignis_xed.name_s:=#0;
                for i:=0 to high(EreignisDeklarationen_aed) do begin
                  if EreignisDeklarationen_aed[i].name_s=anweisungText_s then
                    uebergange_au[high(uebergange_au)].ereignis_xed:=EreignisDeklarationen_aed[i];
                end;
                if uebergange_au[high(uebergange_au)].ereignis_xed.name_s=#0 then begin
                  ShowMessage('Ereignisdeklaration >'+anweisungText_s+'< wurde nicht gefunden in Zeile '+IntToStr(zeile_i));
                  exit;
                end;
                EreignisGelesen_b:=true;
                anweisungText_s:='';
              end else begin
                if anweisungText_s<>' ' then begin
                  anweisungText_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                  uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=#0;
                  for i:=0 to high(zustandsdeklarationen_azd) do begin
                    if zustandsdeklarationen_azd[i].name_s=anweisungText_s then
                      uebergange_au[high(uebergange_au)].ZustandNacher_xzd:=zustandsdeklarationen_azd[i];
                  end;
                  if uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s=#0 then begin
                    ShowMessage('Zustandsdeklaration >'+anweisungText_s+'< wurde nicht gefunden in Zeile '+IntToStr(zeile_i));
                    exit;
                  end;
                  anweisungText_s:='';
                end else
                  anweisungText_s:='';
              end;
            end;
          end;
          if CaretInGruppenUeberGang_b and not CaretInAnweisung_b then begin
            if not (anweisungText_s[1] in [')',' ',#13,#10]) then begin
              if (p1[0] in [')',' ',#13,#10])and(length(anweisungText_s)>1) then begin
                if not EreignisGelesen_b then begin
                  if anweisungText_s[1] = '*' then begin
                    EinZustandGelesen_b:=true;
                    ZustaendeGelesen_b:=true;
                    anweisungText_s:='';
                  end else begin
                    setLength(letzterGruppenUebergang_pgu^.ZustaendeVorher_agzd,length(letzterGruppenUebergang_pgu^.ZustaendeVorher_agzd)+1);
                    case anweisungText_s[1] of
                      '+':letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].status_gzds:=gzdsPositiv;
                      '-':letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].status_gzds:=gzdsNegativ;
                      else if EinZustandGelesen_b then begin
                             letzterGruppenUebergang_pgu.ereignis_xed.name_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                             ZustaendeGelesen_b:=true;
                             EreignisGelesen_b:=true;
                           end else
                             letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].status_gzds:=gzdsOld;
                    end;
                    if letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].status_gzds = gzdsOld then begin
                      letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].name_s:=anweisungText_s;
                      ZustaendeGelesen_b:=true;
                      if EinZustandGelesen_b then
                        setLength(letzterGruppenUebergang_pgu^.ZustaendeVorher_agzd,length(letzterGruppenUebergang_pgu^.ZustaendeVorher_agzd)-1);
                    end else begin
                      letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].gruppe_xgd.name_s:=copy(anweisungText_s,2,pos('''',anweisungText_s)-2);
                      letzterGruppenUebergang_pgu.ZustaendeVorher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeVorher_agzd)].name_s:=copy(anweisungText_s,pos('''',anweisungText_s)+1,length(anweisungText_s)-pos('''',anweisungText_s)-1);
                    end;
                    EinZustandGelesen_b:=true;
                    anweisungText_s:='';
                  end;
                end else
                if EreignisGelesen_b then begin
                  setLength(letzterGruppenUebergang_pgu^.ZustaendeNachher_agzd,length(letzterGruppenUebergang_pgu^.ZustaendeNachher_agzd)+1);
                  case anweisungText_s[1] of
                    '+': letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].status_gzds:=gzdsPositiv;
                    '-': letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].status_gzds:=gzdsNegativ;
                    else letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].status_gzds:=gzdsOld;
                  end;
                  if letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].status_gzds = gzdsOld then begin
                    letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].name_s:=copy(anweisungText_s,1,length(anweisungText_s)-1);
                  end else begin
                    letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].gruppe_xgd.name_s:=copy(anweisungText_s,2,pos('''',anweisungText_s)-2);
                    letzterGruppenUebergang_pgu.ZustaendeNachher_agzd[high(letzterGruppenUebergang_pgu.ZustaendeNachher_agzd)].name_s:=copy(anweisungText_s,pos('''',anweisungText_s)+1,length(anweisungText_s)-pos('''',anweisungText_s)-1);
                  end;
                  anweisungText_s:='';
                end;
              end;
            end else
              anweisungText_s:='';
          end;
          if (p1[0] = ')')then begin
            anweisungText_s:='';
            typ_at:=atUnbekannt;
            if CaretInAnweisung_b = false then begin
              CaretInUeberGang_b:=false;
              CaretInGruppenUeberGang_b:=false;
            end;
            if CaretInUeberGang_b then
              typ_at:=atUebergang;
            if CaretInGruppenUeberGang_b then
              typ_at:=atGruppenUebergang;
            CaretInAnweisung_b:=false;
          end;
        end;
      end;
      if p1[0]='(' then begin
        anweisungText_s:='';
        typ_at:=atUnbekannt;
        CaretInAnweisung_b:=true;
      end;
      if (length(anweisungText_s)=1) and (anweisungText_s[1] in [' ',#13,#10]) then
        anweisungText_s:='';
      lastChar:=p1[0];
      inc(p1);
    end;
    init_b:=true;
    GenerateOldSZustaendeRek(0);
    for i:=0 to high(GruppenUeberGaenge_agu) do begin

      if (length(GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd)>0)and(GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[0].status_gzds=gzdsOld) then begin
        setLength(uebergange_au,length(uebergange_au)+1);
        uebergange_au[high(uebergange_au)].ZustandVorher_xzd.name_s:=GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[0].name_s;
        uebergange_au[high(uebergange_au)].ereignis_xed:=GruppenUeberGaenge_agu[i].ereignis_xed;
        uebergange_au[high(uebergange_au)].steuerbefehle_ab:=GruppenUeberGaenge_agu[i].steuerbefehle_ab;
        uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:='AZ';
        if GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[0].status_gzds=gzdsOld then 
          uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[0].name_s
         else begin
           for j:=0 to high(ZustandsGruppen_agd) do begin
             for k:=0 to high(GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd) do begin
               if GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[k].gruppe_xgd.name_s=ZustandsGruppen_agd[j].name_s then begin
                 uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s+{'-'+GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[j].name+}'-'+GruppenUeberGaenge_agu[i].ZustaendeNAchher_agzd[k].name_s;
                 break;
               end;
             end;
           end;
         end;
      end else begin
        //Für jeden Übergang feststellen, ob er zur jeweiligen Bedingung passt
        for j:=0 to high (decodeGruppenZustaende_adgz) do begin
          ZustandErlaubt_b:=true;
          for k:=0 to high(decodeGruppenZustaende_adgz[j].ara) do begin
            MitPlusErlaubt_b:=false;
            GruppeMitPlusMarkiert_b:=false;
            Mit_MinusVerboten_b:=false;
            GruppeErwaehnt_b:=false;
            for l:=0 to high(GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd) do begin
              if GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[l].gruppe_xgd.name_s=decodeGruppenZustaende_adgz[j].ara[k].gruppe_xgd.name_s then begin
                GruppeErwaehnt_b:=true;
                if GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[l].status_gzds=gzdsPositiv then
                  GruppeMitPlusMarkiert_b:=true;
                if GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[l].name_s = decodeGruppenZustaende_adgz[j].ara[k].name_s then begin
                  if GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[l].status_gzds=gzdsPositiv then
                    MitPlusErlaubt_b:=true;
                  if GruppenUeberGaenge_agu[i].ZustaendeVorher_agzd[l].status_gzds=gzdsNegativ then
                    Mit_MinusVerboten_b:=true;
                end;
              end;
            end;
            ZustandErlaubt_b:=(not ((GruppeMitPlusMarkiert_b xor MitPlusErlaubt_b) or Mit_MinusVerboten_b)) or not GruppeErwaehnt_b;
            if ZustandErlaubt_b=false then break;
          end;
          if ZustandErlaubt_b then begin
            setLength(uebergange_au,length(uebergange_au)+1);
            uebergange_au[high(uebergange_au)].ZustandVorher_xzd.name_s:=decodeGruppenZustaende_adgz[j].name_s;
            uebergange_au[high(uebergange_au)].ereignis_xed:=GruppenUeberGaenge_agu[i].ereignis_xed;
            uebergange_au[high(uebergange_au)].steuerbefehle_ab:=GruppenUeberGaenge_agu[i].steuerbefehle_ab;
            if GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[0].status_gzds=gzdsOld then
              uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[0].name_s
             else begin
              uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:='AZ';
              for l:=0 to high(ZustandsGruppen_agd) do begin
                uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s+'-'{+ZustandsGruppen_agd[l].name+'-'};
                for m:=0 to high(GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd) do begin
                  if GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[m].gruppe_xgd.name_s=ZustandsGruppen_agd[l].name_s then
                    uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s+GruppenUeberGaenge_agu[i].ZustaendeNachher_agzd[m].name_s;
                end;
                if uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s[length(uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s)]='-' then
                  uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s:=uebergange_au[high(uebergange_au)].ZustandNacher_xzd.name_s+decodeGruppenZustaende_adgz[j].ara[l].name_s;
              end;
            end;
          end;
        end;
      end;
//      Inc(PosImUeberGangsArray_i);
    end;
    if length(zustandsdeklarationen_azd)>0 then
      sl.add(ArrayOfZustandsdeklarationToString(zustandsdeklarationen_azd,true));
    if length(EreignisDeklarationen_aed)>0 then
      sl.add(ArrayOfEreignisdeklarationToString(EreignisDeklarationen_aed,true));
    if length(ereignisse_ae)>0 then
      sl.add(ArrayOfEreignisToString(ereignisse_ae,true));
    if length(countdowns_ac)>0 then
      sl.add(ArrayOfCountdownToString(countdowns_ac,true));
    if length(steuerungsbefehle_as)>0 then
      sl.add(ArrayOfsteuerbefehleToString(steuerungsbefehle_as,true));
//    memo1.lines.Add(ArrayOfUebergangToString(uebergange_au,true));
    if length(uebergange_au)>0 then
      sl.add(ArrayOfUebergangToString(uebergange_au,true));
    if (pos('.',filename_s)>0) then filename_s:=copy(filename_s,1,pos('.',filename_s)-1);
    sl.SaveToFile(filename_s+'.s');
//    memo1.lines.Text:=memo1.lines.Text; //Strings mit #13#10 teilen
    //    sl.SaveToFile(filename+'.s');
  finally
    sl.free;
  end;
end;
procedure TForm1.LoadFromFile(filename_s:string);
begin
  OpenDialog1.FileName:=filename_s;
  SaveDialog1.FileName:=filename_s;
  Memo1.Lines.LoadFromFile(filename_s);
end;

procedure TForm1.Label2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
  LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
  SaveToFile(SaveDialog1.FileName);
end;

procedure TForm1.Label3Click(Sender: TObject);
begin
if SaveDialog1.Execute then begin
  SaveToFile(SaveDialog1.FileName);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Highlighter:=BenHighlighter1;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 if FileExists(ParamStr(1)) then LoadFromFile(paramstr(1));
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
StatusBar1.simpletext:=IntToStr(memo1.caretx)+'|'+IntToStr(memo1.carety);
if (key=ord('S')) and (ssCtrl in shift) then
  SaveToFile(SaveDialog1.FileName);
if (key=vk_f9) and (ssCtrl in shift) then
  CompilerToFile(saveDialog1.FileName);
end;

end.
