Einzelnen Beitrag anzeigen

Benutzerbild von Picard95
Picard95

Registriert seit: 14. Mai 2011
Ort: Dortmund
32 Beiträge
 
Delphi 4 Standard
 
#1

Probleme Mit Parser für UPN

  Alt 2. Mär 2012, 20:28
Delphi-Version: 5
Hallo Liebe Netzgemeinde,
Ich sitzte seit längerem an einem Programm für mein Facharbeit im Fach Mathematik. Das Programm soll am Ende einen UPN-Term (U P N=Umgekehrte Polnische Notation) Ausrechnen. Dieser Teil klappt auch ganz gut. Das Programm soll aber weiterhin auch einen sogenannten "Parser" beinhalten. Dieser Soll die Möglichkeit bieten, einen "Normalen" Term einzugeben, welcher per Knopfdruck in einen UPN Term umgewandelt wird.
Ein paar Infos vorweg:
Der Term ist als TListe deklariert. Jedes zeichen ist ein eigenes TObject vom typ TZahl oder TOperator
Ein Binärer Baum ist ein Baum mit zwei "Ästen"
Als Stack ist eine Liste mit zusatzfunktionen deklariert. Will heißen: Push pushbehind und pop

Funktionsweise
(Im foldenden ist mit Liste der Term gemeint)
Es werden zuerst Die klammern um den Term herrum entfernt (sollten welche existieren).
Dann werden 2 Listen kreiert (im folgenden RTerm und LTerm).
Die liste wird von hinten auf ein +/- durchsucht wird keines gefunden wird nach *// gesucht. Das Programm geht nun zu der Stelle an dem das Rechenzeichen steht. Auf dem weg dorthin werden alle Listenelemente in RTerm kopiert (und zwar so das das Element was in der Liste hinten steht da auch hinten ist) dann wird das Rechenzeichen (dies wird nicht kopiert) in die Wurzel eines Baumes geschrieben .
Der parser rückt ein Element in der Liste nach vorne.
Solange der Zieger der Liste (bei bedarf erklär ich es) nicht vor dem 1. Element steht werden die übrigen Elemente in LTerm kopiert.
Wenn RTerm nicht Leer ist wird das ganze rekursiv für den Rechten Teilbaum aufgerufen.
Wenn Lterm nicht Leer ist wird das ganze rekursiv für den Linken Teilbaum aufgerufen.
Der baum wird ausgegeben
Nun wird der Baum in einer anderen function nach dem Prinzip Links Rechts Wurzel ausgelesen und die Elemente in einen Stack geschrieben.

Infos zum Code:
Teilweise habe ich Sachen wie das Suchen oder Das Klammerentfernen ausgelagert. Klammern innerhalb eines Term werden übersprungen.
Die Showmessages dienen zur Fehlersuche im Betrieb.

Code des Baumeintragens:
Delphi-Quellcode:
function Baumeintragen(Term:TListe):Tbinbaum;
var Baum:Tbinbaum; OB,I:integer; LTerm,RTerm:TListe;Hilf:real;
begin
LTerm:=TListe.create;
RTerm:=TListe.create;
Term:=Klammernentfernen(Term);
OB:=sucheRE(Term);
Term.Tolast;
for I:=1 to OB do
  begin
    RTerm.toFirst;
    RTerm.insertBefore(Term.getobject);
    if Term.getobject is TZahl
      then
      begin
        Hilf:=TZahl(Term.getobject).gibzahl;
        showmessage('R added'+floattostr(Hilf));
        end
      else
        showmessage('R added'+TOperator(Term.getobject).giboperator);
    Term.previous;
  end;
Baum.Erzeuge(Term.getObject);
Term.previous;
 if Term.getobject is TZahl
      then
      begin
        Hilf:=TZahl(Term.getobject).gibzahl;
        showmessage('WU added'+floattostr(Hilf));
        end
      else
        showmessage('WU added'+TOperator(Term.getobject).giboperator);
while ( NOT Term.isbefore) DO
  begin
    LTerm.tofirst;
    LTerm.insertbefore(Term.getobject);
    Term.previous;
     if Term.getobject is TZahl
      then
      begin
        Hilf:=TZahl(Term.getobject).gibzahl;
        showmessage('L added'+floattostr(Hilf));
        end
      else
        showmessage('L added'+TOperator(Term.getobject).giboperator);
  end;
if NOT(LTerm.isEmpty)
  then
    Baum.haenge_an(Links,Baumeintragen(LTerm));
if NOT (RTerm.isempty)
  then
    Baum.haenge_an(rechts,Baumeintragen(RTerm));
end;
Code des Auslesens:
Delphi-Quellcode:
function Baumauslesen(Baum:TBinbaum):TStack;
var Stack:TStack;
begin
if NOT (Baum.IstLeer(Links))
  then
    Stack:=Baumauslesen(Baum.Teilbaum(Links));
if NOT (Baum.IstLeer(Rechts))
  then
    Stack:=Baumauslesen(Baum.Teilbaum(Rechts));
Stack.pushbehind(Baum.lies);
end;

function Termumwandlung(Term:TListe):TStack;
var Baum:TBinbaum ;
begin
  Baum:=Baumeintragen(Term);
  result:=Baumauslesen(Baum);
end;
Problem:
In der Unit U_Baum habe ich an folgender Stelle eine Fehlermeldung:
Delphi-Quellcode:
constructor TBinBaum.Erzeuge(X:TObject);
var Hilf:TObject;
begin
     Hilf:=X;
     if X is TOperator
       then
         showmessage('OP');//+TOperator(Hilf.getobject).gibOperator);
     inherited create;
     showmessage('Noch gehts?!');
     inhalt:=X;
     showmessage('Immernoch???');
     left:=Nil; right :=nil;
end;
Zwischen den Showmessages stürtzt das Programm leider ab ich weiß allerdings nicht Warum....
Wenn weiteres Material benötigt wird dann werde ich das auch gerne noch Hochladen. Im Anhang befindet sich die U_Baum zum besseren Verständniss.

Ich bedanke mich an dieser Stelle schonmal für das Lesen^^

[EDIT]Ich hoffe das das hier im Richtigen Forum ist, wenn nicht bitte ich euch mir das zu sagen, damit ich das Thema verschieben kann, bzw. es selber zu verschieben[/EDIT]
Angehängte Dateien
Dateityp: pas U_BAUM.pas (2,9 KB, 4x aufgerufen)
Christian
"Der Computer rechnet mit allem - nur nicht mit seinem Besitzer."
Dieter Hildebrandt

Geändert von Picard95 ( 2. Mär 2012 um 21:11 Uhr) Grund: Änderung in meinem Code - Besseres Verständniss
  Mit Zitat antworten Zitat