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 Themenübersicht | |
Zum Seitenanfang | |
Zur vorigen Seite | Zur nächsten Seite |
© 2004 LK 13 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |