home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* WORTERZ.PAS *)
- (* 1. Programm: Dient der Erzeugung einer Sprache aus *)
- (* ihren Produktionregeln heraus (ohne *)
- (* Typbeschränkung) mittels einfachster *)
- (* Stringverarbeitung. *)
- (* (c) 1991 Andreas Tengicki & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- PROGRAM Worterzeugung;
-
- USES Wartesch, Regeln, Zketten;
-
- CONST
- Wort_Max = 50;
- Nonterm = ['A'..'Z'];
-
- VAR
- FiFo_Feld : FiFo_Array; (* Warteschlangen *)
- In_s,
- Out_s : INTEGER;
- In_d,
- Out_d : FiFo_Satz_Ptr;
-
- nSatzform,
- Satzform : STRING;
- RegelAnz,
- WortAnz,
- a, i, Pos : INTEGER;
- Flag,
- Variante : BOOLEAN;
- Regel : Regel_Feld;
-
- BEGIN
- (* Initialisierungen *)
- WriteLn;
- WriteLn;
- WriteLn('Parserstrategien 1.Programm');
- WriteLn(' Worterzeugung');
- WortAnz := 0;
- WriteLn('Welche FIFO-Variante: 0 - dynamisch');
- WriteLn(' 1 - statisch');
- Write(': '); ReadLn(a);
- Variante := (a = 0);
-
- IF Variante THEN
- FiFo_Init_d(In_d, Out_d)
- ELSE
- FiFo_Init_s(In_s, Out_s);
-
- (* Eingaben *)
- Regeleingabe(RegelAnz, Regel);
- Write('Startsymbol: '); InpStr(Satzform);
- IF Variante THEN
- FiFo_In_d(In_d, Out_d, Satzform)
- ELSE
- FiFo_In_s(FiFo_Feld, In_s, Out_s, Satzform);
-
- (* Worterzeugungsschleife *)
- REPEAT
- IF Variante THEN
- FiFo_Out_d(In_d, Out_d, Satzform)
- ELSE
- FiFo_Out_s(FiFo_Feld, In_s, Out_s, Satzform);
-
- (* Satzform ein Wort ? *)
- Flag := TRUE;
- FOR i := 1 TO LenStr(Satzform) DO
- IF Satzform[i] IN nonterm THEN Flag := FALSE;
- IF Flag THEN BEGIN
- INC(WortAnz);
- WriteLn(Satzform);
- END;
- (* gemäß Regel ersetzen *)
- FOR i := 1 TO RegelAnz DO BEGIN
- Pos := InStr(Regel[i].l, Satzform);
- IF Pos <> 0 THEN BEGIN
- nSatzform := Satzform;
- Ersetze(nSatzform, Regel[i], Pos);
- IF Variante THEN
- FiFo_In_d(In_d, Out_d, nSatzform)
- ELSE
- FiFo_In_s(FiFo_Feld, In_s, Out_s, nSatzform);
- END;
- END;
- UNTIL ( Variante AND (In_d = NIL) ) OR
- (NOT Variante AND (In_s = -1 ) ) OR
- (WortAnz > Wort_Max);
- END.
- (* ------------------------------------------------------ *)
- (* Ende von WORTERZ.PAS *)
-
-