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