Hi,
kann sich mal einer diesen von mir geschriebenen Code für einen Binärbaum anschauen, ob alles soweit richtig ist? Denn ich mache solch einen Baum zu ersten Mal, und bei dem Parser, den ich vorhabe zu schreiben, ist es wichtig, dass der Baum seine Arbeit tut, und zwar soll in ihm ein Term gespeichert werden. Jeweils die Operatoren rechts, und die Zahlen links davon.
Die Funktionen zum Auslesen un auswerten des Baums fehlen noch, sind aber im Moment nicht so wichtig.
Später kommt in der procedure Add(Data: TData) noch eine Abfrage, ob kein Operator mehr im zu parsenden Term übrig ist, so dass dann die Variable bzw. die Zahl am Schluss auch rechts stehen kann (also in myRight).
Delphi-Quellcode:
unit uParser;
interface
type
TOperator = (opAdd, opSub, opMul, opDiv,
opPot, opSin, opCos, opExp);
TTokenType = (tkVar, tkOp, tkVal);
TData =
record
case Token: TTokenType
of
tkOp: (
Operator: TOperator);
tkVal: (Value: Extended);
tkVar: ();
end;
PNode = ^TNode;
//Knotenklasse
TNode =
class(TObject)
private
myLeft, myRight: PNode;
myData: TData;
public
constructor Create(Data: TData);
destructor Destroy;
override;
procedure Add(Data: TData);
function GetOperator:
String;
function GetValue: Extended;
end;
//Binärbaum, zeigt auf den Kopfknoten
TBinaryTree =
class(TObject)
private
myHead: PNode;
public
constructor Create(Data: TData);
destructor Destroy;
override;
procedure Add(Data: TData);
end;
implementation
{Deklarationen von TNode}
constructor TNode.Create(Data: TData);
begin
myData := Data;
myLeft :=
nil;
myRight :=
nil;
end;
procedure TNode.Add(Data: TData);
begin
if Data.Token = tkOp
then begin
if myRight =
nil then
myRight := Pointer(TNode.Create(Data))
else
myRight.Add(Data);
end else begin
if myLeft =
nil then
myLeft := Pointer(TNode.Create(Data))
else
myRight.Add(Data);
end;
end;
function TNode.GetOperator:
String;
begin
if myData.Token = tkOp
then begin
case myData.
Operator of
opAdd: Result := '
+';
opSub: Result := '
-';
opMul: Result := '
*';
opDiv: Result := '
/';
opPot: Result := '
^';
opSin: Result := '
sin';
opCos: Result := '
cos';
opExp: Result := '
exp';
end;
end;
end;
function TNode.GetValue: Extended;
begin
if myData.Token = tkVal
then
Result := myData.Value;
end;
destructor TNode.Destroy;
begin
myLeft.Destroy;
myRight.Destroy;
myLeft :=
nil;
myRight :=
nil;
inherited Destroy;
end;
{Deklarationen von TBinaryTree}
constructor TBinaryTree.Create(Data: TData);
begin
myHead := Pointer(TNode.Create(Data));
end;
procedure TBinaryTree.Add(Data: TData);
begin
myHead.Add(Data);
end;
destructor TBinaryTree.Destroy;
begin
myHead.Destroy;
myHead :=
nil;
inherited Destroy;
end;
end.
Vielen Dank schonmal im Voraus
MfG