
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 nächsten Seite |
| © 2004 LK 13 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |