home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9101 / parser / worterz.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-09-12  |  2.5 KB  |  92 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     WORTERZ.PAS                        *)
  3. (*  1. Programm: Dient der Erzeugung einer Sprache aus    *)
  4. (*               ihren Produktionregeln heraus (ohne      *)
  5. (*               Typbeschränkung) mittels einfachster     *)
  6. (*               Stringverarbeitung.                      *)
  7. (*        (c) 1991 Andreas Tengicki & DMV-Verlag          *)
  8. (* ------------------------------------------------------ *)
  9. PROGRAM Worterzeugung;
  10.  
  11. USES Wartesch, Regeln, Zketten;
  12.  
  13. CONST
  14.   Wort_Max  = 50;
  15.   Nonterm   = ['A'..'Z'];
  16.  
  17. VAR
  18.   FiFo_Feld : FiFo_Array;       (* Warteschlangen *)
  19.   In_s,
  20.   Out_s     : INTEGER;
  21.   In_d,
  22.   Out_d     : FiFo_Satz_Ptr;
  23.  
  24.   nSatzform,
  25.   Satzform  : STRING;
  26.   RegelAnz,
  27.   WortAnz,
  28.   a, i, Pos : INTEGER;
  29.   Flag,
  30.   Variante  : BOOLEAN;
  31.   Regel     : Regel_Feld;
  32.  
  33. BEGIN
  34.   (* Initialisierungen *)
  35.   WriteLn;
  36.   WriteLn;
  37.   WriteLn('Parserstrategien 1.Programm');
  38.   WriteLn('     Worterzeugung');
  39.   WortAnz := 0;
  40.   WriteLn('Welche FIFO-Variante: 0 - dynamisch');
  41.   WriteLn('                      1 - statisch');
  42.   Write(': '); ReadLn(a);
  43.   Variante := (a = 0);
  44.  
  45.   IF Variante THEN
  46.     FiFo_Init_d(In_d, Out_d)
  47.   ELSE
  48.     FiFo_Init_s(In_s, Out_s);
  49.  
  50.     (* Eingaben *)
  51.   Regeleingabe(RegelAnz, Regel);
  52.   Write('Startsymbol: '); InpStr(Satzform);
  53.   IF Variante THEN
  54.     FiFo_In_d(In_d, Out_d, Satzform)
  55.   ELSE
  56.     FiFo_In_s(FiFo_Feld, In_s, Out_s, Satzform);
  57.  
  58.     (* Worterzeugungsschleife *)
  59.   REPEAT
  60.     IF Variante THEN
  61.       FiFo_Out_d(In_d, Out_d, Satzform)
  62.     ELSE
  63.       FiFo_Out_s(FiFo_Feld, In_s, Out_s, Satzform);
  64.  
  65.       (* Satzform ein Wort ? *)
  66.     Flag := TRUE;
  67.     FOR i := 1 TO LenStr(Satzform) DO
  68.       IF Satzform[i] IN nonterm THEN Flag := FALSE;
  69.     IF Flag THEN BEGIN
  70.       INC(WortAnz);
  71.       WriteLn(Satzform);
  72.     END;
  73.       (* gemäß Regel ersetzen *)
  74.     FOR i := 1 TO RegelAnz DO BEGIN
  75.       Pos := InStr(Regel[i].l, Satzform);
  76.       IF Pos <> 0 THEN BEGIN
  77.         nSatzform := Satzform;
  78.         Ersetze(nSatzform, Regel[i], Pos);
  79.         IF Variante THEN
  80.           FiFo_In_d(In_d, Out_d, nSatzform)
  81.         ELSE
  82.           FiFo_In_s(FiFo_Feld, In_s, Out_s, nSatzform);
  83.       END;
  84.     END;
  85.   UNTIL (     Variante AND (In_d = NIL) ) OR
  86.          (NOT Variante AND (In_s = -1 ) ) OR
  87.          (WortAnz > Wort_Max);
  88. END.
  89. (* ------------------------------------------------------ *)
  90. (*               Ende von WORTERZ.PAS                     *)
  91.  
  92.