% Uebersetzung von DCG-Regeln in Prolog-Klauseln: H.L. 4.6.02 % DCG aus einer Eingabedatei, Klauseln in eine Ausgabedatei: uebersetze(Eingabedatei,Ausgabedatei) :- open(Eingabedatei,read,Eingabestrom), open(Ausgabedatei,write,Ausgabestrom), uebersetzeRegeln(Eingabestrom, Ausgabestrom), close(Eingabestrom), close(Ausgabestrom). uebersetzeRegeln(Eingabestrom,Ausgabestrom) :- read(Eingabestrom,Regel), % kuerzt Strom! (Regel = end_of_file -> write(user,'\nFertig. \n') ; translate(Regel,Klausel), write(user,'\nRegel: '), write(user,Regel), write(user,'\nÜbersetzung: \n'), portray_clause(Klausel), portray_clause(Ausgabestrom,Klausel), uebersetzeRegeln(Eingabestrom, Ausgabestrom)). portray_clause(Strom,Klausel) :- tell(Strom), portray_clause(Klausel), tell(user). % Uebersetzung von DCG-Regeln in Klauseln: translate((Links --> Rechts),(Kopf :- Rumpf)) :- translate(Links,Kopf,I,J), translate(Rechts,Rumpf,I,J). translate((A,B),(ATr,BTr),I,J) :- !, translate(A,ATr,I,K), translate(B,BTr,K,J). translate((A;B),(ATr;BTr),I,J) :- !, translate(A,ATr,I,J), translate(B,BTr,I,J). translate([A|As],(I = Liste),I,J) :- !, terminals([A|As]), append([A|As],J,Liste). translate({Atoms},Atoms,I,J) :- !. translate(A,ATr,I,J) :- nonterminal(A), !, A =.. [F|Args], append(Args,[I,J],ArgsIJ), ATr =.. [F|ArgsIJ]. nonterminal(A) :- atom(A) ; compound(A). terminals([A|As]) :- atom(A),terminals(As).