gobstones 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|