-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBigstepSemantic.rb
76 lines (66 loc) · 1.14 KB
/
BigstepSemantic.rb
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
require_relative 'SmallstepSemantic'
class Number
def evaluate(env)
self
end
end
class Boolean
def evaluate(env)
self
end
end
class Variable
def evaluate(env)
env[name]
end
end
class Add
def evaluate(env)
Number.new(left.evaluate(env).value + right.evaluate(env).value)
end
end
class Multiply
def evaluate(env)
Number.new(left.evaluate(env).value * right.evaluate(env).value)
end
end
class LessThan
def evaluate(env)
Boolean.new(left.evaluate(env).value < right.evaluate(env).value)
end
end
class Assign
def evaluate(env)
env.merge({ name => expression.evaluate(env) })
end
end
class DoNothing
def evaluate(env)
env
end
end
class If
def evaluate(env)
case condition.evaluate(env)
when Boolean.new(true)
consequence.evaluate(env)
when Boolean.new(false)
alternative.evaluate(env)
end
end
end
class Sequence
def evaluate(env)
second.evaluate(first.evaluate(env))
end
end
class While
def evaluate(env)
case condition.evaluate(env)
when Boolean.new(true)
evaluate(body.evaluate(env))
when Boolean.new(false)
env
end
end
end