function Eval(term:
string): Integer;
const
isNone = 0;
isNum = 1;
isOp = 2;
var
**** DER CODE FUNKTIONIERT NICHT RICHTIG
numStack:
array[0..10]
of Integer;
Oporder:
array[char]
of Byte;
SP: Integer;
Ops:
string;
c: Char;
code, sign, number: Integer;
begin
fillchar(numstack, sizeof(numstack), 0);
fillchar(OpOrder, sizeof(opOrder), 0);
opOrder['
+'] := 1;
opOrder['
-'] := 1;
opOrder['
*'] := 2;
opOrder['
/'] := 2;
opOrder['
('] := 99;
sign := 1;
Ops := '
(';
SP := 0;
number := 0;
Result := 0;
term := term + '
)';
code := isNone;
for c
in term
do
case c
of
'
0'..'
9':
begin
number := 10 * number + ord(c) - 48;
code := isNum;
end;
'
+', '
-', '
*', '
/', '
(', '
)':
begin
if code = isNum
then begin
numStack[SP] := sign * number;
sign := 1;
inc(SP);
code := isNone;
number := 0;
end else if code = isOp
then
if c = '
-'
then begin
sign := -sign;
Continue
end;
code := isOp;
if opOrder[c] <= opOrder[Ops[Length(Ops)]]
then begin
while ops[length(ops)] <> '
('
do begin
dec(sp);
case ops[length(ops)]
of
'
+': numstack[sp - 1] := numstack[sp - 1] + numstack[sp];
'
-': numstack[sp - 1] := numstack[sp - 1] - numstack[sp];
'
*': numstack[sp - 1] := numstack[sp - 1] * numstack[sp];
'
/': numstack[sp - 1] := numstack[sp - 1]
div numstack[sp];
end;
numstack[sp] := 0;
setlength(ops, length(ops) - 1);
end;
end;
if c = '
)'
then
setlength(ops, length(ops) - 1)
else
ops := ops + c;
end;
end;
result := Numstack[0];
end;