
Solange wie noch nicht das Ende der Tokenliste erreicht ist und noch kein Fehler aufgetreten ist, wird ein Token nach dem anderen an den ParserAutomaten eingegeben. Dabei wird seine Ausgabe gespeichert. Wenn ein Fehler auftrat, wird die letzte Ausgabe des ParserAutomaten als Fehlermeldung ausgegeben. Die Tokenliste ist fehlerfrei, wenn der Automat sich am Ende in einem akzeptierenden Zustand befindet. |
function TParser.parseTokenliste (pTokenListe: TTokenListe) : Boolean;
var
position : Integer;
letzteAusgabe : String;
begin
position := 0;
hatParserAutomat.setzeZurueck;
while (position < length(pTokenListe)) and (not hatParserAutomat.istInFehlerZustand) do
begin
letzteAusgabe := hatParserAutomat.verarbeiteEingabe(pTokenListe[position]);
position := position + 1;
end;
if hatParserAutomat.istInFehlerZustand
then MessageDlg('Fehler beim Parsen des Tokens Nr: ' + IntToStr(position) +
' (' + pTokenListe[position - 1][2] + ') Fehlermeldung: ' + #13#10 +
letzteAusgabe, mtError,[mbOk], 0);
result := hatParserAutomat.istInAkzeptiertemZustand;
end;
|
type
TZustand = (zStart, zNwenn, zNwennNot, zNwennAnfrage, zNDann,
zNDannKA, zNDannKZ, zNSonst, zNsonstKZ, zNSonstKA,
zNSolange, zNSolangeNot, zNSolangeAnfrage, zNTue,
zNTueKA, zNTueKZ, zFehler);
|

Wenn der Kombination aus Eingabe und aktuellem Zustand kein Folgezustand zugeordnet werden kann, ist der Folgezustand der Fehlerzustand. Andernfalls wird je nach aktuellem Zustand und eingegebenen Token ein Folgezustand entsprechend dem oben gezeigten Zustandsgraphen zurückgegeben. |
function TParserAutomat.UebergangsFunktionF (pAktuellerZustand: TZustand; pEingabe: TToken) : TZustand;
begin
result := FehlerZustand;
case pAktuellerZustand of
zStart : begin
if pEingabe[1] = 'befehl'
then result := zStart
else if pEingabe[1] = 'anfrage'
then result := zStart
else if pEingabe[2] = 'wenn'
then result := zNwenn
else if pEingabe[2] = 'solangewie'
then result := zNSolange
end; //of pAktuellerZustand : zStart
zNwenn : begin
if pEingabe[2] = 'not'
then result := zNwennNot
else if pEingabe[1] = 'anfrage'
then result := zNwennAnfrage
end; //of pAktuellerZustand : zNwenn
zNwennNot : begin
if pEingabe[1] = 'anfrage'
then result := zNwennAnfrage
[...]
zNTueKZ : begin
if pEingabe[1] = 'befehl'
then result := zStart
else if pEingabe[1] = 'anfrage'
then result := zStart
else if pEingabe[2] = 'wenn'
then result := zNwenn
else if pEingabe[2] = 'solangewie'
then result := zNSolange
end; //of pAktuellerZustand : zNTueKZ
end;
end;
|
Wenn der Kombination aus Eingabe und aktuellem Zustand keine Fehlermeldung zugeordnet werden kann, ist die zurückgegebene Meldung leer. Andernfalls wird je nach aktuellem Zustand und eingegebenen Token die entsprechende Fehlermeldung zurückgegeben. |
function TParserAutomat.AusgabeFunktionG (pAktuellerZustand: TZustand; pEingabe: TToken) : String;
begin
result := '';
case pAktuellerZustand of
zStart : begin
if (pEingabe[2] = 'dann') or
(pEingabe[2] = 'sonst') or
(pEingabe[2] = 'tue') or
(pEingabe[2] = #123) or
(pEingabe[2] = #125) or
(pEingabe[2] = 'not')
then result := pEingabe[2] + ' ist in diesem Kontext erlaubt.'
end; //of pAktuellerZustand : zStart
zNwenn : begin
if (pEingabe[1] = 'befehl') or
(pEingabe[2] = 'wenn') or
(pEingabe[2] = 'dann') or
(pEingabe[2] = 'sonst') or
(pEingabe[2] = 'solangewie') or
(pEingabe[2] = 'tue') or
(pEingabe[2] = #123) or
(pEingabe[2] = #125)
then result := 'Nur "not" oder eine Anfrage sind nach "Wenn" erlaubt.'
end; //of pAktuellerZustand : zNwenn
[...]
zNTueKZ : begin
if (pEingabe[2] = 'dann') or
(pEingabe[2] = 'sonst') or
(pEingabe[2] = 'tue') or
(pEingabe[2] = #123) or
(pEingabe[2] = #125) or
(pEingabe[2] = 'not')
then result := pEingabe[2] + ' ist in diesem Kontext erlaubt.'
end; //of pAktuellerZustand : zNTueKZ
end;
end;
|
|
Zur nächsten Seite |
| © 2004 LK 13 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |