Die Tokenliste und eine Speicheradresse zum Ablegen der entsprechenden Fehlermeldung werden an den Automaten übergeben. Dessen Rückgabe gibt die Position des ersten Fehlers an. Die Tokenliste enthält Fehler wenn die Fehlerposition von -1 abweicht. Dann wird der entsprechende Token markiert und die an der zuvor übergebenen Speicheradresse abgelegte Fehlermeldung ausgegeben. |
function TKellerParser.parseTokenliste (pTokenListe: TTokenListe) : Boolean; var FehlerPosition : Integer; FehlerMeldung : String; begin FehlerPosition := hatParserKellerAutomat.verarbeiteEingabe(pTokenListe, FehlerMeldung); if FehlerPosition <> - 1 then begin MarkiereListBoxEintrag(FehlerPosition); MessageDlg('Fehler: ' + #13#10 + FehlerMeldung, mtError,[mbOk], 0); result := false; end else begin MessageDlg('Der Programmtext ist Syntaktisch korrekt.', mtInformation,[mbOk], 0); result := true; end; end; |
type TZustand = (zStart, zFehler); type TKellerSymbol = (S, nNOT, nSONST, BEFEHL, ANFRAGE, kNIL, //Nichtterminale wenn, dann, sonst, solangewie, tue, tNot, KA, KZ, vor, drehe_links, drehe_rechts, nimm, gib, vornefrei, itemda, blicktnach_links, blicktnach_rechts, blicktnach_oben, blicktnach_unten, itemsimrucksack); |
Keller zurücksetzen. Zunächst das oberste Symbol vom Keller nehmen Wenn es sich um ein NTS handelt, dann lege die entsprechende Ersetzung auf den Keller. Wenn keine Ersetzung gefunden wurde, dann gehört der zu prüfende Ausdruck nicht zu Sprache. Wenn es sich um ein Terminalsymbol handelt... ...aber bereits das Ende der Eingabe erreicht ist, dann kann der Ausdruck nicht zur Sprache gehören und die entsprechende Fehlermeldung wird gespeichert. ...und das aktuelle Eingabzeichen nicht mit dem obersten Kellersymbol übereinstimmt, dann kann der Ausdruck nicht zur Sprache gehören und die entsprechende Fehlermeldung wird gespeichert. ...und das aktuelle Eingabzeichen mit dem obersten Kellersymbol übereinstimmt, dann kann das nächste Eingabezeichen verarbeitet werden Wiederhole bis ein Fehler aufgetreten ist, oder der Keller leer ist. Wenn zwar noch kein Fehler aufgetreten ist, aber bei leerem Keller noch nicht alle Eingabezeichen abgearbeitet sind (also am Ende noch Eingaben stehen, die nicht in die Grammatik passen), dann gehört der Ausdruck ebenfalls nicht zur Sprache. Falls der Fehler hinter dem letzten Token vorliegt (also z. B. der Keller noch nicht leer ist, aber keine Eingabezeiche mehr vorhanden sind) soll der letzte Token als fehlerhaft markiert werden. |
function TParserKellerAutomat.verarbeiteEingabe (pEingabe: TTokenListe; var FehlerMeldung : String) : Integer; var AktuelleEingabe : TToken; AktuellesKellerSymbol : TKellerSymbol; Position, FehlerPosition : Integer; begin setzeZurueck; Position := 0; FehlerPosition := -1; result := -1; repeat AktuellesKellerSymbol := hatKeller.gibOberstes; if AktuellesKellerSymbol in NichtterminaleKellerSymbole then begin if not LegeErsetzungFuerNTSAufStapel(AktuellesKellerSymbol, pEingabe, position, FehlerMeldung) then FehlerPosition := position; end else begin if position = length(pEingabe) then begin FehlerPosition := position; FehlerMeldung := '"' + kellerSymbolToString(AktuellesKellerSymbol) + '" erwartet, aber keine weiteren Eingaben vorhanden.'; end else begin if kellerSymbolToString(AktuellesKellerSymbol) <> pEingabe[position][2] then begin FehlerPosition := position; FehlerMeldung := '"' + kellerSymbolToString(AktuellesKellerSymbol) + '" erwartet, aber "' + pEingabe[position][2] + '" gefunden.'; end else position := position + 1; end; end; until (FehlerPosition <> -1) or (hatKeller.istLeer); if (FehlerPosition = -1) and (hatKeller.istLeer) and (position < length(pEingabe)) then FehlerPosition := Position; if FehlerPosition >= length(pEingabe) then result := length(pEingabe) - 1 else result := FehlerPosition; end; |
Zur Themenübersicht | |
Zum Seitenanfang | |
Zur vorigen Seite | Zur nächsten Seite |
© 2004 LK 13 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |