-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInterpreter.rb
237 lines (200 loc) · 6.76 KB
/
Interpreter.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
require_relative 'Context'
require_relative 'DynamicErrors'
require_relative 'Execution'
class Programa
def exec
@attr_value[0][1].exec(ValueTable::new)
end
end
class Alcance
def exec(tabla)
unless @attr_value[0][1].class.eql? Array then
@attr_value[0][1].exec(tabla)
end
@attr_value[1][1].exec(tabla)
end
end
class Declaraciones
def exec(tabla)
for dec in @attr_value[0][1]
dec.exec(tabla)
end
end
end
class Declaracion
def exec(tabla)
for var in @attr_value[0][1]
tabla.insert(var.attr_value[0][1].text)
end
end
end
class Instrucciones
def exec(tabla)
for inst in @attr_value[0][1]
inst.exec(tabla)
end
end
end
class Asignacion
def exec(tabla)
tabla.update(@attr_value[0][1].text, @attr_value[1][1].exec(tabla))
end
end
class CondicionalIf
def exec(tabla)
if @attr_value[0][1].exec(tabla) then
@attr_value[1][1].exec(tabla)
end
end
end
class CondicionalElse
def exec(tabla)
if @attr_value[0][1].exec(tabla) then
@attr_value[1][1].exec(tabla)
else
@attr_value[2][1].exec(tabla)
end
end
end
class IteracionI
def exec(tabla)
while @attr_value[0][1].exec(tabla) do
@attr_value[1][1].exec(tabla)
end
end
end
class IteracionDId
def exec(tabla)
variable = tabla.find(@attr_value[0][1].text)
i = @attr_value[1][1].exec(tabla)
j = @attr_value[2][1].exec(tabla)
raise LimetesInvalidos::new(@line, @column) if i>j
variable[:valor] = i
variable[:elastico] = false
while i <= j do
@attr_value[3][1].exec(tabla)
i += 1
variable[:valor] += 1
end
variable[:elastico] = true
end
end
class IteracionDExpA
def exec(tabla)
i = @attr_value[0][1].exec(tabla)
j = @attr_value[1][1].exec(tabla)
raise LimetesInvalidos::new(@line, @column) if i>j
while i <= j do
@attr_value[2][1].exec(tabla)
i += 1
end
end
end
class ES
def exec(tabla)
if @attr_value[0][1].class.eql?TkRead then
tabla.find(@attr_value[1][1].text)[:valor] = STDIN.gets.chomp
else
salida = @attr_value[1][1].exec(tabla)
unless salida.class.eql? Band then
puts @attr_value[1][1].exec(tabla)
else
salida.p_all
end
end
end
end
class Ejecucion
def exec(tabla)
unless Variable.eql? @attr_value[1][1].class then
raise EjecucionInvalida::new(@line,
@column,
@attr_value[1][1].class)
end
variable = @attr_value[1][1].exec(tabla)
@attr_value[0][1].text.each_char {|c|
case c
when '>'
variable.right
when '<'
variable.left
when '.'
print variable.dot.chr
when ','
variable.coma
when '+'
variable.plus
when '-'
variable.minus
end
}
end
end
class SecInterna
def exec(tabla)
@attr_value[0][1].exec(tabla)
end
end
class True
def exec(tabla)
true
end
end
class False
def exec(tabla)
false
end
end
class Entero
def exec(tabla)
Integer(@attr_value[0][1].text)
end
end
class Variable
def exec(tabla)
variable = tabla.find(@attr_value[0][1].text)
raise NoInicializada::new(@line, @column, @attr_value[0][1].text) if variable[:valor].nil?
begin
Integer(variable[:valor])
rescue ArgumentError
variable[:valor]
rescue TypeError
variable[:valor]
end
end
end
class ConstructorTape
def exec(tabla)
begin
length = Integer(@attr_value[0][1].text[1])
rescue ArgumentError
variable = tabla.find(@attr_value[0][1].text[1])
length = variable[:valor]
end
raise CintaMalConstruida::new(@line, @column) if length <= 0
Band::new(length)
end
end
class Division
def exec(tabla)
divisor = @attr_value[1][1].exec(tabla)
raise DivisionCero::new(@line, @column) if divisor.eql?0
return (@attr_value[0][1].exec(tabla) / divisor)
end
end
class Suma; def exec(tabla); return (@attr_value[0][1].exec(tabla) + @attr_value[1][1].exec(tabla)); end; end
class Resta; def exec(tabla); return (@attr_value[0][1].exec(tabla) - @attr_value[1][1].exec(tabla)); end; end
class Multiplicacion; def exec(tabla); return (@attr_value[0][1].exec(tabla) * @attr_value[1][1].exec(tabla)); end; end
class Modulo; def exec(tabla); return (@attr_value[0][1].exec(tabla) % @attr_value[1][1].exec(tabla)); end; end
class Menor; def exec(tabla); return (@attr_value[0][1].exec(tabla) < @attr_value[1][1].exec(tabla)); end; end
class Mayor; def exec(tabla); return (@attr_value[0][1].exec(tabla) > @attr_value[1][1].exec(tabla)); end; end
class MenorOIgual; def exec(tabla); return (@attr_value[0][1].exec(tabla) <= @attr_value[1][1].exec(tabla)); end; end
class MayorOIgual; def exec(tabla); return (@attr_value[0][1].exec(tabla) >= @attr_value[1][1].exec(tabla)); end; end
class Menos_Unario; def exec(tabla); return (-@attr_value[0][1].exec(tabla)); end; end
class Negacion; def exec(tabla); return (!@attr_value[0][1].exec(tabla)); end; end
class Inspeccion; def exec(tabla); return (@attr_value[0][1].exec(tabla)).dot; end; end
class Conjuncion; def exec(tabla); return (@attr_value[0][1].exec(tabla) and @attr_value[1][1].exec(tabla)); end; end
class Disyuncion; def exec(tabla); return (@attr_value[0][1].exec(tabla) or @attr_value[1][1].exec(tabla)); end; end
class Igual; def exec(tabla); return (@attr_value[0][1].exec(tabla) == @attr_value[1][1].exec(tabla)); end; end
class Inequivalencia; def exec(tabla); return (@attr_value[0][1].exec(tabla) != @attr_value[1][1].exec(tabla)); end; end
class Concatenacion; def exec(tabla); return (@attr_value[0][1].exec(tabla).concat(@attr_value[1][1].exec(tabla))); end; end