home *** CD-ROM | disk | FTP | other *** search
- (********************************************************)
- (* ATNBOX.INC *)
- (* Include-Datei mit den Prozeduren für eine *)
- (* natürlichsprachliche Schnittstelle von "KARTEI" *)
- (* (C) 1989 Stephan Diehl & TOOLBOX *)
-
- FUNCTION match : BOOLEAN;
- (* Sucht die nächste Karteikarte, die zu den *)
- (* aktuellen Suchbegriffen paßt *)
-
- VAR bb:BOOLEAN;
-
- BEGIN
- bb:=FALSE;
- IF karte<>NIL THEN
- WHILE (((suchbegriff[inh4]^.begriff
- <>karte^.inhalt[ 4])
- AND (suchbegriff[inh4]^.begriff
- <>wildcard))
- OR ((suchbegriff[inh3]^.begriff
- <>karte^.inhalt[3])
- AND (suchbegriff[inh3]^.begriff
- <>wildcard))
- OR ((suchbegriff[inh2]^.begriff
- <>karte^.inhalt[2])
- AND (suchbegriff[inh2]^.begriff
- <>wildcard))
- OR ((suchbegriff[inh1]^.begriff
- <>karte^.inhalt[1])
- AND (suchbegriff[inh1]^.begriff
- <>wildcard)) )
- AND NOT bb
- DO BEGIN
- IF karte<>NIL THEN
- karte:=karte^.naechste
- ELSE
- bb:=TRUE;
- END
- ELSE bb:=TRUE;
- match:=NOT bb;
- END;
-
-
- PROCEDURE aktionen_ausfuehren;
- BEGIN
- befehl:=erster_befehl;
- IF befehl=NIL THEN feld_mit_inhalt_ausgeben(z)
- ELSE
- REPEAT
- CASE befehl^.anw OF
- monitor : feld_mit_inhalt_ausgeben(z);
- drucker : BEGIN
- feld_mit_inhalt_ausdrucken(z);
- auf_drucker:=TRUE;
- END;
- loeschen : BEGIN
- Write('Sind Sie sicher,daß diese ');
- Write('Karte gelöscht ');
- WriteLn('werden soll:');
- FOR u:=1 TO 4 DO
- feld_mit_inhalt_ausgeben(u);
- WriteLn;WriteLn('j/n');
- IF ant='j' THEN BEGIN
- IF karte=erste_karte THEN
- erste_karte:=karte^.naechste
- ELSE BEGIN
- ksuch2:=NIL;
- ksuch1:=erste_karte;
- WHILE ksuch1<>karte DO BEGIN
- ksuch2:=ksuch1;
- ksuch1:=ksuch1^.naechste;
- END;
- ksuch2^.naechste
- :=karte^.naechste;
- END;
- Dispose(karte); kartanz:=kartanz-1;
- cty:=inh4;
- (* => kein weiteres feld *)
- WriteLn('Karte gelöscht !!!');
- END;
- END;
- editieren : BEGIN
- IF no_feld
- OR (no_feld2 AND zweite_anfrage)
- THEN BEGIN
- editiere_karteikarte(karte);
- cty:=inh4;
- END
- ELSE BEGIN
- feld_mit_inhalt_ausgeben(z);
- WriteLn;
- WriteLn('Wollen Sie dies ändern ?');
- WriteLn('j/n'); ReadLn(ant);
- WriteLn;
- IF ant='j' THEN BEGIN
- Write(feldnamen[karte^.
- kartentyp,z],
- ': ');
- ReadLn(karte^.inhalt[z]);
- END;
- END;
- END;
- kartedrucken : BEGIN
- FOR u:=1 TO 4 DO BEGIN
- feld_mit_inhalt_ausdrucken(u);
- WriteLn(LST);
- END;
- WriteLn(LST);WriteLn(LST);
- WriteLn(LST,feldnamen[karte^.
- kartentyp,
- 5],': ');
- WriteLn(LST);
- FOR u:=1 TO 7 DO
- WriteLn(LST,karte^.inhalt5[u]);
- WriteLn(LST); WriteLn(LST);
- WriteLn(LST); WriteLn(LST);
- WriteLn(LST);
- cty:=inh4;
- (* => kein weiteres feld bearbeiten *)
- END;
- END;
- befehl:=befehl^.naechste;
- UNTIL befehl=NIL;
- END;
-
- PROCEDURE feldinhalt_ausgeben;
- (* Die Aktionen werden mit allen Feldinhalten *)
- (* durchgeführt, nach denen gefragt wurde *)
- BEGIN
- suchbegriff[feld]:=erster_begriff[feld];
- REPEAT
- cty:=inh1;
- REPEAT
- z:=Ord(cty);
- IF (suchbegriff[feld]^.begriff=wildcard)
- OR (feldnamen[karte^.kartentyp,z]
- =suchbegriff[feld]^.begriff) THEN
- aktionen_ausfuehren;
- cty:=Succ(cty);
- UNTIL cty=inh5;
- suchbegriff[feld]:=suchbegriff[feld]^.naechste;
- UNTIL suchbegriff[feld]=NIL;
- END;
-
-
- PROCEDURE drucke_antwort;
- (* Die Karteikarten werden nach allen *)
- (* Kombinationen von Suchbegriffen der *)
- (* verschiedenen Felder durchsucht *)
-
- VAR xyi:INTEGER;
-
- BEGIN
- schwarzaufweiss;
- FOR xyi:=3 TO 5 DO BEGIN
- resetfenster;
- fenster(xyi,xyi,81-xyi,26-xyi);
- ClrScr;
- END;
- weissaufschwarz;
- ClrScr;
- suchbegriff[inh1]:=erster_begriff[inh1];
- WHILE suchbegriff[inh1]<>NIL DO BEGIN
- suchbegriff[inh2]:=erster_begriff[inh2];
- WHILE suchbegriff[inh2]<>NIL DO BEGIN
- suchbegriff[inh3]:=erster_begriff[inh3];
- WHILE suchbegriff[inh3]<>NIL DO BEGIN
- suchbegriff[inh4]:=erster_begriff[inh4];
- WHILE suchbegriff[inh4]<>NIL DO BEGIN
- karte:=erste_karte;
- WHILE match AND (karte<>NIL) DO BEGIN
- auf_drucker:=FALSE;
- feldinhalt_ausgeben;
- IF auf_drucker THEN WriteLn(LST)
- ELSE WriteLn;
- IF karte<>NIL THEN karte:=karte^.naechste;
- END;
- suchbegriff[inh4]
- :=suchbegriff[inh4]^.naechste;
- END;
- suchbegriff[inh3]:=suchbegriff[inh3]^.naechste;
- END;
- suchbegriff[inh2]:=suchbegriff[inh2]^.naechste;
- END;
- suchbegriff[inh1]:=suchbegriff[inh1]^.naechste;
- END;
- weissaufschwarz;
- resetfenster;
- END;
-
- PROCEDURE getcategory;
- (* Liefert die Kategorie des nächsten *)
- (* Wortes in der Eingabe *)
- VAR bb,is_bdl:BOOLEAN;
-
- BEGIN
- REPEAT
- IF eingabe='' THEN category:=pop
- ELSE BEGIN
- u:=Length(eingabe);
- z:=1;
- IF eingabe[1]='"' THEN BEGIN
- wort:=Copy(eingabe,2,
- Pos('"',Copy(eingabe,2,u-1))-1);
- z:=Length(wort)+4;
- END
- ELSE BEGIN
- wort:=Copy(eingabe,1,Pos(' ',eingabe)-1);
- z:=Length(wort)+2;
- END;
- eingabe:=Copy(eingabe,z,u-z+1);
- kt:=nix; is_bdl:=FALSE;
- anweis:=keine; category:=bdl;
- IF (wort='nach') OR (wort='NACH') THEN nach:=TRUE
- ELSE BEGIN (* Ist das Wort eine Anweisung ? *)
- FOR z:=1 TO bdlanz DO
- IF wort=bdlos[z] THEN is_bdl:=TRUE;
- IF NOT is_bdl THEN BEGIN
- FOR z:=1 TO sortanz DO
- IF wort=sort[z] THEN anweis:=sortieren;
- IF anweis=keine THEN
- FOR z:=1 TO monanz DO
- IF wort=mon[z] THEN
- anweis:=monitor;
- IF anweis=keine THEN
- FOR z:=1 TO druckanz DO
- IF wort=druck[z] THEN anweis:=drucker;
- IF anweis=keine THEN
- FOR z:=1 TO editanz DO
- IF wort=edit[z] THEN anweis:=editieren;
- IF anweis=keine THEN
- FOR z:=1 TO loeschanz DO
- IF wort=loesch[z] THEN anweis:=loeschen;
- IF anweis=keine THEN
- FOR z:=1 TO kdruckanz DO
- IF wort=kartdruck[z] THEN
- anweis:=kartedrucken;
- IF anweis<>keine THEN category:=anweisung
- ELSE BEGIN (* Ist das Wort ein Feldname ? *)
- bb:=FALSE;
- REPEAT
- kt:=Succ(kt); z:=0;
- REPEAT
- z:=z+1;
- hilfstr:=feldnamen[kt,z];
- IF enthalten_in(wort,hilfstr) THEN
- bb:=TRUE;
- UNTIL bb OR (z=5);
- UNTIL (kt=letzter_typ) OR bb;
- IF bb THEN BEGIN
- category:=feld;
- no_feld2:=no_feld;
- no_feld:=FALSE;
- END
- ELSE BEGIN
- (* Ist das Wort ein Feldinhalt ? *)
- category:=bdl;
- hilf:=erste_karte;
- REPEAT
- z:=0;
- REPEAT
- z:=z+1;
- hilfstr:=hilf^.inhalt[z];
- IF enthalten_in(wort,hilfstr) THEN
- bb:=TRUE;
- UNTIL bb OR (z=4);
- IF bb THEN
- CASE z OF 1: category:=inh1;
- 2: category:=inh2;
- 3: category:=inh3;
- 4: category:=inh4;
- END;
- hilf:=hilf^.naechste;
- (* Bedeutungslose Wörter *)
- (* werden überlesen *)
- UNTIL (hilf=NIL) OR (category<>bdl);
- END;
- END;
- END;
- END;
- END;
- UNTIL category<>bdl;
- END;
-
- FUNCTION richtig_verstanden:BOOLEAN;
-
- VAR begriffe:begriffsfeld;
- befehle:befehlszeiger;
- cty:kategorien;
- xi:INTEGER;
- BEGIN
- schwarzaufweiss;
- resetfenster;
- IF hga THEN
- Move(speichere_bildschirm,bildschirm_hga,4000)
- ELSE
- Move(speichere_bildschirm,bildschirm_cga,4000);
- fenster(10,5,70,19);
- ClrScr;
- GotoXY(10,9);
- WriteLn(' Ich soll folgendes tun : ');
- begriffe:=erster_begriff;
- befehle:=erster_befehl;
- WriteLn;
- IF begriffe[feld]^.begriff<>wildcard THEN BEGIN
- IF begriffe[feld]^.naechste<>NIL THEN
- WriteLn(' folgende Felder:')
- ELSE
- WriteLn(' folgendes Feld:');
- WHILE begriffe[feld]<>NIL DO BEGIN
- Write('':10);
- weissaufschwarz;
- Write(begriffe[feld]^.begriff);
- schwarzaufweiss;
- WriteLn;
- begriffe[feld]:=begriffe[feld]^.naechste;
- END;
- END
- ELSE
- WriteLn(' alle Karteikarten ');
- WriteLn;
- IF (begriffe[inh1]^.begriff<>wildcard)
- OR (begriffe[inh2]^.begriff<>wildcard)
- OR (begriffe[inh3]^.begriff<>wildcard)
- OR (begriffe[inh4]^.begriff<>wildcard) THEN BEGIN
- WriteLn(' mit folgenden Feldinhalten:');
- FOR cty:=inh1 TO inh4 DO BEGIN
- WHILE begriffe[cty]<>NIL DO BEGIN
- Write('':10);
- weissaufschwarz;
- IF begriffe[cty]^.begriff<> wildcard THEN
- Write(begriffe[cty]^.begriff);
- schwarzaufweiss;
- WriteLn;
- begriffe[cty]:=begriffe[cty]^.naechste;
- END;
- END;
- END;
- Write(' soll ich ');
- IF befehle=NIL THEN
- WriteLn('auf dem Bildschirm ausgeben !');
- WHILE befehle<>NIL DO BEGIN
- IF befehle<>erster_befehl THEN
- Write(' und ');
- CASE befehle^.anw OF
- monitor : WriteLn(
- 'auf dem Bildschirm ausgeben');
- drucker : WriteLn(
- 'auf dem Drucker ausgeben');
- loeschen : WriteLn(
- 'aus der Kartei streichen');
- editieren : WriteLn('editieren');
- kartedrucken : WriteLn(
- 'formatiert auf dem ',
- 'Drucker ausgeben');
- sortieren : IF (sortierer<>wildcard)
- AND (sortierer<>'') THEN
- WriteLn('nach ',sortierer,
- ' sortieren')
- ELSE
- WriteLn('sortieren');
- END;
- befehle:=befehle^.naechste;
- END;
- resetfenster;
- resetfenster;TextColor(blink);
- fenster(19,22,62,23);
- TextColor(white);ClrScr;
- Write(' Ist diese Interpretation richtig ? ');
- schwarzaufweiss;
- REPEAT
- Read(KBD,ant);
- IF ant=Chr(27) THEN hilfe(8);
- UNTIL ant IN ['j','J','n','N']; WriteLn; WriteLn;
- richtig_verstanden := (ant IN ['j','J']);
- weissaufschwarz;
- resetfenster;
- ClrScr;
- END;
-
-
- PROCEDURE anfragen;
-
- VAR x,y:INTEGER;
-
- BEGIN
- resetfenster;
- fenster(2,22,79,23); eingabe:=''; zeile:=1;
- ClrScr;WriteLn('Ihre Anfrage: ');
- x:=WhereX; y:=WhereY;
- weissaufschwarz;
- Write('':62);
- schwarzaufweiss; GotoXY(x,y);
- my_readln(eingabe,76,3);
- IF eingabe<>'' THEN BEGIN
- eingabe:=eingabe+' ';
- (* initialisierecc die Befehlsliste *)
- erster_befehl := NIL;
- letzter_befehl := NIL;
- befehl := NIL;
- sortierer := ''; nach := FALSE; antworten := 1;
- getcategory; no_feld := TRUE;
- (* Einfaches ATN mit einer Aktion, naemlich dem *)
- (* Erkennen einer zweiten Anfrage *)
- REPEAT
- zustand:=za; (* anfangszustand *)
- zweite_anfrage:=FALSE; no_feld2:=no_feld;
- (* initialisiere die Listen der Suchbegriffe *)
- FOR cty:=feld TO inh5 DO BEGIN
- suchbegriff[cty]:=NIL;
- erster_begriff[cty]:=NIL;
- letzter_begriff[cty]:=NIL;
- END;
- REPEAT
- (* Kante von za nach zb *)
- IF category IN [inh1..inh4] THEN zustand:=zb;
- (* Kante von zb nach za mit Aufruf der *)
- (* Aktion "Beantworte erste Anfrage !" *)
- IF (zustand=zb) AND (category=feld) THEN
- zweite_anfrage:=TRUE;
- (* Anweisung wird in die Befehlsliste aufgenommen *)
- IF category=anweisung THEN BEGIN
- New(befehl);
- IF erster_befehl=NIL THEN erster_befehl:=befehl
- ELSE letzter_befehl^.naechste:=befehl;
- befehl^.anw:=anweis;
- befehl^.naechste:=NIL;
- letzter_befehl:=befehl;
- getcategory;
- END
- ELSE BEGIN (* Sonderfall: sortiere nach ... *)
- IF (category=feld) AND nach THEN BEGIN
- sortierer:=wort;
- nach:=FALSE;
- getcategory;
- END
- ELSE
- (* Das Wort ist ein Feldname oder Feldinhalt *)
- (* und wird in die entsprechende Liste der *)
- (* Suchbegriffe aufgenommen *)
- IF (category<>pop)
- AND NOT zweite_anfrage THEN BEGIN
- New(suchbegriff[category]);
- IF erster_begriff[category]=NIL
- THEN
- erster_begriff[category]
- := suchbegriff[category]
- ELSE
- letzter_begriff[category]^.naechste
- := suchbegriff[category];
- suchbegriff[category]^.naechste := NIL;
- suchbegriff[category]^.begriff := wort;
- letzter_begriff[category]
- := suchbegriff[category];
- getcategory;
- END;
- END;
- UNTIL (category=pop) OR zweite_anfrage;
- (* Steht in einer der Listen kein Suchbegriff, *)
- (* dann sei der Suchbegriff ein "Joker" *)
- FOR cty:=feld TO inh5 DO
- IF erster_begriff[cty]=NIL THEN BEGIN
- New(erster_begriff[cty]);
- erster_begriff[cty]^.begriff:=wildcard;
- erster_begriff[cty]^.naechste:=NIL;
- END;
- (* Lösche Anweisung, die mehrfach in *)
- (* der Befehlsliste vorkommen *)
- ctrlmenge:=[];
- befehl:=erster_befehl;
- WHILE befehl<>NIL DO BEGIN
- IF befehl^.anw IN ctrlmenge THEN BEGIN
- letzter_befehl^.naechste:=befehl^.naechste;
- Dispose(befehl);
- END
- ELSE BEGIN
- ctrlmenge:=ctrlmenge+[befehl^.anw];
- letzter_befehl:=befehl;
- (* Lautet eine Anweisung 'sortieren', so *)
- (* führe sie sofort aus *)
- IF befehl^.anw=sortieren THEN bubble_sort;
- END;
- befehl:=letzter_befehl^.naechste;
- END;
- WriteLn;WriteLn;
- (* Das ATN ist für eine Anfrage durchlaufen, nun *)
- (* beantworte diese *)
- IF richtig_verstanden THEN drucke_antwort;
- (* Lösche die Liste der Suchbegriffe*)
- FOR cty:=feld TO inh5 DO BEGIN
- suchbegriff[cty]:=erster_begriff[cty];
- WHILE suchbegriff[cty]<>NIL DO BEGIN
- letzter_begriff[cty]:=suchbegriff[cty];
- suchbegriff[cty]:=suchbegriff[cty]^.naechste;
- Dispose(letzter_begriff[cty]);
- END;
- END;
- UNTIL category=pop; (* Die Eingabe ist abgearbeitet *)
- befehl:=erster_befehl;
- (* Lösche die Befehlsliste *)
- WHILE befehl<>NIL DO BEGIN
- letzter_befehl:=befehl;
- befehl:=befehl^.naechste;
- Dispose(letzter_befehl);
- END;
- ReadLn;
- END;
- resetfenster;
- END;