home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* REGELN.PAS *)
- (* enthält die Prozeduren zur Eingabe und Bearbeitung *)
- (* der als String vorliegenden Regeln und Satzformen. *)
- (* (c) 1991 Andreas Tengicki & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- UNIT Regeln;
-
- INTERFACE
-
- USES Zketten;
-
- CONST
- Regel_Max = 50;
-
- TYPE
- Regel_Typ = RECORD
- l, r : STRING;
- END;
- Regel_Feld = ARRAY [1..Regel_Max] OF Regel_Typ;
-
-
- PROCEDURE Regeleingabe(VAR Anzahl : INTEGER;
- VAR Regeln : Regel_Feld);
- PROCEDURE Ersetze (VAR Satzform : STRING;
- Regel : Regel_Typ;
- Pos : INTEGER);
-
-
- IMPLEMENTATION
-
-
- PROCEDURE Regeleingabe(VAR Anzahl : INTEGER;
- VAR Regeln : Regel_Feld);
- (* Zur Eingabe eines Regelsatzes in Stringform. *)
- (* Die Prozedur spaltet automatisch die ODER *)
- (* (|) auf und macht mehrere Regeln daraus. *)
- (* Die Eingabe kann über die Tastatur oder eine *)
- (* Textdatei erfolgen. *)
- VAR
- Pos : INTEGER;
- Links, Rechts,
- Regel, DatNam : STRING;
- Datei : TEXT;
- DatFlag : BOOLEAN;
- c : CHAR;
- BEGIN
- (* Initialisierung ... *)
- Anzahl := 0;
- Write('Eingabe über Tastatur oder Datei (t/d): ');
- InpChr(c);
- DatFlag := (c = 'd');
- IF DatFlag THEN BEGIN
- Write('Dateiname: '); InpStr(DatNam);
- Assign(Datei, DatNam);
- Reset(Datei);
- ReadLn(Datei, Regel);
- WriteLn(Anzahl+1:3, '.te Regel: ', Regel);
- END ELSE BEGIN
- Write(Anzahl+1:3, '.te Regel (# -> Ende Eingabe): ');
- InpStr(Regel);
- END;
- WHILE (Regel[1] <> '#') AND (Anzahl < Regel_Max) DO BEGIN
- (* Bestimmung des Gleichheitszeichens: *)
- Pos := InStr('=', Regel);
- IF Pos = 0 THEN
- WriteLn('Syntaxfehler: = fehlt !')
- ELSE BEGIN
- (* Abtrennen der linken Seite ... *)
- Links := TeilStr(Regel, 1, Pos-1);
- Regel := TeilStr(Regel, Pos+1, LenStr(Regel));
- REPEAT
- (* Abtrennen der Alternativen ... *)
- Pos := InStr('|', Regel);
- IF Pos = 0 THEN
- (* letzte Alternative ... *)
- Rechts := TeilStr(Regel, 1, Lenstr(Regel))
- ELSE BEGIN
- Rechts := TeilStr(Regel, 1, Pos-1);
- Regel := TeilStr(Regel, Pos+1, LenStr(Regel));
- END;
- (* Regel abspeichern ... *)
- INC(Anzahl);
- IF Anzahl = Regel_Max THEN
- WriteLn('Letzte Regel !');
- Regeln[Anzahl].l := Links;
- Regeln[Anzahl].r := Rechts;
- UNTIL (Pos = 0) OR (Anzahl = Regel_Max);
- END;
- IF Anzahl < Regel_Max THEN BEGIN
- IF DatFlag THEN BEGIN
- ReadLn(Datei, Regel);
- WriteLn(Anzahl+1:3, '.te Regel: ', Regel);
- END ELSE BEGIN
- Write(Anzahl+1:3, '.te Regel (# -> Ende Eingabe):');
- InpStr(Regel);
- END;
- END;
- END;
- IF DatFlag THEN Close(Datei);
- END;
-
- PROCEDURE Ersetze(VAR Satzform : STRING;
- Regel : Regel_Typ;
- Pos : INTEGER);
- (* ersetzt in SATZFORM an der Position POS *)
- (* gemäß REGEL. *)
- VAR
- Ergebnis : STRING;
- BEGIN
- Ergebnis := TeilStr(Satzform, 1, Pos-1);
- Ergebnis := CatStr (Ergebnis, Regel.r);
- Satzform := TeilStr(Satzform, Pos+LenStr(Regel.l),
- LenStr(Satzform));
- Ergebnis := CatStr (Ergebnis, Satzform);
- Satzform := Ergebnis;
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von REGELN.PAS *)
-