home *** CD-ROM | disk | FTP | other *** search
- { Author: Gavin Peters. }
-
- Program PostFixConvert;
- (*
- * This Program will convert a user entered expression to postfix, and
- * evaluate it simultaniously. Written by Gavin Peters, based slightly
- * on a stack example given in Algorithms (Pascal edition), pg
- *
- *)
- Var
- Stack : Array[1 .. 3] of Array[0 .. 500] of LongInt;
-
- Procedure Push(which : Integer; p : LongInt);
- begin
- Stack[which,0] := Stack[which,0]+1;
- Stack[which,Stack[which,0]] := p
- end;
-
- Function Pop(which : Integer) : LongInt;
- begin
- Pop := Stack[which,Stack[which,0]];
- Stack[which,0] := Stack[which,0]-1
- end;
-
- Var
- c : Char;
- x,t,
- bedmas : LongInt;
- numbers : Boolean;
-
- Procedure Evaluate( ch : Char );
-
- Function Power( exponent, base : LongInt ) : LongInt;
- begin
- if Exponent > 0 then
- Power := Base*Power(exponent-1, base)
- ELSE
- Power := 1
- end;
-
- begin
- Write(ch);
- if Numbers and not (ch = ' ') then
- x := x * 10 + (Ord(c) - Ord('0'))
- ELSE
- begin
- Case ch OF
- '*' : x := pop(2)*pop(2);
- '+' : x := pop(2)+pop(2);
- '-' : x := pop(2)-pop(2);
- '/' : x := pop(2) div pop(2);
- '%' : x := pop(2) MOD pop(2);
- '^' : x := Power(pop(2),pop(2));
- 'L' : x := pop(2) SHL pop(2);
- 'R' : x := pop(2) SHR pop(2);
- '|' : x := pop(2) or pop(2);
- '&' : x := pop(2) and pop(2);
- '$' : x := pop(2) xor pop(2);
- '=' : if pop(2) = pop(2) then
- x := 1
- else
- x := 0;
- '>' : if pop(2) > pop(2) then
- x := 1
- else
- x := 0;
- '<' : if pop(2) < pop(2) then
- x := 1
- else
- x := 0;
- '0','1'..'9' :
- begin
- Numbers := True;
- x := Ord(c) - Ord('0');
- Exit
- end;
- ' ' : if not Numbers then
- Exit;
- end;
-
- Numbers := False;
- Push(2,x);
- end;
- end;
-
- begin
- Writeln('Gavin''s calculator, version 1.00');
- Writeln;
- For x := 1 to 3 DO
- Stack[x, 0] := 0;
- x := 0;
- numbers := False;
- Bedmas := 50;
- Writeln('Enter an expression in infix:');
- Repeat
- Read(c);
- Case c OF
- ')' :
- begin
- Bedmas := Pop(3);
- Evaluate(' ');
- Evaluate(Chr(pop(1)));
- end;
-
- '^','%','+','-','*','/','L','R','|','&','$','=','<','>' :
- begin
- t := bedmas;
- Case c Of
-
- '>','<' : bedmas := 3;
- '|','$',
- '+','-' : bedmas := 2;
- '%','L','R','&',
- '*','/' : bedmas := 1;
- '^' : bedmas := 0;
- end;
- if t <= bedmas then
- begin
- Evaluate(' ');
- Evaluate(Chr(pop(1)));
- end;
- Push(1,ord(c));
- Evaluate(' ');
- end;
- '(' :
- begin
- Push(3,bedmas);
- bedmas := 50;
- end;
- '0','1'..'9' : Evaluate(c);
- end;
-
- Until Eoln;
-
- While Stack[1,0] <> 0 DO
- begin
- Evaluate(' ');
- Evaluate(Chr(pop(1)));
- end;
- Evaluate(' ');
- Writeln;
- Writeln;
- Writeln('The result is ',Pop(2));
- end.
-
- {
- That's it, all. This is an evaluator, like Reuben's, With a few
- more features, and it's shorter.
-
- Okay, there it is (the above comment was in the original post). I've
- never tried it, but it looks good. :-) BTW, if it does work you might
- want to thank Gavin Peters... after all, he wrote it. I was just
- interested when I saw it, and stored it along With a bunch of other
- source-code tidbits I've git here...
- }