{!!! Die benoetigten UNITS sind an den Programmtext angehaengt !!! }
program parser; { Beispiel: 2,3,5-trimethylhexane }
uses Daten, Message, WinCrt;
procedure POS; forward;
procedure Prefix; forward;
procedure SUAC; forward;
procedure SUAC_Radical; forward;
procedure Substituent; forward;
procedure Eingabe;
begin
StandardMessage(0);
For i := 0 to 255 do Formel[i] := '$'; { Array mit "Dummy" füllen }
For i := 0 to 255 do { Einlesen der Formel }
begin
Formel[i]:= readkey;
write(Formel[i]);
if Formel[i] = '$' then exit;
end;
StandardMessage(1);
BNT_Sicherung := 0;
BNT_Kontrolle := 0;
NOT_MainChain := false;
end;
procedure Ausgabe;
begin
StandardMessage(2);
For i := 0 to 255 do { Einlesen der Formel }
begin
if Formel[i] = '$' then
begin
i := 255;
write(' ');
end
else write(Formel[i]);
end;
StandardMessage(3);
halt;
end;
procedure MainChain;
var j : byte;
begin
StandardMessage(4);
NOT_MainChain := true; { vorbereitet für 2x SUAC }
INC(ScanKopf); { SUAC in SUAC_Radical & }
j := 1; { SUAC in MainChain }
SUAC_Wort_Kontrolle := ' ';
For ScanKopf := ScanKopf to ScanKopf + 2 do { hier scannen der 3er-Token }
begin
Insert(Formel[ScanKopf], SUAC_Wort_Kontrolle, j);
INC(j);
end;
if (SUAC_Wort_Kontrolle = 'eth ') or
(SUAC_Wort_Kontrolle = 'but ') or
(SUAC_Wort_Kontrolle = 'hex ') then
begin
{ if NOT_MainChain = false then }
begin
if (SUAC_Wort_Kontrolle = 'eth ') then Anzahl := 2;
if (SUAC_Wort_Kontrolle = 'but ') then Anzahl := 4;
if (SUAC_Wort_Kontrolle = 'hex ') then Anzahl := 6;
StandardMessage(5);
INC(ScanKopf);
if Formel[ScanKopf] <> ('a') then
begin
Fehler(7);
exit;
end
else
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('n') then
begin
Fehler(7);
exit;
end
else
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('e') then
begin
Fehler(7);
exit;
end
else
begin
StandardMessage(6);
Ausgabe;
exit;
end;
end;
end;
end;
end;
INC(ScanKopf); { hier scannen der 4er-Token }
Insert(Formel[ScanKopf], SUAC_Wort_Kontrolle, j);
if (SUAC_Wort_Kontrolle = 'meth') or
(SUAC_Wort_Kontrolle = 'prop') or
(SUAC_Wort_Kontrolle = 'pent') then
begin
if (SUAC_Wort_Kontrolle = 'meth') then Anzahl := 1;
if (SUAC_Wort_Kontrolle = 'prop') then Anzahl := 3;
if (SUAC_Wort_Kontrolle = 'pent') then Anzahl := 5;
StandardMessage(7);
INC(ScanKopf);
if Formel[ScanKopf] <> ('a') then
begin
Fehler(7);
exit;
end
else
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('n') then
begin
Fehler(7);
exit;
end
else
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('e') then
begin
Fehler(7);
exit;
end
else
begin
StandardMessage(8);
Ausgabe;
exit;
end;
end;
end;
end;
writeln('--- a problem ---');
halt;
end;
procedure Formula;
begin
StandardMessage(9);
ScanKopf := 0; { Scankopf auf 1. Element }
Zeichen := Formel[Scankopf];
if (Zeichen IN ['0'..'6']) or
(Zeichen IN ['m','d','t']) then
begin
StandardMessage(10);
Prefix;
halt;
end
else
begin
TokenTest := ' ';
For ScanKopf := 0 to 3 do Insert(Formel[Scankopf], TokenTest, Scankopf+1);
if (TokenTest = 'hexa ') or (TokenTest = 'pent ') then
begin
if TokenTest = 'pent ' then
begin
Insert(Formel[Scankopf+1], TokenTest, Scankopf+2);
if TokenTest = 'penta' then write(Tokentest);
end;
StandardMessage(11);
Prefix;
halt;
end;
end;
{Startsybole für MainChain lt. SUAC: meth, eth, prop & pent, but, hex }
if Zeichen IN ['m','e','p','b','h'] then
begin
StandardMessage(12);
{MainChain;} halt; { noch nicht geöffnet }
end
else Fehler(0);
halt;
end;
procedure Number;
begin
BNT_Kontrolle := BNT_Sicherung;
Zeichen := Formel[ScanKopf];
if Zeichen IN ['0'..'6'] then
begin
INC(ScanKopf);
INC(BNT_Kontrolle);
BNT_Sicherung := BNT_Kontrolle;
StandardMessage(13);
Zeichen := Formel[ScanKopf];
if Zeichen IN ['-',','] then POS else Fehler(2);
end
else
begin
Fehler(2);
halt;
end;
end;
procedure POS;
begin
{ ich komme von Prefix scanne eine Ziffer und gehe weiter zu Number }
{ eindeutig, da nur dann POS aufgerufen wird, wenn Zeichen = Ziffer }
Zeichen := Formel[ScanKopf];
if Zeichen IN ['0'..'6'] then
begin
StandardMessage(14);
Number;
end
else { Fallunterscheidungen bei der Rückkehr aus Number }
begin { ich scanne ein "-" und gehe zu Substituent }
if Zeichen IN ['-'] then Substituent;
{ ich scanne ein "," und prüfe was danach folgt }
{ Fall 1 : "-" --> Fehler }
{ Fall 2 : Ziffer zw. "0..6" --> Number }
if Zeichen IN [','] then
begin
INC(ScanKopf);
Zeichen := Formel[ScanKopf];
if Zeichen IN ['-'] then
begin
Fehler (1);
Fehler(11);
end
else
begin
if Zeichen IN ['0'..'6'] then Number;
end;
end;
end;
Fehler(1);
halt;
end;
procedure BNT;
begin
case BNT_Kontrolle of
1 : begin BNT_Wort:= ('mono '); TokenLaengenKorrektur := 3; end;
2 : begin BNT_Wort:= ('di '); TokenLaengenKorrektur := 1; end;
3 : begin BNT_Wort:= ('tri '); TokenLaengenKorrektur := 2; end;
4 : begin BNT_Wort:= ('tetra'); TokenLaengenKorrektur := 4; end;
5 : begin BNT_Wort:= ('penta'); TokenLaengenKorrektur := 4; end;
6 : begin BNT_Wort:= ('hexa '); TokenLaengenKorrektur := 3; end;
end;
INC(ScanKopf);
i := 1;
BNT_Wort_Kontrolle := ' ';
Anfang:= ScanKopf;
Ende := ScanKopf + TokenLaengenKorrektur;
For ScanKopf := Anfang to Ende do
begin
Insert(Formel[ScanKopf], BNT_Wort_Kontrolle, i );
INC(i);
end;
if BNT_Wort = BNT_Wort_Kontrolle then
begin
StandardMessage(15);
SUAC_Radical;
end
else Fehler(4);
end;
procedure SUAC;
begin
StandardMessage(16);
INC(ScanKopf);
j := 1;
SUAC_Wort_Kontrolle := ' ';
For ScanKopf := ScanKopf to ScanKopf + 2 do { hier scannen der 3er-Token }
begin
Insert(Formel[ScanKopf], SUAC_Wort_Kontrolle, j);
INC(j);
end;
if (SUAC_Wort_Kontrolle = 'eth') or
(SUAC_Wort_Kontrolle = 'but') or
(SUAC_Wort_Kontrolle = 'hex') then
begin
if (SUAC_Wort_Kontrolle = 'eth') then
begin
Anzahl := 2;
Struktur:= 'C2H5';
end;
if (SUAC_Wort_Kontrolle = 'but') then
begin
Anzahl := 4;
Struktur:= 'C4H9';
end;
if (SUAC_Wort_Kontrolle = 'hex') then
begin
Anzahl := 6;
Struktur:= 'C6H13';
end;
StandardMessage(17);
{ if NOT_MainChain = false then } { zukünftig 2 x SUAC }
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('y') then
begin
Fehler(6);
halt;
end
else
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('l') then
begin
Fehler(6);
halt;
end
else
begin
StandardMessage(18);
MainChain;
exit;
end;
end;
end;
end;
INC(ScanKopf); { hier scannen der 4er-Token }
Insert(Formel[ScanKopf], SUAC_Wort_Kontrolle, j);
if (SUAC_Wort_Kontrolle = 'meth') or
(SUAC_Wort_Kontrolle = 'prop') or
(SUAC_Wort_Kontrolle = 'pent') then
begin
if (SUAC_Wort_Kontrolle = 'meth') then
begin
Anzahl := 1;
Struktur:= 'CH3';
end;
if (SUAC_Wort_Kontrolle = 'prop') then
begin
Anzahl := 2;
Struktur:= 'C3H7';
end;
if (SUAC_Wort_Kontrolle = 'pent') then
begin
Anzahl := 5;
Struktur:= 'C5H11';
end;
StandardMessage(19);
{ if NOT_MainChain = false then }
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('y') then
begin
Fehler(6);
halt;
end
else
begin
INC(ScanKopf);
if Formel[ScanKopf] <> ('l') then
begin
Fehler(6);
halt;
end
else
begin
StandardMessage(20);
MainChain;
exit;
end;
end;
end;
end;
Fehler(6);
halt;
end;
procedure SUAC_Radical;
begin
StandardMessage(21);
SUAC;
end;
procedure Substituent;
var BNT_Wort_Kontrolle : string[5];
FehlerCode : integer;
begin
readln;
if BNT_Kontrolle > 0 then BNT else SUAC_Radical;
end;
procedure Prefix;
begin
StandardMessage(22);
ScanKopf := 0; { Scankopf auf 1. Element }
Zeichen := Formel[Scankopf];
if (Zeichen IN ['0'..'6']) then
begin
StandardMessage(23);
POS;
end
else
begin
if (Zeichen IN ['m','d','t','p','h']) then
begin
StandardMessage(24);
DEC(ScanKopf); { ScanKopf ist nun -1 }
Substituent; { und wird in SUAC wieder }
end { auf "NULL" gesetzt zum }
else Fehler(0); { des 1. Zeichens }
end; { Anpassung an POS-Number ..}
end;
begin
InitWinCrt;
ClrScr;
Eingabe;
Formula;
DoneWinCrt;
end.
--------------- Units -------------------
unit Daten;
interface
var Formel : array[0..255] of char;
Position_im_Formel : byte;
i, j : byte;
ScanKopf : shortInt;
TokenLaengenKorrektur : shortInt;
Anfang, Ende : integer;
Zeichen : char;
NOT_MainChain : boolean;
Struktur : String[5];
Tokentest : string[5];
BNT_Wort_Kontrolle : string[5];
BNT_Wort : string[5];
BNT_Sicherung : shortInt;
BNT_Kontrolle : shortInt; { Anzahl der Nebenketten = BNT-Wert }
SUAC_Wort_Kontrolle : string[4]; { string zur TOKEN-Kontrolle }
Anzahl : byte; { Anzahl der C-Atome in der Hauptkette }
implementation
begin
end.
------
unit Message;
interface
procedure Fehler(FehlerCode:Byte);
procedure StandardMessage(MsgNumber : Byte);
implementation
uses Daten, WinCrt;
procedure Fehler(FehlerCode:Byte);
begin
writeln;
if FehlerCode < 10 then writeln('Achtung: syntaktischer Fehler im ');
case FehlerCode of
0: writeln('Modul "Formula" --> falsches Startsymbol');
1: writeln('Modul "POS"');
2: writeln('Modul "Number"');
3: writeln('Modul "Substituent"');
4: writeln('Modul "BNT"');
5: writeln('Modul "SUAC-Radical"');
6: writeln('Untermodul "SUAC" vom Modul SUAC-Radical');
7: writeln('Modul "MainChain"');
8: writeln('Untermodul "SUAC" vom Modul MainChain');
11: writeln('... nach einem Komma muss eine Ziffer folgen');
end;
writeln;
readln;
halt;
end;
procedure StandardMessage(MsgNumber : Byte);
begin
case MsgNumber of
0: begin
writeln('****************************************');
writeln('* Ende der Eingabe mit dem Zeichen "$" *');
writeln('* *');
writeln('* Beispiel: 2,3,5-trimethylhexane$ *');
writeln('* *');
writeln('* Bitte chemische Formel eingeben: *');
writeln('****************************************');
writeln;
write (' --> ');
end;
1: begin
writeln;
writeln('******************************************');
writeln('* ... ich gehe jetzt ins Modul "Formula" *');
writeln('* *');
writeln('* ... weiter mit ENTER *');
writeln('******************************************');
readln;
end;
2: begin
writeln;
writeln('********************************************');
writeln('* ... die eingegebene organische Struktur *');
writeln('* *');
write ('* ');
end;
3: begin
writeln(' *');
writeln('* *');
writeln('* entspricht der UICAP-Nomemklatur *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
4: begin
ClrScr;
writeln('****************************************************************');
writeln('* Ich bin jetzt im Modul "MainChain" und scanne jetzt die *');
writeln('* Informationen über die Anzahl der Kohlenwasserstoffe in der *');
writeln('* Hauptkette *');
writeln('* ist Token = meth --> dann erhalte ich 1 Kohlenwasserstoff *');
writeln('* eht --> dann -"- 2 Kohlenwasserstoffe *');
writeln('* prop --> dann -"- 3 -"- *');
writeln('* but --> dann -"- 4 -"- *');
writeln('* pent --> dann -"- 5 -"- *');
writeln('* hex --> dann -"- 6 -"- *');
writeln('* ansonsten Abbruch, da falsches Token *');
writeln('* ... weiter mit ENTER *');
writeln('****************************************************************');
readln;
end;
5: begin
writeln;
writeln('********************************************');
writeln('* ... ich erkenne das TOKEN ',SUAC_WORT_Kontrolle,' *');
writeln('* im Modul "SUAC" von MAINCHain *');
writeln('* d.h., die Hauptkette besteht aus *');
writeln('* ',Anzahl,' Kohlenstoffatomen *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
6: begin
writeln;
writeln('********************************************');
writeln('* ... ich erkenne ein korrektes "ane"-Ende *');
writeln('* im SUAC-Modul von "MainChain" *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
7: begin
writeln;
writeln('********************************************');
writeln('* ... ich erkenne das TOKEN ',SUAC_WORT_Kontrolle,' *');
writeln('* im Modul "SUAC" von MAINCHain *');
writeln('* d.h., die Hauptkette besteht aus *');
writeln('* ',Anzahl,' Kohlenstoffatomen *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
8: begin
writeln;
writeln('********************************************');
writeln('* ... ich erkenne ein korrektes "ane"-Ende *');
writeln('* im SUAC-Zweig von Modul "MainChain" *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
9: begin
ClrScr;
writeln('****************************************************************');
writeln('* Ich bin jetzt im Modul "Formula" und scanne das Startsymbol *');
writeln('* der Formel und entscheide damit über den weiteren "Scanweg" *');
writeln('* ist StartSymbol = Ziffer [0..6] oder *');
writeln('* Buchstabe [m,d,t] oder *');
writeln('* Token [penta, hexa] *');
writeln('* dann gehe ich nach Modul ---> "Prefix" *');
writeln('* ansonsten gehe ich nach Modul ---> "MainChain", wenn *');
writeln('* das Startsymbol = "korrekter" Buchstabe *');
writeln('* ansonsten Abbruch, da falsches Startsymbol *');
writeln('****************************************************************');
end;
10: begin
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "Prefix" *');
writeln('* da Startsymbol = ',Zeichen,' *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
11: begin
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "Prefix" *');
writeln('* da Token = ',TokenTest,' *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
12: begin
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "MainChain" *');
writeln('* da Startsymbol = ',Zeichen,' *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
13: begin
writeln;
writeln('********************************************');
writeln('* ... ich erkenne eine ',BNT_Kontrolle,'. Nebenkette am *');
writeln('* ',Zeichen,'. Kohlenwassersroffatom *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
14: begin
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "Number" *');
writeln('* da Symbol = ',Zeichen,' *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
15: begin
ClrScr;
writeln;
writeln('************************************************');
writeln('* ... ich erkenne und bestätige die *');
writeln('* ',BNT_Kontrolle,'. Nebenketten am *');
writeln('* Kohlenwassersroffatom --> referenziert *');
writeln('* durch das TOKEN --> ',BNT_Wort_Kontrolle,' *');
writeln('* ... weiter mit ENTER *');
writeln('************************************************');
readln;
writeln;
writeln('************************************************');
writeln('* ... ich gehe jetzt ins Modul "SUAC_Radical" *');
writeln('* *');
writeln('* ... weiter mit ENTER *');
writeln('************************************************');
readln;
end;
16: begin
ClrScr;
writeln('****************************************************************');
writeln('* Ich bin jetzt im Modul "SUAC" und scanne jetzt die *');
writeln('* Informationen über den Aufbau der Nebenketten *');
writeln('* ist Token = meth --> dann erhalte ich als Nebenkette CH3 *');
writeln('* eht --> dann C2H5 *');
writeln('* prop --> dann C3H7 *');
writeln('* but --> dann C4H9 *');
writeln('* pent --> dann C5H11 *');
writeln('* hex --> dann C6H13 *');
writeln('* ansonsten Abbruch, da falsches Token *');
writeln('* ... weiter mit ENTER *');
writeln('****************************************************************');
readln;
end;
17: begin
writeln;
writeln('************************************************');
writeln('* ... ich erkenne im Modul SUAC das TOKEN *');
writeln('* ',SUAC_Wort_Kontrolle,' *');
writeln('* d.h., die Nebenketten haben jeweils *');
writeln('* ',Anzahl,' Kohlenwasserstoff(e) *');
writeln('* in Form einer ',Struktur,'-Verbindung *');
writeln('* ... weiter mit ENTER *');
writeln('************************************************');
readln;
end;
18: begin
ClrScr;
writeln;
writeln('********************************************');
writeln('* ... ich erkenne ein korrektes "yl"-Ende *');
writeln('* im SUAC-Radical-Zweig *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "MainChain" *');
writeln('* *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
19: begin
writeln;
writeln('************************************************');
writeln('* ... ich erkenne im Modul SUAC das TOKEN *');
writeln('* ',SUAC_Wort_Kontrolle,' *');
writeln('* d.h., die Nebenketten haben jeweils *');
writeln('* ',Anzahl,' Kohlenwasserstoff(e) *');
writeln('* in Form einer ',Struktur,'-Verbindung *');
writeln('* ... weiter mit ENTER *');
writeln('************************************************');
readln;
end;
20: begin
ClrScr;
writeln;
writeln('********************************************');
writeln('* ... ich erkenne ein korrektes "yl"-Ende *');
writeln('* im SUAC-Radical-Zweig *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "MainChain" *');
writeln('* *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
21: begin
writeln;
writeln('************************************************');
writeln('* ... ich gehe jetzt ins Modul "SUAC" *');
writeln('* *');
writeln('* ... weiter mit ENTER *');
writeln('************************************************');
readln;
end;
22: begin
ClrScr;
writeln('****************************************************************');
writeln('* Ich bin jetzt im Modul "Prefix" und scanne das Startsymbol *');
writeln('* der Formel und entscheide damit über den weiteren "Scanweg" *');
writeln('* ist StartSymbol = Ziffer [0..6] *');
writeln('* dann gehe ich nach Modul ---> "POS" *');
writeln('* ansonsten gehe ich nach Modul ---> "Substituent", wenn *');
writeln('* das Startsymbol = "korrekter" Buchstabe *');
writeln('* ansonsten Abbruch, da falsches Startsymbol *');
writeln('* *');
writeln('* Memo: eigentlich redundant in Bezug auf Formula *');
writeln('****************************************************************');
end;
23: begin
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul "POS" *');
writeln('* da Startsymbol = ',Zeichen,' *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
24: begin
writeln;
writeln('********************************************');
writeln('* ... ich gehe jetzt ins Modul Substituent *');
writeln('* da Startsymbol = ',Zeichen,' *');
writeln('* ... weiter mit ENTER *');
writeln('********************************************');
readln;
end;
25: begin
{ noch leer }
end;
end;
end;
begin
end.
|
Benutzer: Gast
Besitzer: mthomas Zuletzt geändert am:
|
|
|