Für die Klammern sind zweierlei Dinge nötig:
1) Die Funktion "pos0" muss erweitert werden, so dass sie nur noch Zeichen findet, die NICHT in Klammern stehen. Das sieht dann so aus:
Delphi-Quellcode:
function pos0(
const c: char;
const s:
string): integer;
var k, z: Integer;
//z := number of brackets
begin
z := 0;
for k:=length(s)
downto 1
do
begin
if s[k]='
('
then inc(z);
if s[k]='
)'
then dec(z);
if (z=0)
and (s[k]=c)
then
begin
result := k;
// hit
exit;
end;
end;
result := 0;
// nothing found
end;
Bei einer offenen Klammer wird z erhöht, bei einer geschlossenen erniedrigt. Erst wenn z=0
und das richtige Zeichen ("c") gefunden wurde, DANN ist der Rückgabewert >0 => Das geforderte Zeichen wurde am Index "result" im String gefunden, und steht nicht in Klammern.
2) In der Prozedur "TTR" must du noch auf Klammern prüfen, und bei Fund dann den Term zwischen den Klammern wieder in TTR schmeissen.
Delphi-Quellcode:
// Letzter Abschnitt von obigem Quellcode mit Klammererweiterung
.
.
.
if pos0('^',s)>0 then
begin
currentND := TRNode.Create(opPow);
TTR(starting(s,'^'), currentND.subNodes[0]);
TTR(ending(s,'^'), currentND.subNodes[1]);
exit;
end else
//// Der Teil für die Klammern beginnt hier...
if (s>'') and (s[1]='(') then
begin
s:=copy(s,2,length(s)-2);
TTR(s, currentND);
exit;
end else
//// ...und endet hier :)
//// Keinen Operator im String gefunden, also muss eine Zahl vorliegen. Knoten mit Zahl erstellen
//// und Ende der Rekursion (kein erneuter Aufruf von TTR)
begin
currentND := TRNode.Create(StrToFloat(s));
exit;
end;
end;
3) Hast du nen Glück, dass das z.Zt. mein aktivstes Freizeitprojekt ist, und deshalb da noch so drin stecke
4) Viel Erfolg, und gewöhn dich nicht zu sehr an (halb-) fertige Quelltexte. War mehr nen Wilkommensservice
(Und weil ich so stolz bin, dass das Teil endlich läuft *g*) Sonst ist das eher weniger Gang und Gebe.
5) Viele Grüße, dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel