63 lines
1.7 KiB
Text
63 lines
1.7 KiB
Text
int Stack(10);
|
|
int SP; \stack pointer
|
|
|
|
proc Push(N);
|
|
int N;
|
|
[Stack(SP):= N; SP:= SP+1];
|
|
|
|
func Pop;
|
|
[SP:= SP-1; return Stack(SP)];
|
|
|
|
func Precedence(Op);
|
|
int Op;
|
|
case Op of
|
|
^+, ^-: return 2;
|
|
^*, ^/: return 3;
|
|
^^: return 4
|
|
other [];
|
|
|
|
proc ShowStack;
|
|
int I;
|
|
[ChOut(0, 9\tab\);
|
|
for I:= 0 to SP-1 do
|
|
[ChOut(0, Stack(I)); ChOut(0, ^ )];
|
|
CrLf(0);
|
|
];
|
|
|
|
char Str;
|
|
int Token, Op1, Op2;
|
|
[Str:= "3 + 4 * 2 / ( 1 - 5 ) ^^ 2 ^^ 3 ";
|
|
SP:= 0;
|
|
Text(0, "Input Output Stack^m^j");
|
|
loop [repeat Token:= Str(0); Str:= Str+1;
|
|
until Token # ^ ; \skip space characters
|
|
if Token # $A0 \terminating space\ then
|
|
[ChOut(0, Token); ChOut(0, 9\tab\)];
|
|
case Token of
|
|
^+, ^-, ^*, ^/, ^^:
|
|
[Op1:= Token;
|
|
loop [if SP <= 0 then quit; \empty
|
|
Op2:= Stack(SP-1);
|
|
if Op2 = ^( then quit;
|
|
if Precedence(Op2) < Precedence(Op1) then quit;
|
|
if Precedence(Op2) = Precedence(Op1) then
|
|
if Op1 = ^^ then quit;
|
|
ChOut(0, Pop);
|
|
];
|
|
Push(Op1);
|
|
];
|
|
^(: Push(Token);
|
|
^): [while SP > 0 and Stack(SP-1) # ^( do
|
|
ChOut(0, Pop);
|
|
Pop; \discard left parenthesis
|
|
];
|
|
$A0: quit \terminating space with MSB set
|
|
other ChOut(0, Token); \print single digit number
|
|
ShowStack;
|
|
];
|
|
while SP > 0 do \print any remaining operators
|
|
[ChOut(0, 9\tab\);
|
|
ChOut(0, Pop);
|
|
ShowStack;
|
|
];
|
|
]
|