1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
// reverse polish
#define N 12
mtype = { operator, value }
chan f = [N] of { mtype, int }
proctype calc(chan you)
{ int s, lft, rgt
chan me = [0] of { int }
if
:: f?operator(s)
run calc(me); me?lft
run calc(me); me?rgt
if
:: s == '+' -> you!(lft+rgt)
:: s == '-' -> you!(lft-rgt)
:: s == '*' -> you!(lft*rgt)
:: s == '/' -> assert(rgt != 0)
you!(lft/rgt)
:: else -> assert(false)
fi
:: f?value(s) -> you!s
fi
}
init {
chan me = [0] of { int }
int result
f!operator('+')
f!operator('/')
f!value(84)
f!value(2)
f!operator('-')
f!value(36)
f!operator('*')
f!value(3)
f!value(4)
run calc(me); me?result
printf("result: %d\n", result)
}
|