File: calculator.pml

package info (click to toggle)
spin 6.4.5%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,636 kB
  • ctags: 2,878
  • sloc: ansic: 40,035; yacc: 996; makefile: 37; sh: 5
file content (45 lines) | stat: -rw-r--r-- 686 bytes parent folder | download | duplicates (4)
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)
}