Die Suche im Syntaxbaum lässt sich wesentlich vereinfachen, wenn die
anzuwendende Regel durch das jeweils betrachtete Zeichen (oder eine feste Zahl
von Folgezeichen) des zu erkennenden Ausdrucks eindeutig festgelegt ist.
In diesem Fallen lassen sich nämlich Sackgassen im Syntaxbaum vermeiden.
Wir betrachten dies am Beispiel der Grammatik G2 für wohldefinierte Klammerterme:
S ::= ( S ) S Regel 1
S ::= - (nichts) Regel 2
Prozedurkopf bleibt gleich Die Regeln sind als Unter- prozeduren realisiert. Regel 1 der Grammatik G2 Regel 2 der Grammatik G2 (ersetzen durch nichts) Hier sieht man, dass die anzu- wendende Regel von Symbol des zu erkennenden Textes an der entsprechenden Stelle abhängt. Backtracking entfällt. |
procedure TForm1.Baumsuche(Eingabe : String;
erzeugter_text : String;
stelle : Integer;
var ok : Boolean);
var probetext :String;
s_stelle : Integer;
procedure regel1(var stimmt:Boolean);
begin
probetext := erzeugter_text;
ersetze('S','(S)S',probetext);
baumsuche(Eingabe,probeknoten,probetext,s_stelle+1,stimmt)
end;
procedure regel2(var stimmt:Boolean);
begin
probetext := erzeugter_text;
ersetze('S','',probetext);
baumsuche(Eingabe,probeknoten,probetext,stelle,stimmt)
end;(* of Proc regel 3 *)
begin (* of Proc baumsuche *)
if erzeugter_text = Eingabe then
ok := true
else begin
ok := false;
if (stelle <= length(Eingabe)) then begin
s_stelle := pos('S',erzeugter_text);
if s_stelle > 0 then
begin
if Eingabe[s_stelle]='(' then
regel1(ok)
else
regel2(ok);
end
end
end ;
end;
|
| Zur
nächsten Seite
|
| © 2001 LK 13 If und G. Kubitz | Hannah-Arendt-Gymnasium, Lengerich |