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; ]; ]