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
@@ -1,30 +1,46 @@
|
|
1
|
-
require 'gobstones/lang/literals/
|
1
|
+
require 'gobstones/lang/literals/color'
|
2
2
|
|
3
3
|
module Gobstones
|
4
|
-
|
5
4
|
module CLI
|
6
|
-
|
7
5
|
class Printer
|
8
|
-
|
9
6
|
TEMPLATE = File.read(File.dirname(__FILE__) + '/board_template')
|
10
7
|
|
11
|
-
def initialize(
|
12
|
-
@
|
8
|
+
def initialize(program_result)
|
9
|
+
@program_result = program_result
|
13
10
|
@board = TEMPLATE
|
14
11
|
end
|
15
12
|
|
16
13
|
def print
|
17
14
|
highlight_current_cell
|
18
15
|
put_ball_values
|
16
|
+
print_return_values
|
17
|
+
print_board
|
18
|
+
end
|
19
|
+
|
20
|
+
def print_return_values
|
21
|
+
@program_result.return_values.each do |variable, value|
|
22
|
+
puts "#{variable.name} => #{value}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def print_board
|
19
27
|
puts @board
|
20
28
|
end
|
21
29
|
|
22
30
|
private
|
23
31
|
|
32
|
+
def head
|
33
|
+
@program_result.head
|
34
|
+
end
|
35
|
+
|
36
|
+
def board
|
37
|
+
head.board
|
38
|
+
end
|
39
|
+
|
24
40
|
def highlight_current_cell
|
25
41
|
char = 'X'
|
26
|
-
x =
|
27
|
-
y =
|
42
|
+
x = head.x_pos
|
43
|
+
y = head.y_pos
|
28
44
|
highlight_row x, y, char
|
29
45
|
highlight_row x, y - 1, char
|
30
46
|
highlight_column x, y, char
|
@@ -34,38 +50,38 @@ module Gobstones
|
|
34
50
|
def put_ball_values
|
35
51
|
total_rows.times do |x|
|
36
52
|
total_columns.times do |y|
|
37
|
-
put_ball_value
|
38
|
-
put_ball_value
|
39
|
-
put_ball_value
|
40
|
-
put_ball_value
|
53
|
+
put_ball_value board.number_of_balls(x, y, Lang::Negro.new), 'N', x, y, 2, 1
|
54
|
+
put_ball_value board.number_of_balls(x, y, Lang::Azul.new), 'A', x, y, 6, 1
|
55
|
+
put_ball_value board.number_of_balls(x, y, Lang::Verde.new), 'V', x, y, 2, 3
|
56
|
+
put_ball_value board.number_of_balls(x, y, Lang::Rojo.new), 'R', x, y, 6, 3
|
41
57
|
end
|
42
58
|
end
|
43
59
|
end
|
44
60
|
|
45
61
|
def put_ball_value(number, char, x, y, x_offset, y_offset)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@board[pos+2] = char
|
62
|
+
return if number.zero?
|
63
|
+
|
64
|
+
corner = cell_top_left_corner(x, y)
|
65
|
+
pos = corner + (y_offset * line_length) + x_offset
|
66
|
+
if number < 10
|
67
|
+
@board[pos] = ' '
|
68
|
+
@board[pos + 1] = number.to_s
|
69
|
+
else
|
70
|
+
@board[pos] = number.to_s[0]
|
71
|
+
@board[pos + 1] = number.to_s[1]
|
57
72
|
end
|
73
|
+
@board[pos + 2] = char
|
58
74
|
end
|
59
75
|
|
60
76
|
def highlight_row(x, y, char)
|
61
|
-
corner = cell_top_left_corner
|
77
|
+
corner = cell_top_left_corner(x, y)
|
62
78
|
(cell_width - 1).times do |index|
|
63
79
|
@board[corner + index + 1] = char
|
64
80
|
end
|
65
81
|
end
|
66
82
|
|
67
83
|
def highlight_column(x, y, char)
|
68
|
-
corner = cell_top_left_corner
|
84
|
+
corner = cell_top_left_corner(x, y)
|
69
85
|
(cell_height - 1).times do |index|
|
70
86
|
@board[corner + ((index + 1) * line_length)] = char
|
71
87
|
end
|
@@ -98,9 +114,6 @@ module Gobstones
|
|
98
114
|
def total_rows
|
99
115
|
9
|
100
116
|
end
|
101
|
-
|
102
117
|
end
|
103
|
-
|
104
118
|
end
|
105
|
-
|
106
119
|
end
|
data/lib/gobstones/cli/runner.rb
CHANGED
@@ -5,11 +5,8 @@ require 'gobstones/cli/printer'
|
|
5
5
|
include Gobstones::Parser
|
6
6
|
|
7
7
|
module Gobstones
|
8
|
-
|
9
8
|
module CLI
|
10
|
-
|
11
9
|
class Runner
|
12
|
-
|
13
10
|
def self.run(file_name)
|
14
11
|
new(File.read(file_name)).run
|
15
12
|
end
|
@@ -21,19 +18,32 @@ module Gobstones
|
|
21
18
|
|
22
19
|
def run
|
23
20
|
print_program_result parse_program.evaluate
|
24
|
-
rescue Gobstones::Parser::ParseError =>
|
25
|
-
handle_parse_error
|
26
|
-
rescue Gobstones::Runner::GobstonesTypeError =>
|
27
|
-
handle_type_error
|
28
|
-
rescue
|
29
|
-
|
21
|
+
rescue Gobstones::Parser::ParseError => e
|
22
|
+
handle_parse_error e
|
23
|
+
rescue Gobstones::Runner::GobstonesTypeError => e
|
24
|
+
handle_type_error e
|
25
|
+
rescue Gobstones::Runner::BoomError => e
|
26
|
+
handle_boom_error e
|
27
|
+
rescue Gobstones::Runner::UndefinedVariableError => e
|
28
|
+
handle_undefined_variable_error e
|
29
|
+
rescue Gobstones::Runner::EmptyCellError => e
|
30
|
+
handle_empty_cell_error e
|
31
|
+
rescue Gobstones::Runner::OutOfBoardError => e
|
32
|
+
handle_out_of_board_error e
|
33
|
+
rescue Gobstones::Runner::DefinitionNotFound => e
|
34
|
+
handle_definition_not_found_error e
|
35
|
+
rescue Gobstones::Runner::WrongArgumentsError => e
|
36
|
+
handle_wrong_arguments_error e
|
37
|
+
rescue Gobstones::Runner::GobstonesRuntimeError => e
|
38
|
+
handle_runtime_error e
|
39
|
+
rescue StandardError => e
|
30
40
|
raise e
|
31
41
|
end
|
32
42
|
|
33
43
|
private
|
34
44
|
|
35
|
-
def print_program_result(
|
36
|
-
Printer.new(
|
45
|
+
def print_program_result(result)
|
46
|
+
Printer.new(result).print
|
37
47
|
end
|
38
48
|
|
39
49
|
def parse_program
|
@@ -42,17 +52,42 @@ module Gobstones
|
|
42
52
|
|
43
53
|
def handle_parse_error(parse_error)
|
44
54
|
parse_error.parser.failure_reason =~ /^(Expected .+) after/m
|
45
|
-
puts "#{
|
55
|
+
puts "#{Regexp.last_match(1).gsub("\n", '$NEWLINE')}:"
|
46
56
|
puts parse_error.code.lines.to_a[parse_error.parser.failure_line - 1]
|
47
57
|
puts "#{'~' * (parse_error.parser.failure_column - 1)}^"
|
48
58
|
end
|
49
59
|
|
50
60
|
def handle_type_error(type_error)
|
51
|
-
puts "Type Error: #{type_error.message}
|
61
|
+
puts "Type Error: #{type_error.message}"
|
52
62
|
end
|
53
63
|
|
54
|
-
|
64
|
+
def handle_boom_error(boom_error)
|
65
|
+
puts "BOOM!! #{boom_error.message}"
|
66
|
+
end
|
55
67
|
|
56
|
-
|
68
|
+
def handle_undefined_variable_error(undefined_variable_error)
|
69
|
+
puts undefined_variable_error.message
|
70
|
+
end
|
71
|
+
|
72
|
+
def handle_empty_cell_error(_empty_cell_error)
|
73
|
+
puts 'There are no balls to take out!'
|
74
|
+
end
|
57
75
|
|
76
|
+
def handle_out_of_board_error(_out_of_board_error)
|
77
|
+
puts 'You fell from the board!'
|
78
|
+
end
|
79
|
+
|
80
|
+
def handle_definition_not_found_error(definition_not_found_error)
|
81
|
+
puts definition_not_found_error.message
|
82
|
+
end
|
83
|
+
|
84
|
+
def handle_wrong_arguments_error(wrong_arguments_error)
|
85
|
+
puts wrong_arguments_error.message
|
86
|
+
end
|
87
|
+
|
88
|
+
def handle_runtime_error(runtime_error)
|
89
|
+
puts runtime_error.message
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
58
93
|
end
|
@@ -1,17 +1,13 @@
|
|
1
|
-
require 'gobstones/lang/literals/
|
1
|
+
require 'gobstones/lang/literals/boolean'
|
2
2
|
|
3
3
|
class TrueClass
|
4
|
-
|
5
4
|
def to_gbs_bool
|
6
5
|
Gobstones::Lang::True.new
|
7
6
|
end
|
8
|
-
|
9
7
|
end
|
10
8
|
|
11
9
|
class FalseClass
|
12
|
-
|
13
10
|
def to_gbs_bool
|
14
11
|
Gobstones::Lang::False.new
|
15
12
|
end
|
16
|
-
|
17
13
|
end
|
data/lib/gobstones/lang/all.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'gobstones/lang/
|
2
|
-
require 'gobstones/lang/expressions/all'
|
1
|
+
require 'gobstones/lang/program'
|
3
2
|
require 'gobstones/lang/commands/all'
|
4
3
|
require 'gobstones/lang/definitions/all'
|
5
|
-
require 'gobstones/lang/
|
4
|
+
require 'gobstones/lang/expressions/all'
|
5
|
+
require 'gobstones/lang/literals/all'
|
@@ -1,14 +1,15 @@
|
|
1
|
-
require 'gobstones/lang/commands/
|
1
|
+
require 'gobstones/lang/commands/boom'
|
2
2
|
require 'gobstones/lang/commands/command_block'
|
3
|
-
require 'gobstones/lang/commands/
|
4
|
-
require 'gobstones/lang/commands/
|
5
|
-
require 'gobstones/lang/commands/
|
3
|
+
require 'gobstones/lang/commands/if'
|
4
|
+
require 'gobstones/lang/commands/if_then_else'
|
5
|
+
require 'gobstones/lang/commands/ir_al_origen'
|
6
|
+
require 'gobstones/lang/commands/mover'
|
6
7
|
require 'gobstones/lang/commands/multiple_assignment'
|
7
|
-
require 'gobstones/lang/commands/
|
8
|
+
require 'gobstones/lang/commands/poner'
|
8
9
|
require 'gobstones/lang/commands/procedure_call'
|
9
|
-
require 'gobstones/lang/commands/
|
10
|
-
require 'gobstones/lang/commands/
|
10
|
+
require 'gobstones/lang/commands/repeat_with'
|
11
|
+
require 'gobstones/lang/commands/sacar'
|
11
12
|
require 'gobstones/lang/commands/single_assignment'
|
12
|
-
require 'gobstones/lang/commands/
|
13
|
-
require 'gobstones/lang/commands/
|
14
|
-
require 'gobstones/lang/commands/
|
13
|
+
require 'gobstones/lang/commands/skip'
|
14
|
+
require 'gobstones/lang/commands/vaciar_tablero'
|
15
|
+
require 'gobstones/lang/commands/while'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'gobstones/runner/errors/boom_error'
|
2
|
+
require 'gobstones/modules/equality_definition'
|
3
|
+
|
4
|
+
module Gobstones
|
5
|
+
module Lang
|
6
|
+
module Commands
|
7
|
+
class Boom
|
8
|
+
include EqualityDefinition
|
9
|
+
|
10
|
+
attr_reader :message
|
11
|
+
|
12
|
+
def initialize(message)
|
13
|
+
@message = message
|
14
|
+
end
|
15
|
+
|
16
|
+
def equality_attributes
|
17
|
+
%i[message]
|
18
|
+
end
|
19
|
+
|
20
|
+
def evaluate(_context)
|
21
|
+
raise Runner::BoomError, message
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,37 +1,37 @@
|
|
1
|
-
require 'gobstones/modules/
|
1
|
+
require 'gobstones/modules/equality_definition'
|
2
2
|
|
3
3
|
module Gobstones
|
4
|
-
|
5
4
|
module Lang
|
5
|
+
module Commands
|
6
|
+
class CommandBlock
|
7
|
+
include EqualityDefinition
|
6
8
|
|
7
|
-
|
9
|
+
attr_reader :commands
|
8
10
|
|
9
|
-
|
11
|
+
def self.empty
|
12
|
+
new([])
|
13
|
+
end
|
10
14
|
|
11
|
-
|
15
|
+
def self.with_just(a_command)
|
16
|
+
new([a_command])
|
17
|
+
end
|
12
18
|
|
13
|
-
|
14
|
-
|
15
|
-
|
19
|
+
def initialize(commands)
|
20
|
+
@commands = commands
|
21
|
+
end
|
16
22
|
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
def equality_attributes
|
24
|
+
%i[commands]
|
25
|
+
end
|
20
26
|
|
21
|
-
|
22
|
-
|
23
|
-
|
27
|
+
def empty?
|
28
|
+
commands.empty?
|
29
|
+
end
|
24
30
|
|
25
|
-
|
26
|
-
|
31
|
+
def evaluate(context)
|
32
|
+
commands.each { |command| command.evaluate(context) }
|
33
|
+
end
|
27
34
|
end
|
28
|
-
|
29
|
-
def evaluate(context)
|
30
|
-
commands.each { |command| command.evaluate context }
|
31
|
-
end
|
32
|
-
|
33
35
|
end
|
34
|
-
|
35
36
|
end
|
36
|
-
|
37
37
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'gobstones/modules/equality_definition'
|
2
|
+
|
3
|
+
module Gobstones
|
4
|
+
module Lang
|
5
|
+
module Commands
|
6
|
+
class Conditional
|
7
|
+
include EqualityDefinition
|
8
|
+
|
9
|
+
attr_reader :condition, :then_block
|
10
|
+
|
11
|
+
def initialize(condition, then_block)
|
12
|
+
@condition = condition
|
13
|
+
@then_block = then_block
|
14
|
+
end
|
15
|
+
|
16
|
+
def equality_attributes
|
17
|
+
%i[condition then_block]
|
18
|
+
end
|
19
|
+
|
20
|
+
def evaluate_condition(context)
|
21
|
+
condition.evaluate(context)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'gobstones/lang/commands/if'
|
2
|
+
|
3
|
+
module Gobstones
|
4
|
+
module Lang
|
5
|
+
module Commands
|
6
|
+
class IfThenElse < If
|
7
|
+
attr_reader :else_block
|
8
|
+
|
9
|
+
def initialize(condition, then_block, else_block)
|
10
|
+
super(condition, then_block)
|
11
|
+
@else_block = else_block
|
12
|
+
end
|
13
|
+
|
14
|
+
def equality_attributes
|
15
|
+
super + [:else_block]
|
16
|
+
end
|
17
|
+
|
18
|
+
def evaluate(context)
|
19
|
+
evaluate_condition(context).
|
20
|
+
if_true(then_block, context).
|
21
|
+
if_false(else_block, context)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|