86 lines
1.6 KiB
Plaintext
86 lines
1.6 KiB
Plaintext
global stack$
|
|
|
|
expr$ = "3 4 2 * 1 5 - 2 3 ^ ^ / +"
|
|
print "Expression:"
|
|
print expr$
|
|
print
|
|
|
|
print "Input","Operation","Stack after"
|
|
|
|
stack$=""
|
|
token$ = "#"
|
|
i = 1
|
|
token$ = word$(expr$, i)
|
|
token2$ = " "+token$+" "
|
|
|
|
do
|
|
print "Token ";i;": ";token$,
|
|
select case
|
|
'operation
|
|
case instr("+-*/^",token$)<>0
|
|
print "operate",
|
|
op2$=pop$()
|
|
op1$=pop$()
|
|
if op1$="" then
|
|
print "Error: stack empty for ";i;"-th token: ";token$
|
|
end
|
|
end if
|
|
|
|
op1=val(op1$)
|
|
op2=val(op2$)
|
|
|
|
select case token$
|
|
case "+"
|
|
res = op1+op2
|
|
case "-"
|
|
res = op1-op2
|
|
case "*"
|
|
res = op1*op2
|
|
case "/"
|
|
res = op1/op2
|
|
case "^"
|
|
res = op1^op2
|
|
end select
|
|
|
|
call push str$(res)
|
|
'default:number
|
|
case else
|
|
print "push",
|
|
call push token$
|
|
end select
|
|
print "Stack: ";reverse$(stack$)
|
|
i = i+1
|
|
token$ = word$(expr$, i)
|
|
token2$ = " "+token$+" "
|
|
loop until token$ =""
|
|
|
|
res$=pop$()
|
|
print
|
|
print "Result:" ;res$
|
|
extra$=pop$()
|
|
if extra$<>"" then
|
|
print "Error: extra things on a stack: ";extra$
|
|
end if
|
|
end
|
|
|
|
'---------------------------------------
|
|
function reverse$(s$)
|
|
reverse$ = ""
|
|
token$="#"
|
|
while token$<>""
|
|
i=i+1
|
|
token$=word$(s$,i,"|")
|
|
reverse$ = token$;" ";reverse$
|
|
wend
|
|
end function
|
|
'---------------------------------------
|
|
sub push s$
|
|
stack$=s$+"|"+stack$ 'stack
|
|
end sub
|
|
|
|
function pop$()
|
|
'it does return empty on empty stack
|
|
pop$=word$(stack$,1,"|")
|
|
stack$=mid$(stack$,instr(stack$,"|")+1)
|
|
end function
|