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
@@ -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
|