gobstones 0.0.1.1

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.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +3 -0
  4. data/.ruby-version +1 -0
  5. data/.simplecov +3 -0
  6. data/.travis.yml +4 -0
  7. data/CHANGELOG +4 -0
  8. data/Gemfile +12 -0
  9. data/Gemfile.lock +47 -0
  10. data/LICENSE +675 -0
  11. data/README.md +17 -0
  12. data/Rakefile +4 -0
  13. data/bin/gobstones +12 -0
  14. data/gobstones.gemspec +24 -0
  15. data/lib/gobstones/cli/board_template +39 -0
  16. data/lib/gobstones/cli/printer.rb +106 -0
  17. data/lib/gobstones/cli/runner.rb +52 -0
  18. data/lib/gobstones/extensions/all.rb +2 -0
  19. data/lib/gobstones/extensions/boolean.rb +17 -0
  20. data/lib/gobstones/extensions/fixnum.rb +9 -0
  21. data/lib/gobstones/lang/all.rb +5 -0
  22. data/lib/gobstones/lang/commands/all.rb +13 -0
  23. data/lib/gobstones/lang/commands/assignments.rb +29 -0
  24. data/lib/gobstones/lang/commands/boom_cmd.rb +28 -0
  25. data/lib/gobstones/lang/commands/command_block.rb +37 -0
  26. data/lib/gobstones/lang/commands/conditional_cmd.rb +27 -0
  27. data/lib/gobstones/lang/commands/if_cmd.rb +38 -0
  28. data/lib/gobstones/lang/commands/ir_al_origen_cmd.rb +19 -0
  29. data/lib/gobstones/lang/commands/mover_cmd.rb +25 -0
  30. data/lib/gobstones/lang/commands/poner_cmd.rb +31 -0
  31. data/lib/gobstones/lang/commands/procedure_call.rb +23 -0
  32. data/lib/gobstones/lang/commands/repeat_with_cmd.rb +73 -0
  33. data/lib/gobstones/lang/commands/sacar_cmd.rb +31 -0
  34. data/lib/gobstones/lang/commands/skip_cmd.rb +19 -0
  35. data/lib/gobstones/lang/commands/vaciar_tablero_cmd.rb +19 -0
  36. data/lib/gobstones/lang/commands/while_cmd.rb +25 -0
  37. data/lib/gobstones/lang/definitions/all.rb +4 -0
  38. data/lib/gobstones/lang/definitions/definition.rb +32 -0
  39. data/lib/gobstones/lang/definitions/definition_call.rb +24 -0
  40. data/lib/gobstones/lang/definitions/function.rb +14 -0
  41. data/lib/gobstones/lang/definitions/main.rb +26 -0
  42. data/lib/gobstones/lang/definitions/no_return_statement.rb +15 -0
  43. data/lib/gobstones/lang/definitions/procedure.rb +44 -0
  44. data/lib/gobstones/lang/definitions/return_from_function.rb +22 -0
  45. data/lib/gobstones/lang/definitions/return_from_main.rb +22 -0
  46. data/lib/gobstones/lang/definitions/var_tuple.rb +26 -0
  47. data/lib/gobstones/lang/expressions/all.rb +8 -0
  48. data/lib/gobstones/lang/expressions/arithmetic_expressions.rb +52 -0
  49. data/lib/gobstones/lang/expressions/boolean_expressions.rb +29 -0
  50. data/lib/gobstones/lang/expressions/comparison_expressions.rb +45 -0
  51. data/lib/gobstones/lang/expressions/function_call.rb +15 -0
  52. data/lib/gobstones/lang/expressions/one_arg_expression.rb +21 -0
  53. data/lib/gobstones/lang/expressions/parentheses_expression.rb +13 -0
  54. data/lib/gobstones/lang/expressions/primitive_functions.rb +68 -0
  55. data/lib/gobstones/lang/expressions/two_arg_expression.rb +34 -0
  56. data/lib/gobstones/lang/expressions/type_bound_functions.rb +66 -0
  57. data/lib/gobstones/lang/expressions/var_name.rb +31 -0
  58. data/lib/gobstones/lang/literals/all.rb +4 -0
  59. data/lib/gobstones/lang/literals/booleans.rb +109 -0
  60. data/lib/gobstones/lang/literals/colors.rb +94 -0
  61. data/lib/gobstones/lang/literals/directions.rb +137 -0
  62. data/lib/gobstones/lang/literals/literal.rb +63 -0
  63. data/lib/gobstones/lang/literals/number.rb +49 -0
  64. data/lib/gobstones/lang/program.rb +32 -0
  65. data/lib/gobstones/modules/equal_by_class.rb +13 -0
  66. data/lib/gobstones/parser/ast/ast.rb +210 -0
  67. data/lib/gobstones/parser/grammar/gobstones.treetop +316 -0
  68. data/lib/gobstones/parser/parse_error.rb +17 -0
  69. data/lib/gobstones/parser/treetop_parser.rb +73 -0
  70. data/lib/gobstones/runner/all.rb +6 -0
  71. data/lib/gobstones/runner/board.rb +57 -0
  72. data/lib/gobstones/runner/cell.rb +60 -0
  73. data/lib/gobstones/runner/errors/all.rb +8 -0
  74. data/lib/gobstones/runner/errors/boom_error.rb +11 -0
  75. data/lib/gobstones/runner/errors/definition_not_found_error.rb +19 -0
  76. data/lib/gobstones/runner/errors/empty_cell_error.rb +11 -0
  77. data/lib/gobstones/runner/errors/gobstones_runtime_error.rb +11 -0
  78. data/lib/gobstones/runner/errors/gobstones_type_error.rb +11 -0
  79. data/lib/gobstones/runner/errors/out_of_board_error.rb +11 -0
  80. data/lib/gobstones/runner/errors/undefined_variable_error.rb +11 -0
  81. data/lib/gobstones/runner/errors/wrong_arguments_error.rb +11 -0
  82. data/lib/gobstones/runner/execution_context.rb +89 -0
  83. data/lib/gobstones/runner/head.rb +101 -0
  84. data/lib/gobstones/type_check_result.rb +16 -0
  85. data/spec/lang/commands/assignments_spec.rb +13 -0
  86. data/spec/lang/commands/boom_cmd_spec.rb +8 -0
  87. data/spec/lang/commands/cmd_block_spec.rb +21 -0
  88. data/spec/lang/commands/if_cmd_spec.rb +49 -0
  89. data/spec/lang/commands/ir_al_origen_cmd_spec.rb +16 -0
  90. data/spec/lang/commands/mover_cmd_spec.rb +38 -0
  91. data/spec/lang/commands/poner_cmd_spec.rb +29 -0
  92. data/spec/lang/commands/procedure_call_spec.rb +44 -0
  93. data/spec/lang/commands/procedure_spec.rb +67 -0
  94. data/spec/lang/commands/repeat_with_cmd_spec.rb +41 -0
  95. data/spec/lang/commands/sacar_cmd_spec.rb +34 -0
  96. data/spec/lang/commands/skip_cmd_spec.rb +12 -0
  97. data/spec/lang/commands/vaciar_tablero_cmd_spec.rb +13 -0
  98. data/spec/lang/commands/while_cmd_spec.rb +37 -0
  99. data/spec/lang/expressions/arithmetic_expressions_spec.rb +108 -0
  100. data/spec/lang/expressions/boolean_expressions_spec.rb +56 -0
  101. data/spec/lang/expressions/comparison_expressions_spec.rb +285 -0
  102. data/spec/lang/expressions/primitive_functions_spec.rb +126 -0
  103. data/spec/lang/expressions/type_bound_functions_spec.rb +39 -0
  104. data/spec/lang/expressions/var_name_spec.rb +16 -0
  105. data/spec/lang/literals/booleans_spec.rb +13 -0
  106. data/spec/lang/literals/colors_spec.rb +13 -0
  107. data/spec/lang/literals/directions_spec.rb +45 -0
  108. data/spec/lang/literals/numbers_spec.rb +8 -0
  109. data/spec/matchers/parse_matcher.rb +84 -0
  110. data/spec/parser/arithmetic_expressions_spec.rb +129 -0
  111. data/spec/parser/assignments_spec.rb +39 -0
  112. data/spec/parser/boolean_expressions_spec.rb +111 -0
  113. data/spec/parser/command_block_spec.rb +50 -0
  114. data/spec/parser/data_types_spec.rb +67 -0
  115. data/spec/parser/function_calls_spec.rb +37 -0
  116. data/spec/parser/function_definitions_spec.rb +50 -0
  117. data/spec/parser/gobstones_program_spec.rb +55 -0
  118. data/spec/parser/if_command_spec.rb +46 -0
  119. data/spec/parser/main_definition_spec.rb +42 -0
  120. data/spec/parser/nested_expressions_spec.rb +39 -0
  121. data/spec/parser/primitive_expressions_spec.rb +105 -0
  122. data/spec/parser/procedure_calls_spec.rb +36 -0
  123. data/spec/parser/procedure_definitions_spec.rb +39 -0
  124. data/spec/parser/repeat_with_command_spec.rb +23 -0
  125. data/spec/parser/simple_commands_spec.rb +62 -0
  126. data/spec/parser/treetop_parser_spec.rb +109 -0
  127. data/spec/parser/var_tuple_spec.rb +30 -0
  128. data/spec/parser/while_command_spec.rb +30 -0
  129. data/spec/runner/board_spec.rb +85 -0
  130. data/spec/runner/cell_spec.rb +72 -0
  131. data/spec/runner/execution_context_spec.rb +64 -0
  132. data/spec/runner/head_spec.rb +139 -0
  133. data/spec/spec_helper.rb +15 -0
  134. data/spec/type_checker_spec.rb +37 -0
  135. metadata +242 -0
@@ -0,0 +1,22 @@
1
+ module Gobstones
2
+
3
+ module Lang
4
+
5
+ class ReturnFromFunction
6
+
7
+ attr_reader :expressions
8
+
9
+ def initialize(expressions)
10
+ @expressions = expressions
11
+ end
12
+
13
+ def ==(other)
14
+ self.class == other.class &&
15
+ self.expressions == other.expressions
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ module Gobstones
2
+
3
+ module Lang
4
+
5
+ class ReturnFromMain
6
+
7
+ attr_reader :var_tuple
8
+
9
+ def initialize(var_tuple)
10
+ @var_tuple = var_tuple
11
+ end
12
+
13
+ def ==(other)
14
+ self.class == other.class &&
15
+ self.var_tuple == other.var_tuple
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,26 @@
1
+ module Gobstones
2
+
3
+ module Lang
4
+
5
+ class VarTuple
6
+
7
+ attr_reader :variables
8
+
9
+ def initialize(variables)
10
+ @variables = variables
11
+ end
12
+
13
+ def ==(other)
14
+ self.class == other.class &&
15
+ self.variables == other.variables
16
+ end
17
+
18
+ def length
19
+ variables.length
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,8 @@
1
+ require 'gobstones/lang/expressions/arithmetic_expressions'
2
+ require 'gobstones/lang/expressions/boolean_expressions'
3
+ require 'gobstones/lang/expressions/comparison_expressions'
4
+ require 'gobstones/lang/expressions/function_call'
5
+ require 'gobstones/lang/expressions/parentheses_expression'
6
+ require 'gobstones/lang/expressions/primitive_functions'
7
+ require 'gobstones/lang/expressions/type_bound_functions'
8
+ require 'gobstones/lang/expressions/var_name'
@@ -0,0 +1,52 @@
1
+ require 'gobstones/lang/expressions/two_arg_expression'
2
+ require 'gobstones/runner/errors/gobstones_runtime_error'
3
+
4
+ module Gobstones
5
+
6
+ module Lang
7
+
8
+ class Add < TwoArgExpression
9
+
10
+ evaluates_with :+
11
+
12
+ end
13
+
14
+ class Sub < TwoArgExpression
15
+
16
+ evaluates_with :-
17
+
18
+ end
19
+
20
+ class Mul < TwoArgExpression
21
+
22
+ evaluates_with :*
23
+
24
+ end
25
+
26
+ class Div < TwoArgExpression
27
+
28
+ def evaluate(context=nil)
29
+ begin
30
+ left_expr.evaluate(context) / right_expr.evaluate(context)
31
+ rescue ZeroDivisionError
32
+ raise Gobstones::Runner::GobstonesRuntimeError, 'zero division'
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ class Mod < TwoArgExpression
39
+
40
+ evaluates_with :%
41
+
42
+ end
43
+
44
+ class Pow < TwoArgExpression
45
+
46
+ evaluates_with :**
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,29 @@
1
+ require 'gobstones/lang/expressions/one_arg_expression'
2
+
3
+ module Gobstones
4
+
5
+ module Lang
6
+
7
+ class Not < OneArgExpression
8
+
9
+ def evaluate
10
+ arg.evaluate.not
11
+ end
12
+
13
+ end
14
+
15
+ class And < TwoArgExpression
16
+
17
+ evaluates_with :and
18
+
19
+ end
20
+
21
+ class Or < TwoArgExpression
22
+
23
+ evaluates_with :or
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,45 @@
1
+ require 'gobstones/lang/expressions/two_arg_expression'
2
+
3
+ module Gobstones
4
+
5
+ module Lang
6
+
7
+ class Equal < TwoArgExpression
8
+
9
+ evaluates_with :equal
10
+
11
+ end
12
+
13
+ class NotEqual < TwoArgExpression
14
+
15
+ evaluates_with :not_equal
16
+
17
+ end
18
+
19
+ class LessThan < TwoArgExpression
20
+
21
+ evaluates_with :less_than
22
+
23
+ end
24
+
25
+ class LessEqual < TwoArgExpression
26
+
27
+ evaluates_with :less_equal
28
+
29
+ end
30
+
31
+ class GreaterEqual < TwoArgExpression
32
+
33
+ evaluates_with :greater_equal
34
+
35
+ end
36
+
37
+ class GreaterThan < TwoArgExpression
38
+
39
+ evaluates_with :greater_than
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,15 @@
1
+ require 'gobstones/lang/definitions/definition_call'
2
+
3
+ module Gobstones
4
+
5
+ module Lang
6
+
7
+ class FunctionCall
8
+
9
+ include DefinitionCall
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,21 @@
1
+ module Gobstones
2
+
3
+ module Lang
4
+
5
+ class OneArgExpression
6
+
7
+ attr_reader :arg
8
+
9
+ def initialize(arg)
10
+ @arg = arg
11
+ end
12
+
13
+ def ==(other)
14
+ self.class == other.class && arg == other.arg
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,13 @@
1
+ require 'gobstones/lang/expressions/one_arg_expression'
2
+
3
+ module Gobstones
4
+
5
+ module Lang
6
+
7
+ class ParenthesesExpr < OneArgExpression
8
+
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,68 @@
1
+ require 'gobstones/lang/expressions/one_arg_expression'
2
+ require 'gobstones/extensions/boolean'
3
+ require 'gobstones/extensions/fixnum'
4
+ require 'gobstones/type_check_result'
5
+
6
+ module Gobstones
7
+
8
+ module Lang
9
+
10
+ class NroBolitas < OneArgExpression
11
+
12
+ def evaluate(context)
13
+ context.head.number_of_balls(arg.evaluate(context)).to_gbs_num
14
+ end
15
+
16
+ end
17
+
18
+ class HayBolitas < OneArgExpression
19
+
20
+ def evaluate(context)
21
+ context.head.are_there_balls?(arg.evaluate(context)).to_gbs_bool
22
+ end
23
+
24
+ end
25
+
26
+ class PuedeMover < OneArgExpression
27
+
28
+ def evaluate(context)
29
+ context.head.can_move?(arg.evaluate(context)).to_gbs_bool
30
+ end
31
+
32
+ def arg_type
33
+ :Direction
34
+ end
35
+
36
+ def type_check
37
+ Gobstones::TypeCheckResult.new arg_type, arg.return_type
38
+ end
39
+
40
+ end
41
+
42
+ class Siguiente < OneArgExpression
43
+
44
+ def evaluate(context=nil)
45
+ arg.evaluate(context).next
46
+ end
47
+
48
+ end
49
+
50
+ class Previo < OneArgExpression
51
+
52
+ def evaluate(context=nil)
53
+ arg.evaluate(context).previous
54
+ end
55
+
56
+ end
57
+
58
+ class Opuesto < OneArgExpression
59
+
60
+ def evaluate(context=nil)
61
+ arg.evaluate(context).opposite
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+
68
+ end
@@ -0,0 +1,34 @@
1
+ module Gobstones
2
+
3
+ module Lang
4
+
5
+ class TwoArgExpression
6
+
7
+ attr_reader :left_expr, :right_expr
8
+
9
+ def self.evaluates_with(selector)
10
+ instance_eval do
11
+ define_method :evaluate do |*args|
12
+ context = args.first
13
+ left_expr.evaluate(context)
14
+ .send(selector, right_expr.evaluate(context))
15
+ end
16
+ end
17
+ end
18
+
19
+ def initialize(left, right)
20
+ @left_expr = left
21
+ @right_expr = right
22
+ end
23
+
24
+ def ==(other)
25
+ self.class == other.class &&
26
+ self.left_expr == other.left_expr &&
27
+ self.right_expr == other.right_expr
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,66 @@
1
+ require 'gobstones/lang/literals/booleans'
2
+ require 'gobstones/lang/literals/colors'
3
+ require 'gobstones/lang/literals/directions'
4
+ require 'gobstones/modules/equal_by_class'
5
+
6
+ module Gobstones
7
+
8
+ module Lang
9
+
10
+ class TypeBoundFunc
11
+
12
+ include Gobstones::EqualByClass
13
+
14
+ end
15
+
16
+ class MinBool < TypeBoundFunc
17
+
18
+ def evaluate(context=nil)
19
+ False.new
20
+ end
21
+
22
+ end
23
+
24
+ class MaxBool < TypeBoundFunc
25
+
26
+ def evaluate(context=nil)
27
+ True.new
28
+ end
29
+
30
+ end
31
+
32
+ class MinColor < TypeBoundFunc
33
+
34
+ def evaluate(context=nil)
35
+ Azul.new
36
+ end
37
+
38
+ end
39
+
40
+ class MaxColor < TypeBoundFunc
41
+
42
+ def evaluate(context=nil)
43
+ Verde.new
44
+ end
45
+
46
+ end
47
+
48
+ class MinDir < TypeBoundFunc
49
+
50
+ def evaluate(context=nil)
51
+ Norte.new
52
+ end
53
+
54
+ end
55
+
56
+ class MaxDir < TypeBoundFunc
57
+
58
+ def evaluate(context=nil)
59
+ Oeste.new
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,31 @@
1
+ module Gobstones
2
+
3
+ module Lang
4
+
5
+ class VarName
6
+
7
+ attr_reader :name
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def ==(var)
14
+ self.class == var.class && self.name == var.name
15
+ end
16
+
17
+ alias eql? ==
18
+
19
+ def hash
20
+ @name.hash
21
+ end
22
+
23
+ def evaluate(context)
24
+ context.get self
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end