gobstones 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +133 -0
  3. data/.rubocop_todo.yml +75 -0
  4. data/.simplecov +1 -3
  5. data/.tool-versions +1 -0
  6. data/.travis.yml +9 -2
  7. data/Gemfile +11 -5
  8. data/Gemfile.lock +65 -39
  9. data/README.md +8 -1
  10. data/Rakefile +1 -1
  11. data/bin/gobstones +1 -1
  12. data/gobstones.gemspec +12 -11
  13. data/lib/gobstones/cli/printer.rb +41 -28
  14. data/lib/gobstones/cli/runner.rb +50 -15
  15. data/lib/gobstones/extensions/all.rb +1 -1
  16. data/lib/gobstones/extensions/boolean.rb +1 -5
  17. data/lib/gobstones/extensions/{fixnum.rb → integer.rb} +2 -4
  18. data/lib/gobstones/extensions/string.rb +1 -3
  19. data/lib/gobstones/lang/all.rb +3 -3
  20. data/lib/gobstones/lang/commands/all.rb +11 -10
  21. data/lib/gobstones/lang/commands/boom.rb +26 -0
  22. data/lib/gobstones/lang/commands/command_block.rb +23 -23
  23. data/lib/gobstones/lang/commands/conditional.rb +26 -0
  24. data/lib/gobstones/lang/commands/if.rb +13 -0
  25. data/lib/gobstones/lang/commands/if_then_else.rb +26 -0
  26. data/lib/gobstones/lang/commands/ir_al_origen.rb +15 -0
  27. data/lib/gobstones/lang/commands/mover.rb +23 -0
  28. data/lib/gobstones/lang/commands/multiple_assignment.rb +34 -21
  29. data/lib/gobstones/lang/commands/poner.rb +31 -0
  30. data/lib/gobstones/lang/commands/procedure_call.rb +8 -8
  31. data/lib/gobstones/lang/commands/repeat_with.rb +69 -0
  32. data/lib/gobstones/lang/commands/sacar.rb +29 -0
  33. data/lib/gobstones/lang/commands/single_assignment.rb +15 -20
  34. data/lib/gobstones/lang/commands/skip.rb +15 -0
  35. data/lib/gobstones/lang/commands/vaciar_tablero.rb +15 -0
  36. data/lib/gobstones/lang/commands/while.rb +20 -0
  37. data/lib/gobstones/lang/definitions/definition.rb +16 -23
  38. data/lib/gobstones/lang/definitions/definition_call.rb +7 -15
  39. data/lib/gobstones/lang/definitions/function.rb +1 -7
  40. data/lib/gobstones/lang/definitions/main.rb +1 -8
  41. data/lib/gobstones/lang/definitions/no_return_statement.rb +2 -8
  42. data/lib/gobstones/lang/definitions/procedure.rb +1 -7
  43. data/lib/gobstones/lang/definitions/return_from_function.rb +6 -13
  44. data/lib/gobstones/lang/definitions/return_from_main.rb +15 -10
  45. data/lib/gobstones/lang/definitions/var_tuple.rb +10 -12
  46. data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +17 -27
  47. data/lib/gobstones/lang/expressions/boolean_expressions.rb +4 -10
  48. data/lib/gobstones/lang/expressions/comparison_expressions.rb +0 -16
  49. data/lib/gobstones/lang/expressions/enclosed_by_parens_expression.rb +3 -5
  50. data/lib/gobstones/lang/expressions/expression.rb +18 -0
  51. data/lib/gobstones/lang/expressions/function_call.rb +9 -6
  52. data/lib/gobstones/lang/expressions/one_arg_expression.rb +8 -16
  53. data/lib/gobstones/lang/expressions/primitive_functions.rb +24 -16
  54. data/lib/gobstones/lang/expressions/two_arg_expression.rb +9 -16
  55. data/lib/gobstones/lang/expressions/type_bound_functions.rb +30 -25
  56. data/lib/gobstones/lang/expressions/var_name.rb +9 -13
  57. data/lib/gobstones/lang/literals/all.rb +3 -3
  58. data/lib/gobstones/lang/literals/{booleans.rb → boolean.rb} +24 -22
  59. data/lib/gobstones/lang/literals/{colors.rb → color.rb} +4 -14
  60. data/lib/gobstones/lang/literals/{directions.rb → direction.rb} +3 -13
  61. data/lib/gobstones/lang/literals/literal.rb +35 -27
  62. data/lib/gobstones/lang/literals/number.rb +6 -8
  63. data/lib/gobstones/lang/program.rb +9 -16
  64. data/lib/gobstones/modules/equality_definition.rb +23 -0
  65. data/lib/gobstones/parser/ast/ast.rb +48 -70
  66. data/lib/gobstones/parser/parse_error.rb +2 -7
  67. data/lib/gobstones/parser/treetop_parser.rb +9 -14
  68. data/lib/gobstones/runner/board.rb +12 -15
  69. data/lib/gobstones/runner/cell.rb +14 -20
  70. data/lib/gobstones/runner/errors/all.rb +1 -1
  71. data/lib/gobstones/runner/errors/boom_error.rb +0 -5
  72. data/lib/gobstones/runner/errors/definition_not_found_error.rb +7 -7
  73. data/lib/gobstones/runner/errors/empty_cell_error.rb +0 -5
  74. data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +0 -5
  75. data/lib/gobstones/runner/errors/gobstones_type_error.rb +2 -7
  76. data/lib/gobstones/runner/errors/out_of_board_error.rb +0 -5
  77. data/lib/gobstones/runner/errors/undefined_variable_error.rb +6 -4
  78. data/lib/gobstones/runner/errors/wrong_arguments_error.rb +0 -5
  79. data/lib/gobstones/runner/execution_context.rb +16 -33
  80. data/lib/gobstones/runner/head.rb +17 -20
  81. data/lib/gobstones/runner/program_result.rb +12 -0
  82. data/lib/gobstones/type_check_result.rb +0 -4
  83. data/spec/lang/commands/boom_spec.rb +7 -0
  84. data/spec/lang/commands/command_block_spec.rb +15 -0
  85. data/spec/lang/commands/if_spec.rb +32 -0
  86. data/spec/lang/commands/if_then_else_spec.rb +19 -0
  87. data/spec/lang/commands/ir_al_origen_spec.rb +11 -0
  88. data/spec/lang/commands/mover_spec.rb +30 -0
  89. data/spec/lang/commands/multiple_assignment_spec.rb +39 -22
  90. data/spec/lang/commands/poner_spec.rb +27 -0
  91. data/spec/lang/commands/procedure_call_spec.rb +26 -28
  92. data/spec/lang/commands/procedure_spec.rb +32 -32
  93. data/spec/lang/commands/repeat_with_spec.rb +64 -0
  94. data/spec/lang/commands/sacar_spec.rb +32 -0
  95. data/spec/lang/commands/single_assignment_spec.rb +5 -6
  96. data/spec/lang/commands/skip_spec.rb +10 -0
  97. data/spec/lang/commands/vaciar_tablero_spec.rb +10 -0
  98. data/spec/lang/commands/while_spec.rb +39 -0
  99. data/spec/lang/definitions/main_spec.rb +34 -0
  100. data/spec/lang/definitions/no_return_statement_spec.rb +4 -5
  101. data/spec/lang/definitions/var_tuple_spec.rb +4 -7
  102. data/spec/lang/expressions/arithmetic_expressions_spec.rb +37 -64
  103. data/spec/lang/expressions/boolean_expressions_spec.rb +25 -34
  104. data/spec/lang/expressions/comparison_expressions_spec.rb +109 -155
  105. data/spec/lang/expressions/enclosed_by_parens_expression_spec.rb +3 -7
  106. data/spec/lang/expressions/function_call_spec.rb +24 -20
  107. data/spec/lang/expressions/primitive_functions_spec.rb +28 -39
  108. data/spec/lang/expressions/type_bound_functions_spec.rb +10 -18
  109. data/spec/lang/expressions/var_name_spec.rb +8 -12
  110. data/spec/lang/literals/{booleans_spec.rb → boolean_spec.rb} +3 -5
  111. data/spec/lang/literals/color_spec.rb +19 -0
  112. data/spec/lang/literals/direction_spec.rb +46 -0
  113. data/spec/lang/literals/{numbers_spec.rb → number_spec.rb} +3 -4
  114. data/spec/matchers/parse_matcher.rb +9 -11
  115. data/spec/parser/arithmetic_expressions_spec.rb +51 -61
  116. data/spec/parser/assignments_spec.rb +21 -31
  117. data/spec/parser/boolean_expressions_spec.rb +35 -43
  118. data/spec/parser/command_block_spec.rb +18 -20
  119. data/spec/parser/data_types_spec.rb +9 -19
  120. data/spec/parser/function_calls_spec.rb +19 -19
  121. data/spec/parser/function_definitions_spec.rb +17 -22
  122. data/spec/parser/gobstones_program_spec.rb +30 -30
  123. data/spec/parser/if_command_spec.rb +19 -28
  124. data/spec/parser/main_definition_spec.rb +13 -16
  125. data/spec/parser/nested_expressions_spec.rb +20 -24
  126. data/spec/parser/primitive_expressions_spec.rb +33 -38
  127. data/spec/parser/procedure_calls_spec.rb +17 -18
  128. data/spec/parser/procedure_definitions_spec.rb +12 -15
  129. data/spec/parser/repeat_with_command_spec.rb +10 -10
  130. data/spec/parser/simple_commands_spec.rb +23 -37
  131. data/spec/parser/treetop_parser_spec.rb +87 -83
  132. data/spec/parser/var_tuple_spec.rb +8 -12
  133. data/spec/parser/while_command_spec.rb +11 -14
  134. data/spec/runner/board_spec.rb +28 -33
  135. data/spec/runner/cell_spec.rb +21 -28
  136. data/spec/runner/execution_context_spec.rb +18 -35
  137. data/spec/runner/head_spec.rb +54 -60
  138. data/spec/spec_helper.rb +10 -1
  139. data/spec/support/board_assertions.rb +18 -0
  140. data/spec/{gobstones_lang_test_objects.rb → support/gobstones_lang_test_objects.rb} +6 -4
  141. data/spec/type_checker_spec.rb +19 -25
  142. metadata +80 -56
  143. data/.ruby-version +0 -1
  144. data/lib/gobstones/lang/commands/boom_cmd.rb +0 -31
  145. data/lib/gobstones/lang/commands/conditional_cmd.rb +0 -31
  146. data/lib/gobstones/lang/commands/if_cmd.rb +0 -38
  147. data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +0 -19
  148. data/lib/gobstones/lang/commands/mover_cmd.rb +0 -27
  149. data/lib/gobstones/lang/commands/poner_cmd.rb +0 -35
  150. data/lib/gobstones/lang/commands/repeat_with_cmd.rb +0 -77
  151. data/lib/gobstones/lang/commands/sacar_cmd.rb +0 -33
  152. data/lib/gobstones/lang/commands/skip_cmd.rb +0 -19
  153. data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +0 -19
  154. data/lib/gobstones/lang/commands/while_cmd.rb +0 -25
  155. data/lib/gobstones/modules/equal_by_class.rb +0 -13
  156. data/spec/lang/commands/boom_cmd_spec.rb +0 -8
  157. data/spec/lang/commands/cmd_block_spec.rb +0 -21
  158. data/spec/lang/commands/if_cmd_spec.rb +0 -50
  159. data/spec/lang/commands/ir_al_origen_cmd_spec.rb +0 -16
  160. data/spec/lang/commands/mover_cmd_spec.rb +0 -36
  161. data/spec/lang/commands/poner_cmd_spec.rb +0 -28
  162. data/spec/lang/commands/repeat_with_cmd_spec.rb +0 -60
  163. data/spec/lang/commands/sacar_cmd_spec.rb +0 -35
  164. data/spec/lang/commands/skip_cmd_spec.rb +0 -12
  165. data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +0 -14
  166. data/spec/lang/commands/while_cmd_spec.rb +0 -43
  167. data/spec/lang/literals/colors_spec.rb +0 -13
  168. 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 Gobstones::Runner::GobstonesTypeError, "colors don't have opposite"
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/modules/equal_by_class'
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(context=nil)
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
- self == other ? 0 : (self < other ? -1 : 1)
25
+ return 0 if self == other
26
+ return -1 if self < other
27
+
28
+ 1
19
29
  end
20
30
 
21
- def <(other)
22
- raise 'subclass responsibility'
31
+ def <(_other)
32
+ subclass_responsibility
23
33
  end
24
34
 
25
35
  OPERATORS_MAPPING = {
26
- :equal => :==,
27
- :not_equal => '!='.to_sym,
28
- :less_than => :<,
29
- :less_equal => :<=,
30
- :greater_than => :>, :greater_equal => :>=
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 gbs_op do |other|
35
- send(ruby_op, other) ? True.new : False.new
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
- self.return_type == other.return_type
51
+ return_type == other.return_type
41
52
  end
42
53
 
43
54
  def return_type
44
- raise 'subclass responsibility'
55
+ subclass_responsibility
45
56
  end
46
57
 
47
- def if_true(block, context)
58
+ def if_true(_block, _context)
48
59
  not_boolean_type_error
49
60
  end
50
61
 
51
- def if_false(block, context)
62
+ def if_false(_block, _context)
52
63
  not_boolean_type_error
53
64
  end
54
65
 
55
- def is_true?
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 Gobstones::Runner::GobstonesTypeError, "#{self} is not a boolean"
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 == other
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
- [:+, :-, :*, :/, :%, :**].each do |selector|
24
+ %i[+ - * / % **].each do |selector|
28
25
  define_method selector do |other|
29
- self.class.new value.send(selector, other.value)
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/modules/equal_by_class'
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 ==(other)
20
- super(other) &&
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
- create_context.tap do |context|
27
- main_definition.evaluate context
28
- end
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
- Gobstones::Runner::ProgramExecutionContext.for self
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
- include Gobstones::Lang
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
- mod = Module.new do
20
- define_method :value do
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, mod
22
+ const_set name, ast_module
25
23
  end
26
24
 
27
- ast_node(:IntegerLiteral) { Number.new text_value.to_i }
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 text_value }
37
+ ast_node(:VarNameNode) { VarName.new(text_value) }
40
38
 
41
- ast_node(:NroBolitasFuncNode) { NroBolitas.new gexp.value }
42
- ast_node(:HayBolitasFuncNode) { HayBolitas.new gexp.value }
43
- ast_node(:PuedeMoverFuncNode) { PuedeMover.new gexp.value }
44
- ast_node(:SiguienteFuncNode) { Siguiente.new gexp.value }
45
- ast_node(:PrevioFuncNode) { Previo.new gexp.value }
46
- ast_node(:OpuestoFuncNode) { Opuesto.new gexp.value }
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 memo, node.right.value
54
+ Add.new(memo, node.right.value)
57
55
  when '-'
58
- Sub.new memo, node.right.value
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 memo, node.right.value
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 left.value, right.value
76
+ Div.new(left.value, right.value)
79
77
  when 'mod'
80
- Mod.new left.value, right.value
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 memo, node.right.value
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 left.value, right.value
99
+ classes[rop.text_value].new(left.value, right.value)
102
100
  end
103
101
 
104
- ast_node(:NotExprNode) { Not.new exp.value }
105
- ast_node(:AndExprNode) { And.new left.value, right.value }
106
- ast_node(:OrExprNode) { Or.new left.value, right.value }
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 gexp.value }
109
- ast_node(:FuncCallNode) do
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 string.text_value[1..-2] }
119
+ ast_node(:BoomCmdNode) { Boom.new(string.text_value[1..-2]) }
124
120
 
125
- ast_node(:PonerCmdNode) { Poner.new gexp.value }
126
- ast_node(:SacarCmdNode) { Sacar.new gexp.value }
127
- ast_node(:MoverCmdNode) { Mover.new gexp.value }
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 :ProcCallNode do
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 :SingleAssignmentNode do
137
- SingleAssignment.new var_name.value, gexp.value
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 :MultipleAssignmentNode do
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
- IfCmd.new gexp.value, then_block.value
137
+ If.new(gexp.value, then_block.value)
151
138
  else
152
- IfElseCmd.new gexp.value, then_block.value, else_clause.else_block.value
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) { WhileCmd.new gexp.value, cmd_block.value }
143
+ ast_node(:WhileCmdNode) { While.new(gexp.value, cmd_block.value) }
157
144
 
158
145
  ast_node :RepeatWithCmdNode do
159
- RepeatWithCmd.new var_name.value, range_min.value,
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 variables
162
+ VarTuple.new(variables)
177
163
  end
178
164
 
179
165
  ast_node(:ProcedureNode) do
180
- Procedure.new proc_name.text_value, var_tuple.value, cmd_block.value
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 create_commands(commands)
185
- Function.new func_name.text_value, var_tuple.value,
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(:MainReturnNode) do
194
- ReturnFromMain.new var_tuple.value
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
- cmd_block = CommandBlock.new create_commands(commands)
199
- return_st = ret.empty? ? NoReturnStatement.new : ret.value
200
- Main.new cmd_block, return_st
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 defs, main_def.value
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