Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme Mit Parser für UPN (https://www.delphipraxis.net/166859-probleme-mit-parser-fuer-upn.html)

Picard95 2. Mär 2012 19:28

Delphi-Version: 5

Probleme Mit Parser für UPN
 
Liste der Anhänge anzeigen (Anzahl: 1)
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]

Bjoerk 2. Mär 2012 20:46

AW: Probleme Mit Parser für UPN
 
Schmeiß mal die Lies raus und nenn deine Konstruktoren Create. Private Variablen beginnen per Konvention in Delphi mit einem F (wie Feld).

Delphi-Quellcode:
type
  TBinbaum = class
  private
    FInhalt: TObject;
    FLeft, FRight: TBinbaum;
  public
    property Inhalt: TObject Read FInhalt;
    ..
    constructor Create; overload;
    constructor Create(const Inhalt: TObject); overload;
  end;
Delphi-Quellcode:
constructor TBinbaum.Create;
begin
  inherited Create;
  FLeft:= Nil;
  FRight:= Nil;
  FInhalt:= Nil;
end;

constructor TBinbaum.Create (const Inhalt: TObject);
begin
  Create;
  FInhalt:= Inhalt;
end;

Picard95 2. Mär 2012 20:54

AW: Probleme Mit Parser für UPN
 
Joa umbenennen kann ich gleich mal mit anfange. Was das problem beim construcktor ist, ist das er 2 verschiedene hat. Hat in bestimmten Fällen auch sinn. Die Unit ist auch von meinem Informatik Lehrer genommen, geht einfach schneller sowas schon zu haben.:wink:
EDIT: Ich brauche aber das Lies in dem Auslesen der Bäume (Ich mag es auch lieber ohne im Unterricht sollen/müssen wir es aber immer so machen wegen OOP und so

Furtbichler 3. Mär 2012 09:32

AW: Probleme Mit Parser für UPN
 
[EDIT] es ist noch recht früh und da kann ich noch keine vollständigen Sätze LESEN. [/EDIT]

Hier gibt es eine fertige Lösung

Picard95 7. Mär 2012 10:09

AW: Probleme Mit Parser für UPN
 
Das Problem ist, dass ich halt nur den Term umwandeln möchte. Wenn ich das Programm im Link richtig verstanden habe dann rechnet es den Term diereckt aus...
Meine Facharbeit behandelt das Thema UPN weswegen ich ein Programm haben möchte was einen UPN Term ausrechnet. Das habe ich auch schon erreicht, es fehlt wie gesagt nur noch die Umwandlung in einen UPN Term.:wink:

Picard95 7. Mär 2012 20:22

AW: Probleme Mit Parser für UPN
 
ok problem gelöst: Ich muss beim constructor ja nicht
Delphi-Quellcode:
var Baum:TBinBaum;
.
.
.
Baum.create;
sondern:
Delphi-Quellcode:
var Baum:TBinbaum;
.
.
.
Baum:=TBinbaum.create;
War also ein kleiner lang andauernder Denkfehler.
Danke für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz