-
Notifications
You must be signed in to change notification settings - Fork 0
/
p2.rb
116 lines (95 loc) · 1.78 KB
/
p2.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#
# CS 430 Spring 2019 P2 (Ruby 2)
#
# Name: Nathan Chan
# Verision: 1/16/2019
#
require_relative 'defs.rb'
class Expr
# Calculate the result of the mathematical expression.
# Returns an integer.
def eval()
0
end
# Count the number of total number of arithmetic operations.
# Returns an integer.
def count_ops()
0
end
# The height of the tree.
# Returns an integer.
def height()
0
end
# Takes a expression and flattened it into a postfix string
# representation.
# Returns a string.
def postfix()
""
end
# Extract a sorted list of all unique integers in an expression.
# Each integer should appear in the resulting list only once.
# Returns an array.
def uniq_ints()
[]
end
def nodes
1 + @children.map{|c| c.nodes}.sum
end
end
class EInt
def eval
@val
end
def count_ops
0
end
def height
1
end
def postfix
@val
end
def uniq_ints
@val
end
end
class EBinOp
def eval
1
end
def count_ops
1 + left.count_ops + right.count_ops
end
def height
if left.height >= right.height
1 + left.height
elsif right.height >= left.height
1 + right.height
end
end
def postfix
left.postfix.to_s + " " + right.postfix.to_s + " " + @op
end
def uniq_ints
[left.uniq_ints, right.uniq_ints].flatten.uniq
end
end
#
# Operator-specific expression nodes
#
class EAdd < EBinOp
def eval
left.eval + right.eval
end
end
class ESub < EBinOp
def eval
left.eval - right.eval
end
end
class EMul < EBinOp
def eval
left.eval * right.eval
end
end