home *** CD-ROM | disk | FTP | other *** search
- { ------------------------------------------------------ }
- { PARSER.PAS }
- { (c) 1990 Siegfried Hund & TOOLBOX }
- { ------------------------------------------------------ }
- PROGRAM Parser;
-
- USES Crt, Dos, Printer;
-
- TYPE
- Zeiger = ^Satz;
- Satz = RECORD
- inhalt : STRING [20];
- ingross : STRING [20];
- naechster : zeiger;
- END;
-
- VAR
- anfangszeiger : zeiger;
- hilfszeiger : zeiger;
- laufzeiger : zeiger;
- datensatz : Satz;
- datei, orgdatei : STRING;
- newdatei, pasdatei : STRING;
- parswort, verarb : STRING;
- textdatei : Text;
- parsdatei : Text;
- neuetextdatei : Text;
- ok, ok1 : BOOLEAN;
- ch, ch1, taste, lastch : CHAR;
- zeile, wort, grwort : STRING;
- textzeile : STRING;
- x, y : BYTE;
- i, tzlen : INTEGER;
-
- { Text schreiben an der Position x und y }
-
- PROCEDURE WriteXY(x, y : BYTE; txt : STRING);
- BEGIN
- GotoXY(x, y);
- Write(txt);
- END;
-
- PROCEDURE Maske; { Überschrift }
- BEGIN
- ClrScr;
- WriteXY(1, 1, ' Pascal-Parser Version 1.0 (C)' +
- ' 1990 Siegfried Hund & TOOLBOX ');
- END;
-
- PROCEDURE DateiToHeap;
- { Datei PARSPAS.TXT als vekettete Liste auf den Heap }
- BEGIN
- Assign(parsdatei, 'PARSPAS.TXT');
- {$I-}
- Reset(parsdatei);
- IF IOResult <> 0 THEN BEGIN
- WriteLn;
- WriteLn('Fehler: Datei PARSPAS.TXT im Path ',
- 'nicht vorhanden');
- WriteLn;
- WriteLn('Hinweis: Die Datei PARSPAS.TXT muß mit ',
- 'dem Programm ');
- WriteLn(' PARSER.EXE im gleichen Path ',
- 'vorhanden sein.');
- WriteLn;
- WriteLn('Das Programm wird jetzt abgebrochen');
- WriteLn;
- Halt(1);
- END;
- {$I+}
- anfangszeiger := NIL;
- While NOT EoF(parsdatei) DO BEGIN
- New(hilfszeiger);
- Read(parsdatei, parswort, ch, ch);
- grwort := '';
- FOR i := 1 TO Length(parswort) DO
- grwort := grwort + UpCase(parswort[ i ]);
- hilfszeiger^.ingross := grwort;
- hilfszeiger^.naechster := NIL;
- hilfszeiger^.inhalt := parswort;
- grwort := '';
- IF anfangszeiger = NIL THEN
- anfangszeiger := hilfszeiger
- ELSE BEGIN
- laufzeiger := anfangszeiger;
- While laufzeiger^.naechster <> NIL DO
- laufzeiger := laufzeiger^.naechster;
- laufzeiger^.naechster := hilfszeiger;
- END;
- END;
- END;
-
- PROCEDURE ParamTest;
- BEGIN
- ok := FALSE;
- ok1 := FALSE;
- IF ParamCount = 0 THEN BEGIN
- GotoXY(1, 5);
- Write('Path und Dateiname(ohne .PAS) : ');
- Read(datei);
- FOR i := 1 TO Length(datei) DO
- datei[i] := UpCase(datei[i]);
- ok := TRUE;
- END;
- IF ParamCount = 1 THEN BEGIN
- datei := ParamStr(1);
- ok := TRUE;
- END;
- IF ParamCount = 2 THEN BEGIN
- datei := ParamStr(1);
- ok := TRUE;
- verarb := ParamStr(2);
- taste := verarb[1];
- taste := UpCase(taste);
- IF taste IN ['d', 'D', 'f', 'F', 's', 'S'] THEN
- ok1 := TRUE
- ELSE
- ok1 := FALSE;
- END;
- IF ok THEN BEGIN
- ok := FALSE;
- pasdatei := datei + '.PAS';
- Assign(textdatei, pasdatei);
- {$I-}
- Reset(textdatei);
- IF IOResult <> 0 THEN BEGIN
- WriteLn;
- WriteLn('Fehler: Datei ', pasdatei,
- ' im Path nicht vorhanden');
- WriteLn;
- WriteLn('Hinweis: Programm erneut aufrufen ',
- 'und den richtigen ');
- WriteLn(' Path und Dateinamen ohne ',
- '.PAS angeben. ');
- WriteLn;
- WriteLn('Das Programm wird jetzt abgebrochen');
- WriteLn;
- Halt(1);
- WriteLn;
- WriteLn('Datei im Path nicht vorhanden');
- ok := FALSE;
- END ELSE
- ok := TRUE;
- {$I+}
- IF ok1 = FALSE THEN BEGIN
- WriteLn;
- WriteLn('Verarbeitungs-Parameter fehlt ');
- WriteLn;
- WriteLn('Zugelassene Parameter sind : ');
- WriteLn;
- WriteLn('S --> Ausgabe nur auf dem Bildschirm');
- WriteLn('D --> Ausgabe nur auf dem Drucker ');
- WriteLn('F --> Ausgabe in die Datei *.PAS ');
- WriteLn;
- Write('Parameter eingeben: ');
- REPEAT
- taste := ReadKey;
- taste := UpCase(taste);
- UNTIL taste IN ['d', 'D', 'f', 'F', 's', 'S'];
- Write(taste);
- WriteLn;
- ok1 := TRUE;
- END;
- END;
- END;
-
- PROCEDURE PasToOrg;
- { Die Datei xxx.PAS in XXX.ORG umbenennen }
- BEGIN
- IF ok THEN BEGIN
- pasdatei := datei + '.PAS';
- orgdatei := datei + '.ORG';
- Rename(textdatei, orgdatei);
- WriteLn('Die Datei ', pasdatei, ' wurde in Datei ',
- orgdatei, ' umbenannt ');
- WriteLn;
- Assign(textdatei, orgdatei);
- {$I-}
- Reset(textdatei);
- IF IOResult <> 0 THEN BEGIN
- WriteLn;
- WriteLn('Datei im Path nicht vorhanden');
- WriteLn;
- ok := FALSE;
- END ELSE ok := TRUE;
- {$I+}
- END;
- END;
-
- PROCEDURE sauberlauf;
- { Die Zeichen Klammer/Stern und Stern/Klammer für }
- { Kommetare in geschweifte Klammern und die Zeichen }
- { Klammer/Punkt und Punkt/Klammer in eckige Klammern }
- { umwandeln. Der neue Pascal-Source wird in der }
- { temporären Datei xxx.$$$ abgelegt. }
- VAR
- ntext : STRING;
- htext : STRING;
- BEGIN
- IF ok THEN BEGIN
- orgdatei := datei + '.ORG';
- newdatei := datei + '.$$$';
- Assign(neuetextdatei, newdatei);
- Assign(textdatei, orgdatei);
- {$I-}
- Rewrite(neuetextdatei);
- Reset(textdatei);
- IF IOResult <> 0 THEN BEGIN
- WriteLn('Datei im Path nicht vorhanden');
- WriteLn;
- ok := FALSE;
- END ELSE ok := TRUE;
- {$I+}
- REPEAT
- Read(textdatei, textzeile, ch, ch1);
- { geschweifte Klammer auf, für Kommentare }
- i := Pos('{ ', textzeile);
- While i <> 0 DO BEGIN
- Delete(textzeile, i, 2);
- Insert('{ ', textzeile, i);
- i := Pos('{ ', textzeile);
- END;
- { geschweifte Klammer zu, für Kommentare }
- i := Pos(' }', textzeile);
- While i <> 0 DO BEGIN
- Delete(textzeile, i, 2);
- Insert(' }', textzeile, i);
- i := Pos(' }', textzeile);
- END;
- { eckige Klammer auf }
- i := Pos('[ ', textzeile);
- While i <> 0 DO BEGIN
- Delete(textzeile, i, 2);
- Insert('[ ', textzeile, i);
- i := Pos('[ ', textzeile);
- END;
- { eckige Klammer zu }
- i := Pos(' ]', textzeile);
- While i <> 0 DO BEGIN
- Delete(textzeile, i, 2);
- Insert(' ]', textzeile, i);
- i := Pos(' ]', textzeile);
- END;
- Write(neuetextdatei, textzeile, ch, ch1);
- UNTIL EoF(textdatei);
- Close(neuetextdatei);
- ok := TRUE;
- END ELSE ok := FALSE;
- IF ok THEN BEGIN
- pasdatei := datei + '.PAS';
- newdatei := datei + '.$$$';
- Assign(textdatei, newdatei);
- {$I-}
- Reset(textdatei);
- IF IOResult <> 0 THEN BEGIN
- WriteLn;
- WriteLn('Datei im Path nicht vorhanden');
- ok := FALSE;
- END ELSE ok := TRUE;
- {$I+}
- END;
- END;
-
- PROCEDURE parspascal;
- { Die Pascal-Schlüsselworte suchen und }
- { in die richtige Schreibweise umsetzen }
- BEGIN
- hilfszeiger := anfangszeiger;
- While (hilfszeiger <> NIL) AND
- ( hilfszeiger^.ingross <> wort) DO
- hilfszeiger := hilfszeiger^.naechster;
- IF wort = hilfszeiger^.ingross THEN
- zeile := hilfszeiger^.inhalt;
- END;
-
- PROCEDURE Bearbeiten;
- { Die Datei xxx.$$$ zeichenweise lesen, die Schlüssel- }
- { worte herausfiltern und ersetzen, sowie die }
- { Kommentarzeilen und die Texte in Hochkommata von einer }
- { Umwandlung ausnehmen. Der neue Pascal-Source wird in }
- { der Datei xxx.PAS abgelegt. Bei der Bildschirmausgabe }
- { und Drucker-Ausgabe wird keine neue Datei xxx.PAS }
- { erzeugt. }
- BEGIN
- textzeile := '';
- lastch := ' ';
- IF taste = 'F' THEN BEGIN
- Assign(neuetextdatei, pasdatei);
- Rewrite(neuetextdatei);
- END;
- REPEAT
- zeile := '';
- REPEAT
- Read(textdatei, ch);
- IF (lastch = ',') AND (ch <> ' ') THEN BEGIN
- textzeile := textzeile + ', ';
- lastch := ' ';
- END ELSE
- IF (lastch = ',') AND (ch = ' ') THEN BEGIN
- textzeile := textzeile + lastch;
- lastch := ' ';
- END;
- IF (lastch = ':') AND (ch = '=') THEN BEGIN
- tzlen := Length(textzeile);
- IF textzeile[ tzlen ] <> ' ' THEN
- textzeile := textzeile + ' ' + lastch + ch
- ELSE
- textzeile := textzeile + lastch + ch;
- Read(textdatei, ch);
- IF ch <> ' ' THEN BEGIN
- textzeile := textzeile + ' ';
- lastch := ' ';
- END;
- END ELSE
- IF (lastch = ':') AND (ch <> '=') THEN BEGIN
- textzeile := textzeile + lastch;
- lastch := ' ';
- END;
- IF (lastch IN [ '+', '-', '*', '/' ]) THEN BEGIN
- tzlen := Length(textzeile);
- IF textzeile[ tzlen ] <> ' ' THEN
- textzeile := textzeile + ' ' + lastch
- ELSE
- textzeile := textzeile + lastch;
- IF ch <> ' ' THEN textzeile := textzeile + ' ';
- IF ch = ' ' THEN textzeile := textzeile;
- lastch := ' ';
- END;
- While ch IN [ 'A'..'Z', 'a'..'z' ] DO BEGIN
- zeile := zeile + ch;
- Read(textdatei, ch);
- END;
- IF zeile > '' THEN BEGIN
- wort := zeile;
- FOR i := 1 TO Length(wort) DO
- wort[i] := UpCase(wort[i]);
- parspascal;
- textzeile := textzeile + zeile;
- zeile := '';
- END;
- IF ch = Chr(39) THEN BEGIN
- textzeile := textzeile + ch;
- REPEAT
- Read(textdatei, ch);
- textzeile := textzeile + ch;
- UNTIL ch = Chr(39);
- Read(textdatei, ch);
- END;
- IF ch = '{' THEN BEGIN
- REPEAT
- IF ch IN [ #13, #10 ] THEN BEGIN
- CASE taste OF
- 'S' : Write(textzeile);
- 'D' : Write(Lst, textzeile);
- 'F' : Write(neuetextdatei, textzeile);
- END;
- textzeile := '';
- END;
- textzeile := textzeile + ch;
- Read(textdatei, ch);
- UNTIL ch = '}';
- END;
- IF ch IN [',', '+', '-', '*', '/', ':'] THEN
- lastch := ch
- ELSE BEGIN
- textzeile := textzeile + ch;
- lastch := ' ';
- END;
- UNTIL ch IN [#13, #10];
- CASE taste OF
- 'S' : Write(textzeile);
- 'D' : Write(Lst, textzeile);
- 'F' : Write(neuetextdatei, textzeile);
- END;
- textzeile := '';
- UNTIL EoF(textdatei);
- IF ok THEN Close(textdatei) ELSE Delay(2500);
- IF taste = 'F' THEN Close(neuetextdatei);
- END;
-
- BEGIN
- ClrScr;
- Maske;
- Window(1, 3, 80, 25);
- ClrScr;
- DateiToHeap; { Parser-Datei auf Heap laden }
- ParamTest; { Parameter vorhanden ? }
- PasToOrg; { Rename xxx.PAS in xxx.ORG }
- sauberlauf; { Klammern korrigieren }
- IF ok AND ok1 THEN BEGIN
- Bearbeiten;
- Erase(textdatei);
- CASE taste OF
- 'S', 'D' : BEGIN
- Assign(textdatei, orgdatei);
- Rename(textdatei, pasdatei);
- END;
- 'F' : BEGIN
- WriteLn('Die Originaldatei wurde in ',
- orgdatei, ' umbenannt');
- WriteLn('Die erzeugte Datei wurde als ',
- pasdatei, ' gespeichert');
- WriteLn;
- END;
- END;
- WriteLn('Programm beendet');
- END ELSE WriteLn('Das Programm wurde abgebrochen');
- END.
- { ------------------------------------------------------ }
- { Ende von PARSER.PAS }
-
-