gobstones 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +133 -0
- data/.rubocop_todo.yml +75 -0
- data/.simplecov +1 -3
- data/.tool-versions +1 -0
- data/.travis.yml +9 -2
- data/Gemfile +11 -5
- data/Gemfile.lock +65 -39
- data/README.md +8 -1
- data/Rakefile +1 -1
- data/bin/gobstones +1 -1
- data/gobstones.gemspec +12 -11
- data/lib/gobstones/cli/printer.rb +41 -28
- data/lib/gobstones/cli/runner.rb +50 -15
- data/lib/gobstones/extensions/all.rb +1 -1
- data/lib/gobstones/extensions/boolean.rb +1 -5
- data/lib/gobstones/extensions/{fixnum.rb → integer.rb} +2 -4
- data/lib/gobstones/extensions/string.rb +1 -3
- data/lib/gobstones/lang/all.rb +3 -3
- data/lib/gobstones/lang/commands/all.rb +11 -10
- data/lib/gobstones/lang/commands/boom.rb +26 -0
- data/lib/gobstones/lang/commands/command_block.rb +23 -23
- data/lib/gobstones/lang/commands/conditional.rb +26 -0
- data/lib/gobstones/lang/commands/if.rb +13 -0
- data/lib/gobstones/lang/commands/if_then_else.rb +26 -0
- data/lib/gobstones/lang/commands/ir_al_origen.rb +15 -0
- data/lib/gobstones/lang/commands/mover.rb +23 -0
- data/lib/gobstones/lang/commands/multiple_assignment.rb +34 -21
- data/lib/gobstones/lang/commands/poner.rb +31 -0
- data/lib/gobstones/lang/commands/procedure_call.rb +8 -8
- data/lib/gobstones/lang/commands/repeat_with.rb +69 -0
- data/lib/gobstones/lang/commands/sacar.rb +29 -0
- data/lib/gobstones/lang/commands/single_assignment.rb +15 -20
- data/lib/gobstones/lang/commands/skip.rb +15 -0
- data/lib/gobstones/lang/commands/vaciar_tablero.rb +15 -0
- data/lib/gobstones/lang/commands/while.rb +20 -0
- data/lib/gobstones/lang/definitions/definition.rb +16 -23
- data/lib/gobstones/lang/definitions/definition_call.rb +7 -15
- data/lib/gobstones/lang/definitions/function.rb +1 -7
- data/lib/gobstones/lang/definitions/main.rb +1 -8
- data/lib/gobstones/lang/definitions/no_return_statement.rb +2 -8
- data/lib/gobstones/lang/definitions/procedure.rb +1 -7
- data/lib/gobstones/lang/definitions/return_from_function.rb +6 -13
- data/lib/gobstones/lang/definitions/return_from_main.rb +15 -10
- data/lib/gobstones/lang/definitions/var_tuple.rb +10 -12
- data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +17 -27
- data/lib/gobstones/lang/expressions/boolean_expressions.rb +4 -10
- data/lib/gobstones/lang/expressions/comparison_expressions.rb +0 -16
- data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +3 -5
- data/lib/gobstones/lang/expressions/expression.rb +18 -0
- data/lib/gobstones/lang/expressions/function_call.rb +9 -6
- data/lib/gobstones/lang/expressions/one_arg_expression.rb +8 -16
- data/lib/gobstones/lang/expressions/primitive_functions.rb +24 -16
- data/lib/gobstones/lang/expressions/two_arg_expression.rb +9 -16
- data/lib/gobstones/lang/expressions/type_bound_functions.rb +30 -25
- data/lib/gobstones/lang/expressions/var_name.rb +9 -13
- data/lib/gobstones/lang/literals/all.rb +3 -3
- data/lib/gobstones/lang/literals/{booleans.rb → boolean.rb} +24 -22
- data/lib/gobstones/lang/literals/{colors.rb → color.rb} +4 -14
- data/lib/gobstones/lang/literals/{directions.rb → direction.rb} +3 -13
- data/lib/gobstones/lang/literals/literal.rb +35 -27
- data/lib/gobstones/lang/literals/number.rb +6 -8
- data/lib/gobstones/lang/program.rb +9 -16
- data/lib/gobstones/modules/equality_definition.rb +23 -0
- data/lib/gobstones/parser/ast/ast.rb +48 -70
- data/lib/gobstones/parser/parse_error.rb +2 -7
- data/lib/gobstones/parser/treetop_parser.rb +9 -14
- data/lib/gobstones/runner/board.rb +12 -15
- data/lib/gobstones/runner/cell.rb +14 -20
- data/lib/gobstones/runner/errors/all.rb +1 -1
- data/lib/gobstones/runner/errors/boom_error.rb +0 -5
- data/lib/gobstones/runner/errors/definition_not_found_error.rb +7 -7
- data/lib/gobstones/runner/errors/empty_cell_error.rb +0 -5
- data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +0 -5
- data/lib/gobstones/runner/errors/gobstones_type_error.rb +2 -7
- data/lib/gobstones/runner/errors/out_of_board_error.rb +0 -5
- data/lib/gobstones/runner/errors/undefined_variable_error.rb +6 -4
- data/lib/gobstones/runner/errors/wrong_arguments_error.rb +0 -5
- data/lib/gobstones/runner/execution_context.rb +16 -33
- data/lib/gobstones/runner/head.rb +17 -20
- data/lib/gobstones/runner/program_result.rb +12 -0
- data/lib/gobstones/type_check_result.rb +0 -4
- data/spec/lang/commands/boom_spec.rb +7 -0
- data/spec/lang/commands/command_block_spec.rb +15 -0
- data/spec/lang/commands/if_spec.rb +32 -0
- data/spec/lang/commands/if_then_else_spec.rb +19 -0
- data/spec/lang/commands/ir_al_origen_spec.rb +11 -0
- data/spec/lang/commands/mover_spec.rb +30 -0
- data/spec/lang/commands/multiple_assignment_spec.rb +39 -22
- data/spec/lang/commands/poner_spec.rb +27 -0
- data/spec/lang/commands/procedure_call_spec.rb +26 -28
- data/spec/lang/commands/procedure_spec.rb +32 -32
- data/spec/lang/commands/repeat_with_spec.rb +64 -0
- data/spec/lang/commands/sacar_spec.rb +32 -0
- data/spec/lang/commands/single_assignment_spec.rb +5 -6
- data/spec/lang/commands/skip_spec.rb +10 -0
- data/spec/lang/commands/vaciar_tablero_spec.rb +10 -0
- data/spec/lang/commands/while_spec.rb +39 -0
- data/spec/lang/definitions/main_spec.rb +34 -0
- data/spec/lang/definitions/no_return_statement_spec.rb +4 -5
- data/spec/lang/definitions/var_tuple_spec.rb +4 -7
- data/spec/lang/expressions/arithmetic_expressions_spec.rb +37 -64
- data/spec/lang/expressions/boolean_expressions_spec.rb +25 -34
- data/spec/lang/expressions/comparison_expressions_spec.rb +109 -155
- data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +3 -7
- data/spec/lang/expressions/function_call_spec.rb +24 -20
- data/spec/lang/expressions/primitive_functions_spec.rb +28 -39
- data/spec/lang/expressions/type_bound_functions_spec.rb +10 -18
- data/spec/lang/expressions/var_name_spec.rb +8 -12
- data/spec/lang/literals/{booleans_spec.rb → boolean_spec.rb} +3 -5
- data/spec/lang/literals/color_spec.rb +19 -0
- data/spec/lang/literals/direction_spec.rb +46 -0
- data/spec/lang/literals/{numbers_spec.rb → number_spec.rb} +3 -4
- data/spec/matchers/parse_matcher.rb +9 -11
- data/spec/parser/arithmetic_expressions_spec.rb +51 -61
- data/spec/parser/assignments_spec.rb +21 -31
- data/spec/parser/boolean_expressions_spec.rb +35 -43
- data/spec/parser/command_block_spec.rb +18 -20
- data/spec/parser/data_types_spec.rb +9 -19
- data/spec/parser/function_calls_spec.rb +19 -19
- data/spec/parser/function_definitions_spec.rb +17 -22
- data/spec/parser/gobstones_program_spec.rb +30 -30
- data/spec/parser/if_command_spec.rb +19 -28
- data/spec/parser/main_definition_spec.rb +13 -16
- data/spec/parser/nested_expressions_spec.rb +20 -24
- data/spec/parser/primitive_expressions_spec.rb +33 -38
- data/spec/parser/procedure_calls_spec.rb +17 -18
- data/spec/parser/procedure_definitions_spec.rb +12 -15
- data/spec/parser/repeat_with_command_spec.rb +10 -10
- data/spec/parser/simple_commands_spec.rb +23 -37
- data/spec/parser/treetop_parser_spec.rb +87 -83
- data/spec/parser/var_tuple_spec.rb +8 -12
- data/spec/parser/while_command_spec.rb +11 -14
- data/spec/runner/board_spec.rb +28 -33
- data/spec/runner/cell_spec.rb +21 -28
- data/spec/runner/execution_context_spec.rb +18 -35
- data/spec/runner/head_spec.rb +54 -60
- data/spec/spec_helper.rb +10 -1
- data/spec/support/board_assertions.rb +18 -0
- data/spec/{gobstones_lang_test_objects.rb → support/gobstones_lang_test_objects.rb} +6 -4
- data/spec/type_checker_spec.rb +19 -25
- metadata +80 -56
- data/.ruby-version +0 -1
- data/lib/gobstones/lang/commands/boom_cmd.rb +0 -31
- data/lib/gobstones/lang/commands/conditional_cmd.rb +0 -31
- data/lib/gobstones/lang/commands/if_cmd.rb +0 -38
- data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +0 -19
- data/lib/gobstones/lang/commands/mover_cmd.rb +0 -27
- data/lib/gobstones/lang/commands/poner_cmd.rb +0 -35
- data/lib/gobstones/lang/commands/repeat_with_cmd.rb +0 -77
- data/lib/gobstones/lang/commands/sacar_cmd.rb +0 -33
- data/lib/gobstones/lang/commands/skip_cmd.rb +0 -19
- data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +0 -19
- data/lib/gobstones/lang/commands/while_cmd.rb +0 -25
- data/lib/gobstones/modules/equal_by_class.rb +0 -13
- data/spec/lang/commands/boom_cmd_spec.rb +0 -8
- data/spec/lang/commands/cmd_block_spec.rb +0 -21
- data/spec/lang/commands/if_cmd_spec.rb +0 -50
- data/spec/lang/commands/ir_al_origen_cmd_spec.rb +0 -16
- data/spec/lang/commands/mover_cmd_spec.rb +0 -36
- data/spec/lang/commands/poner_cmd_spec.rb +0 -28
- data/spec/lang/commands/repeat_with_cmd_spec.rb +0 -60
- data/spec/lang/commands/sacar_cmd_spec.rb +0 -35
- data/spec/lang/commands/skip_cmd_spec.rb +0 -12
- data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +0 -14
- data/spec/lang/commands/while_cmd_spec.rb +0 -43
- data/spec/lang/literals/colors_spec.rb +0 -13
- data/spec/lang/literals/directions_spec.rb +0 -45
@@ -2,10 +2,11 @@ require 'gobstones/lang/literals/literal'
|
|
2
2
|
require 'gobstones/runner/errors/gobstones_type_error'
|
3
3
|
|
4
4
|
module Gobstones
|
5
|
-
|
6
5
|
module Lang
|
7
|
-
|
8
6
|
class Color < Literal
|
7
|
+
def self.all
|
8
|
+
[Azul, Negro, Rojo, Verde]
|
9
|
+
end
|
9
10
|
|
10
11
|
def self.order
|
11
12
|
[Azul, Negro, Rojo, Verde]
|
@@ -16,17 +17,15 @@ module Gobstones
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def opposite
|
19
|
-
raise
|
20
|
+
raise Runner::GobstonesTypeError, "colors don't have opposite"
|
20
21
|
end
|
21
22
|
|
22
23
|
def return_type
|
23
24
|
:Color
|
24
25
|
end
|
25
|
-
|
26
26
|
end
|
27
27
|
|
28
28
|
class Azul < Color
|
29
|
-
|
30
29
|
def previous
|
31
30
|
Verde.new
|
32
31
|
end
|
@@ -38,11 +37,9 @@ module Gobstones
|
|
38
37
|
def to_s
|
39
38
|
'Azul'
|
40
39
|
end
|
41
|
-
|
42
40
|
end
|
43
41
|
|
44
42
|
class Negro < Color
|
45
|
-
|
46
43
|
def previous
|
47
44
|
Azul.new
|
48
45
|
end
|
@@ -54,11 +51,9 @@ module Gobstones
|
|
54
51
|
def to_s
|
55
52
|
'Negro'
|
56
53
|
end
|
57
|
-
|
58
54
|
end
|
59
55
|
|
60
56
|
class Rojo < Color
|
61
|
-
|
62
57
|
def previous
|
63
58
|
Negro.new
|
64
59
|
end
|
@@ -70,11 +65,9 @@ module Gobstones
|
|
70
65
|
def to_s
|
71
66
|
'Rojo'
|
72
67
|
end
|
73
|
-
|
74
68
|
end
|
75
69
|
|
76
70
|
class Verde < Color
|
77
|
-
|
78
71
|
def previous
|
79
72
|
Rojo.new
|
80
73
|
end
|
@@ -86,9 +79,6 @@ module Gobstones
|
|
86
79
|
def to_s
|
87
80
|
'Verde'
|
88
81
|
end
|
89
|
-
|
90
82
|
end
|
91
|
-
|
92
83
|
end
|
93
|
-
|
94
84
|
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'gobstones/lang/literals/literal'
|
2
2
|
|
3
3
|
module Gobstones
|
4
|
-
|
5
4
|
module Lang
|
6
|
-
|
7
5
|
class Direction < Literal
|
6
|
+
def self.all
|
7
|
+
[Norte, Sur, Este, Oeste]
|
8
|
+
end
|
8
9
|
|
9
10
|
def self.order
|
10
11
|
[Norte, Este, Sur, Oeste]
|
@@ -17,11 +18,9 @@ module Gobstones
|
|
17
18
|
def return_type
|
18
19
|
:Direction
|
19
20
|
end
|
20
|
-
|
21
21
|
end
|
22
22
|
|
23
23
|
class Norte < Direction
|
24
|
-
|
25
24
|
def can_move?(head)
|
26
25
|
head.can_move_north?
|
27
26
|
end
|
@@ -45,11 +44,9 @@ module Gobstones
|
|
45
44
|
def to_s
|
46
45
|
'Norte'
|
47
46
|
end
|
48
|
-
|
49
47
|
end
|
50
48
|
|
51
49
|
class Este < Direction
|
52
|
-
|
53
50
|
def can_move?(head)
|
54
51
|
head.can_move_east?
|
55
52
|
end
|
@@ -73,11 +70,9 @@ module Gobstones
|
|
73
70
|
def to_s
|
74
71
|
'Este'
|
75
72
|
end
|
76
|
-
|
77
73
|
end
|
78
74
|
|
79
75
|
class Sur < Direction
|
80
|
-
|
81
76
|
def can_move?(head)
|
82
77
|
head.can_move_south?
|
83
78
|
end
|
@@ -101,11 +96,9 @@ module Gobstones
|
|
101
96
|
def to_s
|
102
97
|
'Sur'
|
103
98
|
end
|
104
|
-
|
105
99
|
end
|
106
100
|
|
107
101
|
class Oeste < Direction
|
108
|
-
|
109
102
|
def can_move?(head)
|
110
103
|
head.can_move_west?
|
111
104
|
end
|
@@ -129,9 +122,6 @@ module Gobstones
|
|
129
122
|
def to_s
|
130
123
|
'Oeste'
|
131
124
|
end
|
132
|
-
|
133
125
|
end
|
134
|
-
|
135
126
|
end
|
136
|
-
|
137
127
|
end
|
@@ -1,58 +1,69 @@
|
|
1
|
-
require 'gobstones/
|
1
|
+
require 'gobstones/lang/expressions/expression'
|
2
2
|
require 'gobstones/runner/errors/gobstones_type_error'
|
3
|
+
require 'gobstones/runner/execution_context'
|
4
|
+
require 'gobstones/extensions/boolean'
|
5
|
+
require 'error_handling_protocol'
|
3
6
|
|
4
7
|
module Gobstones
|
5
|
-
|
6
8
|
module Lang
|
7
|
-
|
8
|
-
class Literal
|
9
|
-
|
9
|
+
class Literal < Expression
|
10
10
|
include Comparable
|
11
|
-
include Gobstones::EqualByClass
|
12
11
|
|
13
|
-
def evaluate(
|
12
|
+
def evaluate(_context = Runner::NullExecutionContext.new)
|
14
13
|
self
|
15
14
|
end
|
16
15
|
|
16
|
+
# TODO EqualityDefinition module seems to fail used with Comparable
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
self.class == other.class
|
20
|
+
end
|
21
|
+
|
22
|
+
alias_method :eql?, :==
|
23
|
+
|
17
24
|
def <=>(other)
|
18
|
-
|
25
|
+
return 0 if self == other
|
26
|
+
return -1 if self < other
|
27
|
+
|
28
|
+
1
|
19
29
|
end
|
20
30
|
|
21
|
-
def <(
|
22
|
-
|
31
|
+
def <(_other)
|
32
|
+
subclass_responsibility
|
23
33
|
end
|
24
34
|
|
25
35
|
OPERATORS_MAPPING = {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
36
|
+
equal: :==,
|
37
|
+
not_equal: '!='.to_sym,
|
38
|
+
less_than: :<,
|
39
|
+
less_equal: :<=,
|
40
|
+
greater_than: :>,
|
41
|
+
greater_equal: :>=,
|
42
|
+
}.freeze
|
32
43
|
|
33
44
|
OPERATORS_MAPPING.each do |gbs_op, ruby_op|
|
34
|
-
define_method
|
35
|
-
send(ruby_op, other)
|
45
|
+
define_method(gbs_op) do |other|
|
46
|
+
send(ruby_op, other).to_gbs_bool
|
36
47
|
end
|
37
48
|
end
|
38
49
|
|
39
50
|
def same_type_as(other)
|
40
|
-
|
51
|
+
return_type == other.return_type
|
41
52
|
end
|
42
53
|
|
43
54
|
def return_type
|
44
|
-
|
55
|
+
subclass_responsibility
|
45
56
|
end
|
46
57
|
|
47
|
-
def if_true(
|
58
|
+
def if_true(_block, _context)
|
48
59
|
not_boolean_type_error
|
49
60
|
end
|
50
61
|
|
51
|
-
def if_false(
|
62
|
+
def if_false(_block, _context)
|
52
63
|
not_boolean_type_error
|
53
64
|
end
|
54
65
|
|
55
|
-
def
|
66
|
+
def true?
|
56
67
|
not_boolean_type_error
|
57
68
|
end
|
58
69
|
|
@@ -63,11 +74,8 @@ module Gobstones
|
|
63
74
|
private
|
64
75
|
|
65
76
|
def not_boolean_type_error
|
66
|
-
raise
|
77
|
+
raise Runner::GobstonesTypeError, "#{self} is not a boolean"
|
67
78
|
end
|
68
|
-
|
69
79
|
end
|
70
|
-
|
71
80
|
end
|
72
|
-
|
73
81
|
end
|
@@ -1,18 +1,15 @@
|
|
1
1
|
require 'gobstones/lang/literals/literal'
|
2
2
|
|
3
3
|
module Gobstones
|
4
|
-
|
5
4
|
module Lang
|
6
|
-
|
7
5
|
class Number < Literal
|
8
|
-
|
9
6
|
attr_reader :value
|
10
7
|
|
11
8
|
def initialize(num)
|
12
9
|
@value = num
|
13
10
|
end
|
14
11
|
|
15
|
-
def ==
|
12
|
+
def ==(other)
|
16
13
|
super(other) && value == other.value
|
17
14
|
end
|
18
15
|
|
@@ -24,9 +21,9 @@ module Gobstones
|
|
24
21
|
:Number
|
25
22
|
end
|
26
23
|
|
27
|
-
[
|
24
|
+
%i[+ - * / % **].each do |selector|
|
28
25
|
define_method selector do |other|
|
29
|
-
self.class.new
|
26
|
+
self.class.new(value.send(selector, other.value))
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
@@ -42,8 +39,9 @@ module Gobstones
|
|
42
39
|
self.class.new(value + 1)
|
43
40
|
end
|
44
41
|
|
42
|
+
def to_s
|
43
|
+
"number #{value}"
|
44
|
+
end
|
45
45
|
end
|
46
|
-
|
47
46
|
end
|
48
|
-
|
49
47
|
end
|
@@ -1,13 +1,11 @@
|
|
1
|
+
require 'gobstones/modules/equality_definition'
|
1
2
|
require 'gobstones/runner/execution_context'
|
2
|
-
require 'gobstones/
|
3
|
+
require 'gobstones/runner/program_result'
|
3
4
|
|
4
5
|
module Gobstones
|
5
|
-
|
6
6
|
module Lang
|
7
|
-
|
8
7
|
class Program
|
9
|
-
|
10
|
-
include Gobstones::EqualByClass
|
8
|
+
include EqualityDefinition
|
11
9
|
|
12
10
|
attr_reader :definitions, :main_definition
|
13
11
|
|
@@ -16,26 +14,21 @@ module Gobstones
|
|
16
14
|
@main_definition = main_definition
|
17
15
|
end
|
18
16
|
|
19
|
-
def
|
20
|
-
|
21
|
-
self.definitions == other.definitions &&
|
22
|
-
self.main_definition == other.main_definition
|
17
|
+
def equality_attributes
|
18
|
+
%i[definitions main_definition]
|
23
19
|
end
|
24
20
|
|
25
21
|
def evaluate
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
context = create_context
|
23
|
+
return_values = main_definition.evaluate(context)
|
24
|
+
Runner::ProgramResult.new(context.head, return_values)
|
29
25
|
end
|
30
26
|
|
31
27
|
private
|
32
28
|
|
33
29
|
def create_context
|
34
|
-
|
30
|
+
Runner::ProgramExecutionContext.for(self)
|
35
31
|
end
|
36
|
-
|
37
32
|
end
|
38
|
-
|
39
33
|
end
|
40
|
-
|
41
34
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Gobstones
|
2
|
+
module EqualityDefinition
|
3
|
+
def ==(other)
|
4
|
+
class_is_equal?(other) && attributes_are_equal?(other)
|
5
|
+
end
|
6
|
+
|
7
|
+
def equality_attributes
|
8
|
+
[]
|
9
|
+
end
|
10
|
+
|
11
|
+
alias_method :eql?, :==
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def class_is_equal?(other)
|
16
|
+
self.class == other.class
|
17
|
+
end
|
18
|
+
|
19
|
+
def attributes_are_equal?(other)
|
20
|
+
equality_attributes.all? { |attr| send(attr) == other.send(attr) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,30 +1,28 @@
|
|
1
1
|
require 'gobstones/lang/all'
|
2
2
|
|
3
3
|
module Gobstones
|
4
|
-
|
5
4
|
# TODO divide into smaller modules
|
6
5
|
module Parser
|
6
|
+
include Lang
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
RESERVED_IDS = %w(
|
8
|
+
RESERVED_IDS = %w[
|
11
9
|
if else not True False case of while Skip repeatWith in procedure function
|
12
10
|
return Mover Sacar Poner BOOM IrAlOrigen VaciarTablero div mod hayBolitas
|
13
11
|
nroBolitas puedeMover Norte Sur Este Oeste minBool maxBool minDir maxDir
|
14
12
|
minColor maxColor siguiente previo opuesto Verde Rojo Azul Negro Main
|
15
|
-
|
13
|
+
].freeze
|
16
14
|
|
17
15
|
def self.ast_node(name, &value_block)
|
18
16
|
# TODO check if it is better to have classes
|
19
|
-
|
20
|
-
define_method
|
17
|
+
ast_module = Module.new do
|
18
|
+
define_method(:value) do
|
21
19
|
instance_eval(&value_block)
|
22
20
|
end
|
23
21
|
end
|
24
|
-
const_set name,
|
22
|
+
const_set name, ast_module
|
25
23
|
end
|
26
24
|
|
27
|
-
ast_node(:IntegerLiteral) { Number.new
|
25
|
+
ast_node(:IntegerLiteral) { Number.new(text_value.to_i) }
|
28
26
|
ast_node(:BooleanLiteral) { Kernel.const_get(text_value).new }
|
29
27
|
ast_node(:ColorLiteral) { Kernel.const_get(text_value).new }
|
30
28
|
ast_node(:DirectionLiteral) { Kernel.const_get(text_value).new }
|
@@ -36,14 +34,14 @@ module Gobstones
|
|
36
34
|
ast_node(:MinDirFuncNode) { MinDir.new }
|
37
35
|
ast_node(:MaxDirFuncNode) { MaxDir.new }
|
38
36
|
|
39
|
-
ast_node(:VarNameNode) { VarName.new
|
37
|
+
ast_node(:VarNameNode) { VarName.new(text_value) }
|
40
38
|
|
41
|
-
ast_node(:NroBolitasFuncNode) { NroBolitas.new
|
42
|
-
ast_node(:HayBolitasFuncNode) { HayBolitas.new
|
43
|
-
ast_node(:PuedeMoverFuncNode) { PuedeMover.new
|
44
|
-
ast_node(:SiguienteFuncNode) { Siguiente.new
|
45
|
-
ast_node(:PrevioFuncNode) { Previo.new
|
46
|
-
ast_node(:OpuestoFuncNode) { Opuesto.new
|
39
|
+
ast_node(:NroBolitasFuncNode) { NroBolitas.new(gexp.value) }
|
40
|
+
ast_node(:HayBolitasFuncNode) { HayBolitas.new(gexp.value) }
|
41
|
+
ast_node(:PuedeMoverFuncNode) { PuedeMover.new(gexp.value) }
|
42
|
+
ast_node(:SiguienteFuncNode) { Siguiente.new(gexp.value) }
|
43
|
+
ast_node(:PrevioFuncNode) { Previo.new(gexp.value) }
|
44
|
+
ast_node(:OpuestoFuncNode) { Opuesto.new(gexp.value) }
|
47
45
|
|
48
46
|
ast_node :NopExprNode do
|
49
47
|
if sub_exps.empty?
|
@@ -53,9 +51,9 @@ module Gobstones
|
|
53
51
|
sub_exps.elements.inject(left.value) do |memo, node|
|
54
52
|
case node.op.text_value
|
55
53
|
when '+'
|
56
|
-
Add.new
|
54
|
+
Add.new(memo, node.right.value)
|
57
55
|
when '-'
|
58
|
-
Sub.new
|
56
|
+
Sub.new(memo, node.right.value)
|
59
57
|
end
|
60
58
|
end
|
61
59
|
end
|
@@ -67,7 +65,7 @@ module Gobstones
|
|
67
65
|
else
|
68
66
|
# it is a nested exp
|
69
67
|
sub_exps.elements.inject(left.value) do |memo, node|
|
70
|
-
Mul.new
|
68
|
+
Mul.new(memo, node.right.value)
|
71
69
|
end
|
72
70
|
end
|
73
71
|
end
|
@@ -75,9 +73,9 @@ module Gobstones
|
|
75
73
|
ast_node :DivModExprNode do
|
76
74
|
case op.text_value
|
77
75
|
when 'div'
|
78
|
-
Div.new
|
76
|
+
Div.new(left.value, right.value)
|
79
77
|
when 'mod'
|
80
|
-
Mod.new
|
78
|
+
Mod.new(left.value, right.value)
|
81
79
|
end
|
82
80
|
end
|
83
81
|
|
@@ -87,7 +85,7 @@ module Gobstones
|
|
87
85
|
else
|
88
86
|
# it is a nested exp
|
89
87
|
sub_exps.elements.inject(left.value) do |memo, node|
|
90
|
-
Pow.new
|
88
|
+
Pow.new(memo, node.right.value)
|
91
89
|
end
|
92
90
|
end
|
93
91
|
end
|
@@ -98,17 +96,15 @@ module Gobstones
|
|
98
96
|
'<' => LessThan, '>' => GreaterThan,
|
99
97
|
'<=' => LessEqual, '>=' => GreaterEqual
|
100
98
|
}
|
101
|
-
classes[rop.text_value].new
|
99
|
+
classes[rop.text_value].new(left.value, right.value)
|
102
100
|
end
|
103
101
|
|
104
|
-
ast_node(:NotExprNode) { Not.new
|
105
|
-
ast_node(:AndExprNode) { And.new
|
106
|
-
ast_node(:OrExprNode) { Or.new
|
102
|
+
ast_node(:NotExprNode) { Not.new(exp.value) }
|
103
|
+
ast_node(:AndExprNode) { And.new(left.value, right.value) }
|
104
|
+
ast_node(:OrExprNode) { Or.new(left.value, right.value) }
|
107
105
|
|
108
|
-
ast_node(:ParenthesesExprNode) { EnclosedByParensExpression.new
|
109
|
-
ast_node(:FuncCallNode)
|
110
|
-
FunctionCall.new func_name.text_value, gexp_tuple.value
|
111
|
-
end
|
106
|
+
ast_node(:ParenthesesExprNode) { EnclosedByParensExpression.new(gexp.value) }
|
107
|
+
ast_node(:FuncCallNode) { FunctionCall.new(func_name.text_value, gexp_tuple.value) }
|
112
108
|
ast_node(:TupleExprNode) { exps.empty? ? [] : exps.value }
|
113
109
|
|
114
110
|
ast_node :GexpsNode do
|
@@ -120,44 +116,34 @@ module Gobstones
|
|
120
116
|
end
|
121
117
|
|
122
118
|
ast_node(:SkipCmdNode) { Skip.new }
|
123
|
-
ast_node(:BoomCmdNode) { Boom.new
|
119
|
+
ast_node(:BoomCmdNode) { Boom.new(string.text_value[1..-2]) }
|
124
120
|
|
125
|
-
ast_node(:PonerCmdNode) { Poner.new
|
126
|
-
ast_node(:SacarCmdNode) { Sacar.new
|
127
|
-
ast_node(:MoverCmdNode) { Mover.new
|
121
|
+
ast_node(:PonerCmdNode) { Poner.new(gexp.value) }
|
122
|
+
ast_node(:SacarCmdNode) { Sacar.new(gexp.value) }
|
123
|
+
ast_node(:MoverCmdNode) { Mover.new(gexp.value) }
|
128
124
|
|
129
125
|
ast_node(:IrAlOrigenCmdNode) { IrAlOrigen.new }
|
130
126
|
ast_node(:VaciarTableroCmdNode) { VaciarTablero.new }
|
131
127
|
|
132
|
-
ast_node
|
133
|
-
ProcedureCall.new proc_name.text_value, gexp_tuple.value
|
134
|
-
end
|
128
|
+
ast_node(:ProcCallNode) { ProcedureCall.new(proc_name.text_value, gexp_tuple.value) }
|
135
129
|
|
136
|
-
ast_node
|
137
|
-
|
138
|
-
end
|
130
|
+
ast_node(:SingleAssignmentNode) { SingleAssignment.new(var_name.value, gexp.value) }
|
131
|
+
ast_node(:MultipleAssignmentNode) { MultipleAssignment.new(var_tuple.value, gexp.value) }
|
139
132
|
|
140
|
-
ast_node
|
141
|
-
MultipleAssignment.new var_tuple.value, gexp.value
|
142
|
-
end
|
143
|
-
|
144
|
-
ast_node :CmdBlockNode do
|
145
|
-
CommandBlock.new create_commands(commands)
|
146
|
-
end
|
133
|
+
ast_node(:CmdBlockNode) { CommandBlock.new(create_commands(commands)) }
|
147
134
|
|
148
135
|
ast_node :IfCmdNode do
|
149
136
|
if else_clause.empty?
|
150
|
-
|
137
|
+
If.new(gexp.value, then_block.value)
|
151
138
|
else
|
152
|
-
|
139
|
+
IfThenElse.new(gexp.value, then_block.value, else_clause.else_block.value)
|
153
140
|
end
|
154
141
|
end
|
155
142
|
|
156
|
-
ast_node(:WhileCmdNode) {
|
143
|
+
ast_node(:WhileCmdNode) { While.new(gexp.value, cmd_block.value) }
|
157
144
|
|
158
145
|
ast_node :RepeatWithCmdNode do
|
159
|
-
|
160
|
-
range_max.value, cmd_block.value
|
146
|
+
RepeatWith.new(var_name.value, range_min.value, range_max.value, cmd_block.value)
|
161
147
|
end
|
162
148
|
|
163
149
|
# TODO abstract duplication, very similar to GexpsNode
|
@@ -173,42 +159,34 @@ module Gobstones
|
|
173
159
|
|
174
160
|
ast_node(:VarTupleNode) do
|
175
161
|
variables = vns.empty? ? [] : vns.value
|
176
|
-
VarTuple.new
|
162
|
+
VarTuple.new(variables)
|
177
163
|
end
|
178
164
|
|
179
165
|
ast_node(:ProcedureNode) do
|
180
|
-
Procedure.new
|
166
|
+
Procedure.new(proc_name.text_value, var_tuple.value, cmd_block.value)
|
181
167
|
end
|
182
168
|
|
183
169
|
ast_node(:FunctionNode) do
|
184
|
-
cmd_block = CommandBlock.new
|
185
|
-
Function.new
|
186
|
-
cmd_block, func_return.value
|
187
|
-
end
|
188
|
-
|
189
|
-
ast_node(:FuncReturnNode) do
|
190
|
-
ReturnFromFunction.new gexp_tuple_1.value
|
170
|
+
cmd_block = CommandBlock.new(create_commands(commands))
|
171
|
+
Function.new(func_name.text_value, var_tuple.value, cmd_block, func_return.value)
|
191
172
|
end
|
192
173
|
|
193
|
-
ast_node(:
|
194
|
-
|
195
|
-
end
|
174
|
+
ast_node(:FuncReturnNode) { ReturnFromFunction.new(gexp_tuple_1.value) }
|
175
|
+
ast_node(:MainReturnNode) { ReturnFromMain.new(var_tuple.value) }
|
196
176
|
|
197
177
|
ast_node(:MainDefNode) do
|
198
|
-
|
199
|
-
|
200
|
-
Main.new
|
178
|
+
command_block = CommandBlock.new(create_commands(commands))
|
179
|
+
return_statement = ret.empty? ? NoReturnStatement.new : ret.value
|
180
|
+
Main.new(command_block, return_statement)
|
201
181
|
end
|
202
182
|
|
203
183
|
ast_node(:ProgramNode) do
|
204
184
|
defs = definitions.elements.map { |node| node.definition.value }
|
205
|
-
Program.new
|
185
|
+
Program.new(defs, main_def.value)
|
206
186
|
end
|
207
187
|
|
208
188
|
def create_commands(commands)
|
209
189
|
commands.elements.map { |node| node.command.value }
|
210
190
|
end
|
211
|
-
|
212
191
|
end
|
213
|
-
|
214
192
|
end
|