Wenn der bisher erzeugte Ausdruck mit dem zu prüfendem überinstimmt, dann gehört er zur Sprache und die Rekursion kann enden. Wenn keine Nichtterminalsymbole mehr im bisher erzeugten Ausdruck vorhanden sind, oder wenn sich die beiden Ausdrücke bis zum ersten Nichtterminalsymbol unterscheiden, dann kann aus dem bisher erzeugten nicht mehr der zu prüfende Ausdruck hervorgehen. Daher kann die Rekursion hier enden. Wenn beides nicht der Fall ist, dann ist eine Übereinstimmung noch möglich. Daher wird das erste Nichtterminalsymbol nun nach allen möglichen Regeln ersetzt und die dabei erzeugten neuen Ausdrücke rekursiv an die Methode "Pruefe" übergeben. Wenn aus einem der neuen Ausdrücke der zu prüfende hervorgegangen ist, müssen die anderen Regeln nicht mehr überprüft werden. Wenn durch eine der Ersetzungen der zu prüfende Ausdruck hervorgegangen ist, dann ist der Rückgabewert der Methode true, andernfalls false. |
function TRekursivParser.Pruefe (pZuPruefen, pBisherErzeugt: TStringArray) : Boolean; var RegelAnzahl, aktuelleRegelNummer : Integer; tmpNeuerBaum : TBaum; letztesErgebniss : Boolean; begin if StringArraysGleich(pBisherErzeugt, pZuPruefen) then result := true; else begin if gibPositionVomErstenNTS(pBisherErzeugt) = -1 then result := false else begin if not StringArraysBisPositionGleich(pBisherErzeugt, pZuPruefen, gibPositionVomErstenNTS(pBisherErzeugt)) then result := false else begin //Übereinstimmung noch nicht vorhanden, aber noch möglich aktuelleRegelNummer := 1; letztesErgebniss := false; RegelAnzahl := gibRegelAnzahlFuerErstesNTS(pBisherErzeugt); while (aktuelleRegelNummer <= RegelAnzahl) and (not letztesErgebniss) do begin letztesErgebniss := Pruefe(pZuPruefen,ersetzeErstesNTSNachRegel(pBisherErzeugt, aktuelleRegelNummer), pInfoNachrichtenAnzeigen); aktuelleRegelNummer := aktuelleRegelNummer + 1; end; result := letztesErgebniss; end; end; end; end; |
Zur Themenübersicht | |
Zum Seitenanfang | |
Zur vorigen Seite |
© 2004 LK 13 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |