comparison src/bv.tp @ 3:dfc5f00c94bc

Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Aug 2013 21:54:02 -0700
parents
children 538440e1c3d2
comparison
equal deleted inserted replaced
2:5cf8de487ed6 3:dfc5f00c94bc
1 #{
2 program <- {
3 _input <- 0i64
4 _zero <- #{
5 string <- { "0" }
6 eval <- { 0i64 }
7 }
8
9 _one <- #{
10 string <- { "1" }
11 eval <- { 1i64 }
12 }
13
14 _inputNode <- #{
15 string <- { "input" }
16 eval <- { _input }
17 }
18 #{
19 plus <- :left right {
20 #{
21 string <- { "(plus " . (string: left) . " " . (string: right) . ")" }
22 eval <- { (eval: left) + (eval: right)}
23 }
24 }
25 zero <- {
26 _zero
27 }
28
29 one <- {
30 _one
31 }
32
33 opAnd <- :left right {
34 #{
35 string <- { "(and " . (string: left) . " " . (string: right) . ")" }
36 eval <- { (eval: left) and (eval: right)}
37 }
38 }
39
40 opOr <- :left right {
41 #{
42 string <- { "(or " . (string: left) . " " . (string: right) . ")" }
43 eval <- { (eval: left) or (eval: right)}
44 }
45 }
46
47 opXor <- :left right {
48 #{
49 string <- { "(xor " . (string: left) . " " . (string: right) . ")" }
50 eval <- { (eval: left) xor (eval: right)}
51 }
52 }
53
54 opNot <- :exp {
55 #{
56 string <- { "(not " . (string: exp) . ")" }
57 eval <- { (eval: exp) xor -1 }
58 }
59 }
60
61 shl1 <- :exp {
62 #{
63 string <- { "(shl1 " . (string: exp) . ")" }
64 eval <- { lshift: (eval: exp) by: 1 }
65 }
66 }
67
68 shr1 <- :exp {
69 #{
70 string <- { "(shr1 " . (string: exp) . ")" }
71 eval <- { rshift: (eval: exp) by: 1 }
72 }
73 }
74
75 shr4 <- :exp {
76 #{
77 string <- { "(shr4 " . (string: exp) . ")" }
78 eval <- { rshift: (eval: exp) by: 4 }
79 }
80 }
81
82 shr16 <- :exp {
83 #{
84 string <- { "(shr16 " . (string: exp) . ")" }
85 eval <- { rshift: (eval: exp) by: 16 }
86 }
87 }
88
89 input <- { _inputNode }
90
91 if0:then:else <- :exp ifzero :ifnotzero {
92 #{
93 string <- { "(if0 " . (string: exp) . " " . (string: ifzero) . " " . (string: ifnotzero) . ")" }
94 eval <- {
95 if: (eval: exp) = 0i64 {
96 eval: ifzero
97 } else: {
98 eval: ifnotzero
99 }
100 }
101 }
102 }
103
104 run <- :in {
105 _input <- in
106 eval: root
107 }
108
109 root <- _zero
110
111 string <- {
112 "(lambda (input) " . (string: root) . ")"
113 }
114
115 gentestprog <- {
116 root <- if0: (opAnd: input one) then: (
117 plus: (opOr: input (shl1: one))
118 ) else: (
119 opXor: input (shr16: input)
120 )
121 self
122 }
123 }
124 }
125
126 test <- {
127 prog <- program gentestprog
128 print: (string: prog) . "\n"
129 vals <- #[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0x30001 0x50015]
130 foreach: vals :idx val {
131 print: "p(0x" . (hex: val) . ") = 0x" . (hex: (prog run: val)) . "\n"
132 }
133 }
134
135 main <- {
136 test:
137 }
138 }