rley 0.7.03 → 0.7.08

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 (174) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +362 -62
  3. data/.travis.yml +6 -7
  4. data/CHANGELOG.md +20 -1
  5. data/LICENSE.txt +1 -1
  6. data/README.md +6 -7
  7. data/Rakefile +2 -0
  8. data/appveyor.yml +2 -4
  9. data/examples/NLP/benchmark_pico_en.rb +2 -0
  10. data/examples/NLP/engtagger.rb +193 -188
  11. data/examples/NLP/nano_eng/nano_en_demo.rb +2 -0
  12. data/examples/NLP/nano_eng/nano_grammar.rb +7 -5
  13. data/examples/NLP/pico_en_demo.rb +2 -0
  14. data/examples/data_formats/JSON/cli_options.rb +3 -1
  15. data/examples/data_formats/JSON/json_ast_builder.rb +14 -9
  16. data/examples/data_formats/JSON/json_ast_nodes.rb +14 -21
  17. data/examples/data_formats/JSON/json_demo.rb +2 -0
  18. data/examples/data_formats/JSON/json_grammar.rb +4 -2
  19. data/examples/data_formats/JSON/json_lexer.rb +10 -8
  20. data/examples/data_formats/JSON/json_minifier.rb +3 -1
  21. data/examples/general/calc_iter1/calc_ast_builder.rb +15 -10
  22. data/examples/general/calc_iter1/calc_ast_nodes.rb +25 -37
  23. data/examples/general/calc_iter1/calc_demo.rb +2 -0
  24. data/examples/general/calc_iter1/calc_grammar.rb +4 -2
  25. data/examples/general/calc_iter1/calc_lexer.rb +8 -4
  26. data/examples/general/calc_iter1/spec/calculator_spec.rb +7 -5
  27. data/examples/general/calc_iter2/calc_ast_builder.rb +7 -3
  28. data/examples/general/calc_iter2/calc_ast_nodes.rb +29 -43
  29. data/examples/general/calc_iter2/calc_demo.rb +2 -0
  30. data/examples/general/calc_iter2/calc_grammar.rb +5 -3
  31. data/examples/general/calc_iter2/calc_lexer.rb +13 -10
  32. data/examples/general/calc_iter2/spec/calculator_spec.rb +28 -26
  33. data/examples/general/left.rb +4 -2
  34. data/examples/general/right.rb +4 -2
  35. data/lib/rley.rb +2 -0
  36. data/lib/rley/base/base_parser.rb +2 -0
  37. data/lib/rley/base/dotted_item.rb +38 -41
  38. data/lib/rley/base/grm_items_builder.rb +2 -0
  39. data/lib/rley/constants.rb +5 -3
  40. data/lib/rley/engine.rb +22 -24
  41. data/lib/rley/formatter/asciitree.rb +6 -4
  42. data/lib/rley/formatter/base_formatter.rb +2 -0
  43. data/lib/rley/formatter/bracket_notation.rb +3 -8
  44. data/lib/rley/formatter/debug.rb +8 -6
  45. data/lib/rley/formatter/json.rb +4 -2
  46. data/lib/rley/gfg/call_edge.rb +3 -1
  47. data/lib/rley/gfg/edge.rb +7 -5
  48. data/lib/rley/gfg/end_vertex.rb +4 -6
  49. data/lib/rley/gfg/epsilon_edge.rb +3 -5
  50. data/lib/rley/gfg/grm_flow_graph.rb +31 -25
  51. data/lib/rley/gfg/item_vertex.rb +12 -22
  52. data/lib/rley/gfg/non_terminal_vertex.rb +6 -4
  53. data/lib/rley/gfg/return_edge.rb +2 -0
  54. data/lib/rley/gfg/scan_edge.rb +3 -1
  55. data/lib/rley/gfg/shortcut_edge.rb +4 -2
  56. data/lib/rley/gfg/start_vertex.rb +6 -8
  57. data/lib/rley/gfg/vertex.rb +47 -41
  58. data/lib/rley/lexical/token.rb +3 -1
  59. data/lib/rley/lexical/token_range.rb +8 -6
  60. data/lib/rley/parse_forest_visitor.rb +7 -5
  61. data/lib/rley/parse_rep/ast_base_builder.rb +11 -11
  62. data/lib/rley/parse_rep/cst_builder.rb +7 -4
  63. data/lib/rley/parse_rep/parse_forest_builder.rb +36 -25
  64. data/lib/rley/parse_rep/parse_forest_factory.rb +5 -3
  65. data/lib/rley/parse_rep/parse_rep_creator.rb +18 -13
  66. data/lib/rley/parse_rep/parse_tree_builder.rb +15 -15
  67. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -25
  68. data/lib/rley/parse_tree_visitor.rb +3 -1
  69. data/lib/rley/parser/error_reason.rb +9 -8
  70. data/lib/rley/parser/gfg_chart.rb +54 -22
  71. data/lib/rley/parser/gfg_earley_parser.rb +3 -1
  72. data/lib/rley/parser/gfg_parsing.rb +51 -31
  73. data/lib/rley/parser/parse_entry.rb +29 -33
  74. data/lib/rley/parser/parse_entry_set.rb +32 -27
  75. data/lib/rley/parser/parse_entry_tracker.rb +6 -4
  76. data/lib/rley/parser/parse_state.rb +18 -21
  77. data/lib/rley/parser/parse_state_tracker.rb +6 -4
  78. data/lib/rley/parser/parse_tracer.rb +15 -13
  79. data/lib/rley/parser/parse_walker_factory.rb +28 -29
  80. data/lib/rley/parser/state_set.rb +11 -10
  81. data/lib/rley/ptree/non_terminal_node.rb +10 -6
  82. data/lib/rley/ptree/parse_tree.rb +6 -4
  83. data/lib/rley/ptree/parse_tree_node.rb +7 -5
  84. data/lib/rley/ptree/terminal_node.rb +9 -7
  85. data/lib/rley/rley_error.rb +12 -10
  86. data/lib/rley/sppf/alternative_node.rb +8 -6
  87. data/lib/rley/sppf/composite_node.rb +9 -7
  88. data/lib/rley/sppf/epsilon_node.rb +5 -3
  89. data/lib/rley/sppf/leaf_node.rb +5 -3
  90. data/lib/rley/sppf/non_terminal_node.rb +2 -0
  91. data/lib/rley/sppf/parse_forest.rb +19 -17
  92. data/lib/rley/sppf/sppf_node.rb +9 -8
  93. data/lib/rley/sppf/token_node.rb +5 -3
  94. data/lib/rley/syntax/grammar.rb +7 -5
  95. data/lib/rley/syntax/grammar_builder.rb +11 -9
  96. data/lib/rley/syntax/grm_symbol.rb +8 -6
  97. data/lib/rley/syntax/literal.rb +2 -0
  98. data/lib/rley/syntax/non_terminal.rb +11 -15
  99. data/lib/rley/syntax/production.rb +13 -11
  100. data/lib/rley/syntax/symbol_seq.rb +10 -10
  101. data/lib/rley/syntax/terminal.rb +6 -5
  102. data/lib/rley/syntax/verbatim_symbol.rb +5 -3
  103. data/lib/support/base_tokenizer.rb +23 -20
  104. data/spec/rley/base/dotted_item_spec.rb +4 -2
  105. data/spec/rley/base/grm_items_builder_spec.rb +2 -0
  106. data/spec/rley/engine_spec.rb +47 -9
  107. data/spec/rley/formatter/asciitree_spec.rb +11 -9
  108. data/spec/rley/formatter/bracket_notation_spec.rb +16 -14
  109. data/spec/rley/formatter/debug_spec.rb +4 -2
  110. data/spec/rley/formatter/json_spec.rb +5 -3
  111. data/spec/rley/gfg/call_edge_spec.rb +2 -0
  112. data/spec/rley/gfg/edge_spec.rb +2 -0
  113. data/spec/rley/gfg/end_vertex_spec.rb +7 -5
  114. data/spec/rley/gfg/epsilon_edge_spec.rb +2 -0
  115. data/spec/rley/gfg/grm_flow_graph_spec.rb +2 -0
  116. data/spec/rley/gfg/item_vertex_spec.rb +12 -10
  117. data/spec/rley/gfg/non_terminal_vertex_spec.rb +5 -3
  118. data/spec/rley/gfg/return_edge_spec.rb +2 -0
  119. data/spec/rley/gfg/scan_edge_spec.rb +2 -0
  120. data/spec/rley/gfg/shortcut_edge_spec.rb +3 -1
  121. data/spec/rley/gfg/start_vertex_spec.rb +7 -5
  122. data/spec/rley/gfg/vertex_spec.rb +5 -3
  123. data/spec/rley/lexical/token_range_spec.rb +18 -16
  124. data/spec/rley/lexical/token_spec.rb +4 -2
  125. data/spec/rley/parse_forest_visitor_spec.rb +167 -163
  126. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +46 -44
  127. data/spec/rley/parse_rep/ast_builder_spec.rb +8 -6
  128. data/spec/rley/parse_rep/cst_builder_spec.rb +7 -5
  129. data/spec/rley/parse_rep/groucho_spec.rb +25 -25
  130. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +28 -26
  131. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +8 -6
  132. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +4 -2
  133. data/spec/rley/parse_tree_visitor_spec.rb +12 -8
  134. data/spec/rley/parser/error_reason_spec.rb +8 -6
  135. data/spec/rley/parser/gfg_chart_spec.rb +17 -4
  136. data/spec/rley/parser/gfg_earley_parser_spec.rb +16 -11
  137. data/spec/rley/parser/gfg_parsing_spec.rb +41 -252
  138. data/spec/rley/parser/parse_entry_set_spec.rb +2 -0
  139. data/spec/rley/parser/parse_entry_spec.rb +21 -19
  140. data/spec/rley/parser/parse_state_spec.rb +7 -5
  141. data/spec/rley/parser/parse_tracer_spec.rb +16 -14
  142. data/spec/rley/parser/parse_walker_factory_spec.rb +10 -8
  143. data/spec/rley/parser/state_set_spec.rb +24 -22
  144. data/spec/rley/ptree/non_terminal_node_spec.rb +7 -3
  145. data/spec/rley/ptree/parse_tree_node_spec.rb +6 -4
  146. data/spec/rley/ptree/parse_tree_spec.rb +2 -0
  147. data/spec/rley/ptree/terminal_node_spec.rb +8 -6
  148. data/spec/rley/sppf/alternative_node_spec.rb +8 -6
  149. data/spec/rley/sppf/non_terminal_node_spec.rb +5 -3
  150. data/spec/rley/sppf/token_node_spec.rb +6 -4
  151. data/spec/rley/support/ambiguous_grammar_helper.rb +5 -4
  152. data/spec/rley/support/expectation_helper.rb +2 -0
  153. data/spec/rley/support/grammar_abc_helper.rb +4 -4
  154. data/spec/rley/support/grammar_ambig01_helper.rb +6 -5
  155. data/spec/rley/support/grammar_arr_int_helper.rb +6 -5
  156. data/spec/rley/support/grammar_b_expr_helper.rb +6 -5
  157. data/spec/rley/support/grammar_helper.rb +2 -0
  158. data/spec/rley/support/grammar_l0_helper.rb +15 -16
  159. data/spec/rley/support/grammar_pb_helper.rb +8 -5
  160. data/spec/rley/support/grammar_sppf_helper.rb +3 -1
  161. data/spec/rley/syntax/grammar_builder_spec.rb +7 -5
  162. data/spec/rley/syntax/grammar_spec.rb +8 -6
  163. data/spec/rley/syntax/grm_symbol_spec.rb +3 -1
  164. data/spec/rley/syntax/literal_spec.rb +2 -0
  165. data/spec/rley/syntax/non_terminal_spec.rb +10 -8
  166. data/spec/rley/syntax/production_spec.rb +15 -13
  167. data/spec/rley/syntax/symbol_seq_spec.rb +4 -2
  168. data/spec/rley/syntax/terminal_spec.rb +7 -5
  169. data/spec/rley/syntax/verbatim_symbol_spec.rb +3 -1
  170. data/spec/spec_helper.rb +2 -12
  171. data/spec/support/base_tokenizer_spec.rb +9 -2
  172. metadata +21 -63
  173. data/.simplecov +0 -7
  174. data/Gemfile +0 -8
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
 
3
5
  require_relative '../../../lib/rley/syntax/terminal'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
 
3
5
  require_relative '../../../lib/rley/gfg/start_vertex'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
  require_relative '../../../lib/rley/syntax/non_terminal'
3
5
 
@@ -25,7 +27,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
25
27
  it 'should know the successor vertex' do
26
28
  expect(vertex1).to receive(:shortcut=)
27
29
  expect(vertex1).to receive(:next_symbol).and_return(nt_b_sequence)
28
-
30
+
29
31
  expect(subject.successor).to eq(vertex2)
30
32
  end
31
33
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
  require_relative '../../../lib/rley/syntax/non_terminal'
3
5
 
@@ -20,12 +22,12 @@ module Rley # Open this namespace to avoid module qualifier prefixes
20
22
  expect(subject.label).to eq('.NT')
21
23
  end
22
24
  end # context
23
-
24
- context 'Provided services:' do
25
+
26
+ context 'Provided services:' do
25
27
  it 'should provide human-readable representation of itself' do
26
- pattern = /^#<Rley::GFG::StartVertex:\d+ label="\.NT"/
27
- expect(subject.inspect).to match(pattern)
28
- end
28
+ pattern = /^#<Rley::GFG::StartVertex:\d+ label="\.NT"/
29
+ expect(subject.inspect).to match(pattern)
30
+ end
29
31
  end # context
30
32
  end # describe
31
33
  end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -22,10 +24,10 @@ module Rley # Open this namespace to avoid module qualifier prefixes
22
24
  it 'should know whether it has a dot at the end of the rhs' do
23
25
  expect(subject).not_to be_complete
24
26
  end
25
-
27
+
26
28
  it 'should know the previous symbol (if any) in the rhs' do
27
29
  expect(subject.prev_symbol).to be_nil
28
- end
30
+ end
29
31
 
30
32
  it 'should know the next symbol (if any) in the rhs' do
31
33
  expect(subject.next_symbol).to be_nil
@@ -38,7 +40,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
38
40
  expect { subject.add_edge(edge1) }.not_to raise_error
39
41
  expect(subject.edges.size).to eq(1)
40
42
  expect(subject.edges.last).to eq(edge1)
41
-
43
+
42
44
  err = StandardError
43
45
  msg = 'At most one edge accepted'
44
46
  expect { subject.add_edge(edge2) }.to raise_error err, msg
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -25,7 +27,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
25
27
  # Both bounds provided
26
28
  expect { TokenRange.new(low: 0, high: 5) }.not_to raise_error
27
29
  end
28
-
30
+
29
31
  it 'could be created with another TokenRange' do
30
32
  # Low bound provided
31
33
  instance = TokenRange.new(low: 0)
@@ -59,7 +61,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
59
61
  expect(subject == [0, 5]).to eq(true)
60
62
  end
61
63
 
62
-
64
+
63
65
  it 'should know whether it is bounded or not' do
64
66
  expect(subject).to be_bounded
65
67
 
@@ -117,50 +119,50 @@ module Rley # Open this namespace to avoid module qualifier prefixes
117
119
  expect(instance.low).to eq(1)
118
120
  expect(instance.high).to eq(4)
119
121
  end
120
-
122
+
121
123
  it 'should tell whether an index value lies outside the range' do
122
124
  # Out of range...
123
125
  expect(subject.out_of_range?(-1)).to eq(true)
124
126
  expect(subject.out_of_range?(6)).to eq(true)
125
-
127
+
126
128
  # On boundaries...
127
129
  expect(subject.out_of_range?(0)).to eq(false)
128
130
  expect(subject.out_of_range?(5)).to eq(false)
129
-
131
+
130
132
  # Inside boundaries
131
133
  expect(subject.out_of_range?(2)).to eq(false)
132
134
 
133
135
  instance = TokenRange.new(low: nil, high: 5)
134
-
136
+
135
137
  # Lower bound is nil
136
138
  expect(instance.out_of_range?(-1)).to eq(false)
137
139
  expect(instance.out_of_range?(5)).to eq(false)
138
140
  expect(instance.out_of_range?(6)).to eq(true)
139
-
141
+
140
142
  instance = TokenRange.new(low: 0, high: nil)
141
-
143
+
142
144
  # Upper bound is nil
143
145
  expect(instance.out_of_range?(-1)).to eq(true)
144
146
  expect(instance.out_of_range?(0)).to eq(false)
145
147
  expect(instance.out_of_range?(6)).to eq(false)
146
148
  end
147
-
149
+
148
150
  it 'should provide a text representation of itself' do
149
151
  # Case 1: not bound is set
150
152
  instance = TokenRange.new({})
151
- expect(instance.to_string(0)).to eq('[?, ?]')
152
-
153
+ expect(instance.to_string(0)).to eq('[?, ?]')
154
+
153
155
  # Case: only low bound is set
154
156
  instance = TokenRange.new(low: 0)
155
- expect(instance.to_string(0)).to eq('[0, ?]')
157
+ expect(instance.to_string(0)).to eq('[0, ?]')
156
158
 
157
159
  # Case: only upper bound is set
158
- instance = TokenRange.new(high: 5)
159
- expect(instance.to_string(0)).to eq('[?, 5]')
160
+ instance = TokenRange.new(high: 5)
161
+ expect(instance.to_string(0)).to eq('[?, 5]')
160
162
 
161
163
  # Case: both bounds are set
162
- instance = TokenRange.new(low: 0, high: 5)
163
- expect(instance.to_string(0)).to eq('[0, 5]')
164
+ instance = TokenRange.new(low: 0, high: 5)
165
+ expect(instance.to_string(0)).to eq('[0, 5]')
164
166
  end
165
167
  end
166
168
  end # describe
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
 
3
5
  require_relative '../../../lib/rley/syntax/terminal'
@@ -27,10 +29,10 @@ module Rley # Open this namespace to avoid module qualifier prefixes
27
29
  it 'should know its terminal' do
28
30
  expect(subject.terminal).to eq(a_terminal)
29
31
  end
30
-
32
+
31
33
  it 'should know its terminal' do
32
34
  expect(subject.position).to eq(a_pos)
33
- end
35
+ end
34
36
  end # context
35
37
  end # describe
36
38
  end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  require_relative './support/grammar_helper'
@@ -96,6 +98,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
96
98
  end
97
99
  end # context
98
100
 
101
+ # rubocop: disable Lint/ConstantDefinitionInBlock
99
102
  class EventDispatcher
100
103
  # return [Array<Proc>]
101
104
  attr_accessor(:expectations)
@@ -123,6 +126,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
123
126
  @event_count += 1
124
127
  end
125
128
  end # class
129
+ # rubocop: enable Lint/ConstantDefinitionInBlock
126
130
 
127
131
  context 'Notifying visit events:' do
128
132
  # expectations [Array<Array<Symbol, String>>]
@@ -159,329 +163,329 @@ module Rley # Open this namespace to avoid module qualifier prefixes
159
163
  # Notify subscribers when start the visit of the pforest
160
164
  # expect(listener1).to receive(:before_pforest).with(forest_root)
161
165
  checker.expectations = [
162
- ->(event, item) {
166
+ lambda do |event, item|
163
167
  check_event(event, item, [:before_pforest, grm_sppf_pforest1])
164
- },
165
- ->(event, item) {
168
+ end,
169
+ lambda do |event, item|
166
170
  check_event(event, item, [:before_non_terminal, 'Phi[0, 4]'])
167
- },
168
- ->(event, parent, children) {
171
+ end,
172
+ lambda do |event, parent, children|
169
173
  check_event(event, parent, [:before_subnodes, 'Phi[0, 4]'])
170
174
  expect(children.size).to eq(1)
171
- },
172
- ->(event, item) {
175
+ end,
176
+ lambda do |event, item|
173
177
  check_event(event, item, [:before_non_terminal, 'S[0, 4]'])
174
178
  check_legs(['S[0, 4]', 2]) # 2
175
179
  check_node_accesses(item, [2])
176
- },
177
- ->(event, parent, children) {
180
+ end,
181
+ lambda do |event, parent, children|
178
182
  check_event(event, parent, [:before_subnodes, 'S[0, 4]'])
179
183
  expect(children.size).to eq(2)
180
- },
181
- ->(event, item) {
184
+ end,
185
+ lambda do |event, item|
182
186
  prediction = 'Alt(S => a T .)[0, 4]'
183
187
  check_event(event, item, [:before_alternative, prediction])
184
188
  check_legs(['Alt(S => a T .)[0, 4]', 6]) # 2 * 3
185
189
  check_node_accesses(item, [6])
186
- },
187
- ->(event, parent, children) {
190
+ end,
191
+ lambda do |event, parent, children|
188
192
  prediction = 'Alt(S => a T .)[0, 4]'
189
193
  check_event(event, parent, [:before_subnodes, prediction])
190
194
  expect(children.size).to eq(2)
191
- },
192
- ->(event, item) {
195
+ end,
196
+ lambda do |event, item|
193
197
  check_event(event, item, [:before_terminal, 'a[0, 1]'])
194
- },
195
- ->(event, item) {
198
+ end,
199
+ lambda do |event, item|
196
200
  check_event(event, item, [:after_terminal, 'a[0, 1]'])
197
- },
198
- ->(event, item) {
201
+ end,
202
+ lambda do |event, item|
199
203
  check_event(event, item, [:before_non_terminal, 'T[1, 4]'])
200
204
  check_legs(['T[1, 4]', 66]) # 2 * 3 * 11
201
205
  check_node_accesses(item, [66])
202
- },
203
- ->(event, parent, children) {
206
+ end,
207
+ lambda do |event, parent, children|
204
208
  check_event(event, parent, [:before_subnodes, 'T[1, 4]'])
205
209
  expect(children.size).to eq(3)
206
- },
207
- ->(event, item) {
210
+ end,
211
+ lambda do |event, item|
208
212
  check_event(event, item, [:before_terminal, 'b[1, 2]'])
209
- },
210
- ->(event, item) {
213
+ end,
214
+ lambda do |event, item|
211
215
  check_event(event, item, [:after_terminal, 'b[1, 2]'])
212
- },
213
- ->(event, item) {
216
+ end,
217
+ lambda do |event, item|
214
218
  check_event(event, item, [:before_terminal, 'b[2, 3]'])
215
- },
216
- ->(event, item) {
219
+ end,
220
+ lambda do |event, item|
217
221
  check_event(event, item, [:after_terminal, 'b[2, 3]'])
218
- },
219
- ->(event, item) {
222
+ end,
223
+ lambda do |event, item|
220
224
  check_event(event, item, [:before_terminal, 'b[3, 4]'])
221
- },
222
- ->(event, item) {
225
+ end,
226
+ lambda do |event, item|
223
227
  check_event(event, item, [:after_terminal, 'b[3, 4]'])
224
- },
225
- ->(event, parent, _children) {
228
+ end,
229
+ lambda do |event, parent, _children|
226
230
  check_event(event, parent, [:after_subnodes, 'T[1, 4]'])
227
- },
228
- ->(event, item) {
231
+ end,
232
+ lambda do |event, item|
229
233
  check_event(event, item, [:after_non_terminal, 'T[1, 4]'])
230
- },
231
- ->(event, parent, children) {
234
+ end,
235
+ lambda do |event, parent, children|
232
236
  prediction = 'Alt(S => a T .)[0, 4]'
233
237
  check_event(event, parent, [:after_subnodes, prediction])
234
238
  expect(children.size).to eq(2)
235
239
  check_legs(['Alt(S => a T .)[0, 4]', 6]) # 2 * 3
236
- },
237
- ->(event, item) {
240
+ end,
241
+ lambda do |event, item|
238
242
  prediction = 'Alt(S => a T .)[0, 4]'
239
243
  check_event(event, item, [:after_alternative, prediction])
240
- },
241
- ->(event, item) {
244
+ end,
245
+ lambda do |event, item|
242
246
  prediction = 'Alt(S => A T .)[0, 4]'
243
247
  check_event(event, item, [:before_alternative, prediction])
244
248
  check_legs(['Alt(S => A T .)[0, 4]', 10]) # 2 * 5
245
249
  check_node_accesses(item, [10])
246
- },
247
- ->(event, parent, children) {
250
+ end,
251
+ lambda do |event, parent, children|
248
252
  prediction = 'Alt(S => A T .)[0, 4]'
249
253
  check_event(event, parent, [:before_subnodes, prediction])
250
254
  expect(children.size).to eq(2)
251
- },
252
- ->(event, item) {
255
+ end,
256
+ lambda do |event, item|
253
257
  check_event(event, item, [:before_non_terminal, 'A[0, 1]'])
254
258
  check_legs(['A[0, 1]', 230]) # 2 * 5 * 23
255
259
  check_node_accesses(item, [230])
256
- },
257
- ->(event, parent, children) {
260
+ end,
261
+ lambda do |event, parent, children|
258
262
  check_event(event, parent, [:before_subnodes, 'A[0, 1]'])
259
263
  expect(children.size).to eq(2)
260
- },
261
- ->(event, item) {
264
+ end,
265
+ lambda do |event, item|
262
266
  prediction = 'Alt(A => a .)[0, 1]'
263
267
  check_event(event, item, [:before_alternative, prediction])
264
268
  check_legs(['Alt(A => a .)[0, 1]', 7130]) # 2 * 5 * 23 * 31
265
269
  check_node_accesses(item, [7130])
266
270
  # p(subject.legs)
267
- },
268
- ->(event, parent, children) {
271
+ end,
272
+ lambda do |event, parent, children|
269
273
  prediction = 'Alt(A => a .)[0, 1]'
270
274
  check_event(event, parent, [:before_subnodes, prediction])
271
275
  expect(children.size).to eq(1)
272
- },
273
- ->(event, item) {
276
+ end,
277
+ lambda do |event, item|
274
278
  check_event(event, item, [:before_terminal, 'a[0, 1]'])
275
- },
276
- ->(event, item) {
279
+ end,
280
+ lambda do |event, item|
277
281
  check_event(event, item, [:after_terminal, 'a[0, 1]'])
278
- },
279
- ->(event, parent, _children) {
282
+ end,
283
+ lambda do |event, parent, _children|
280
284
  prediction = 'Alt(A => a .)[0, 1]'
281
285
  check_event(event, parent, [:after_subnodes, prediction])
282
286
  check_legs(['Alt(A => a .)[0, 1]', 7130]) # 2 * 5 * 23 * 31
283
- },
284
- ->(event, item) {
287
+ end,
288
+ lambda do |event, item|
285
289
  prediction = 'Alt(A => a .)[0, 1]'
286
290
  check_event(event, item, [:after_alternative, prediction])
287
- },
288
- ->(event, item) {
291
+ end,
292
+ lambda do |event, item|
289
293
  prediction = 'Alt(A => B A .)[0, 1]'
290
294
  check_event(event, item, [:before_alternative, prediction])
291
295
  check_legs(['Alt(A => B A .)[0, 1]', 8510]) # 2 * 5 * 23 * 37
292
296
  check_node_accesses(item, [8510])
293
- },
294
- ->(event, parent, children) {
297
+ end,
298
+ lambda do |event, parent, children|
295
299
  prediction = 'Alt(A => B A .)[0, 1]'
296
300
  check_event(event, parent, [:before_subnodes, prediction])
297
301
  expect(children.size).to eq(2)
298
- },
299
- ->(event, item) {
302
+ end,
303
+ lambda do |event, item|
300
304
  check_event(event, item, [:before_non_terminal, 'B[0, 0]'])
301
305
  check_legs(['B[0, 0]', 365930]) # 2 * 5 * 23 * 37 * 43
302
306
  check_node_accesses(item, [365930])
303
- },
304
- ->(event, parent, children) {
307
+ end,
308
+ lambda do |event, parent, children|
305
309
  check_event(event, parent, [:before_subnodes, 'B[0, 0]'])
306
310
  expect(children.size).to eq(1)
307
- },
308
- ->(event, item) {
311
+ end,
312
+ lambda do |event, item|
309
313
  check_event(event, item, [:before_epsilon, '_[0, 0]'])
310
- },
311
- ->(event, item) {
314
+ end,
315
+ lambda do |event, item|
312
316
  check_event(event, item, [:after_epsilon, '_[0, 0]'])
313
- },
314
- ->(event, parent, _children) {
317
+ end,
318
+ lambda do |event, parent, _children|
315
319
  check_event(event, parent, [:after_subnodes, 'B[0, 0]'])
316
320
  check_legs(['B[0, 0]', 365930]) # 2 * 5 * 23 * 37 * 43
317
- },
318
- ->(event, item) {
321
+ end,
322
+ lambda do |event, item|
319
323
  check_event(event, item, [:after_non_terminal, 'B[0, 0]'])
320
- },
321
- ->(event, item) {
324
+ end,
325
+ lambda do |event, item|
322
326
  check_event(event, item, [:before_non_terminal, 'A[0, 1]'])
323
327
  check_legs(['A[0, 1]', 399970]) # 2 * 5 * 23 * 37 * 47
324
328
  check_node_accesses(item, [230, 399970])
325
- },
326
- ->(event, parent, children) {
329
+ end,
330
+ lambda do |event, parent, children|
327
331
  check_event(event, parent, [:before_subnodes, 'A[0, 1]'])
328
332
  expect(children.size).to eq(2)
329
- },
330
- ->(event, item) {
333
+ end,
334
+ lambda do |event, item|
331
335
  prediction = 'Alt(A => a .)[0, 1]'
332
336
  check_event(event, item, [:before_alternative, prediction])
333
337
  # 12399070 = 2 * 5 * 23 * 37 * 47 * 31
334
338
  check_legs(['Alt(A => a .)[0, 1]', 12399070])
335
339
  check_node_accesses(item, [7130, 12399070])
336
- },
337
- ->(event, parent, children) {
340
+ end,
341
+ lambda do |event, parent, children|
338
342
  prediction = 'Alt(A => a .)[0, 1]'
339
343
  check_event(event, parent, [:before_subnodes, prediction])
340
344
  expect(children.size).to eq(1)
341
- },
342
- ->(event, item) {
345
+ end,
346
+ lambda do |event, item|
343
347
  check_event(event, item, [:before_terminal, 'a[0, 1]'])
344
- },
345
- ->(event, item) {
348
+ end,
349
+ lambda do |event, item|
346
350
  check_event(event, item, [:after_terminal, 'a[0, 1]'])
347
- },
348
- ->(event, parent, _children) {
351
+ end,
352
+ lambda do |event, parent, _children|
349
353
  check_event(event, parent, [:after_subnodes, 'Alt(A => a .)[0, 1]'])
350
354
  # 12399070 = 2 * 5 * 23 * 37 * 47 * 31
351
- check_legs(['Alt(A => a .)[0, 1]', 12399070])
352
- },
353
- ->(event, item) {
355
+ check_legs(['Alt(A => a .)[0, 1]', 12399070])
356
+ end,
357
+ lambda do |event, item|
354
358
  prediction = 'Alt(A => a .)[0, 1]'
355
359
  check_event(event, item, [:after_alternative, prediction])
356
- },
357
- ->(event, item) {
360
+ end,
361
+ lambda do |event, item|
358
362
  prediction = 'Alt(A => B A .)[0, 1]'
359
363
  check_event(event, item, [:before_alternative, prediction])
360
- # For prime factoring:
364
+ # For prime factoring:
361
365
  # https://www.calculatorsoup.com/calculators/math/prime-factors.php
362
366
  check_legs(['Alt(A => B A .)[0, 1]', 399970]) # 2 * 5 * 23 * 37 * 47
363
367
  check_node_accesses(item, [8510, 399970])
364
- },
365
- ->(event, parent, children) {
368
+ end,
369
+ lambda do |event, parent, children|
366
370
  prediction = 'Alt(A => B A .)[0, 1]'
367
371
  check_event(event, parent, [:before_subnodes, prediction])
368
372
  expect(children.size).to eq(2)
369
- },
370
- ->(event, item) {
373
+ end,
374
+ lambda do |event, item|
371
375
  check_event(event, item, [:before_non_terminal, 'B[0, 0]'])
372
376
  check_legs(['B[0, 0]', 17198710]) # 2 * 5 * 23 * 37 * 47 * 43
373
377
  check_node_accesses(item, [365930, 17198710])
374
- },
375
- ->(event, parent, children) {
378
+ end,
379
+ lambda do |event, parent, children|
376
380
  check_event(event, parent, [:before_subnodes, 'B[0, 0]'])
377
381
  expect(children.size).to eq(1)
378
- },
379
- ->(event, item) {
382
+ end,
383
+ lambda do |event, item|
380
384
  check_event(event, item, [:before_epsilon, '_[0, 0]'])
381
- },
382
- ->(event, item) {
385
+ end,
386
+ lambda do |event, item|
383
387
  check_event(event, item, [:after_epsilon, '_[0, 0]'])
384
- },
385
- ->(event, parent, _children) {
388
+ end,
389
+ lambda do |event, parent, _children|
386
390
  check_event(event, parent, [:after_subnodes, 'B[0, 0]'])
387
391
  check_legs(['B[0, 0]', 17198710]) # 2 * 5 * 23 * 37 * 43 * 47
388
- },
389
- ->(event, item) {
392
+ end,
393
+ lambda do |event, item|
390
394
  check_event(event, item, [:after_non_terminal, 'B[0, 0]'])
391
- },
392
- ->(event, parent, _children) {
395
+ end,
396
+ lambda do |event, parent, _children|
393
397
  prediction = 'Alt(A => B A .)[0, 1]'
394
398
  check_event(event, parent, [:after_subnodes, prediction])
395
399
  check_legs(['Alt(A => B A .)[0, 1]', 399970]) # 2 * 5 * 23 * 37 * 47
396
400
  check_node_accesses(parent, [8510, 399970])
397
- },
398
- ->(event, item) {
401
+ end,
402
+ lambda do |event, item|
399
403
  prediction = 'Alt(A => B A .)[0, 1]'
400
404
  check_event(event, item, [:after_alternative, prediction])
401
- },
402
- ->(event, parent, _children) {
405
+ end,
406
+ lambda do |event, parent, _children|
403
407
  check_event(event, parent, [:after_subnodes, 'A[0, 1]'])
404
408
  check_legs(['A[0, 1]', 399970]) # 2 * 5 * 23 * 37 * 47
405
- },
406
- ->(event, item) {
409
+ end,
410
+ lambda do |event, item|
407
411
  check_event(event, item, [:after_non_terminal, 'A[0, 1]'])
408
- },
409
- ->(event, parent, _children) {
412
+ end,
413
+ lambda do |event, parent, _children|
410
414
  prediction = 'Alt(A => B A .)[0, 1]'
411
415
  check_event(event, parent, [:after_subnodes, prediction])
412
416
  check_legs(['Alt(A => B A .)[0, 1]', 8510]) # 2 * 5 * 23 * 37
413
- },
414
- ->(event, item) {
417
+ end,
418
+ lambda do |event, item|
415
419
  prediction = 'Alt(A => B A .)[0, 1]'
416
420
  check_event(event, item, [:after_alternative, prediction])
417
- },
418
- ->(event, parent, _children) {
421
+ end,
422
+ lambda do |event, parent, _children|
419
423
  check_event(event, parent, [:after_subnodes, 'A[0, 1]'])
420
424
  check_legs(['A[0, 1]', 230]) # 2 * 5 * 23
421
- },
422
- ->(event, item) {
425
+ end,
426
+ lambda do |event, item|
423
427
  check_event(event, item, [:after_non_terminal, 'A[0, 1]'])
424
- },
425
- ->(event, item) {
428
+ end,
429
+ lambda do |event, item|
426
430
  check_event(event, item, [:before_non_terminal, 'T[1, 4]'])
427
431
  check_legs(['T[1, 4]', 290]) # 2 * 5 * 29
428
432
  check_node_accesses(item, [66, 290])
429
- },
430
- ->(event, parent, children) {
433
+ end,
434
+ lambda do |event, parent, children|
431
435
  check_event(event, parent, [:before_subnodes, 'T[1, 4]'])
432
436
  expect(children.size).to eq(3)
433
- },
434
- ->(event, item) {
437
+ end,
438
+ lambda do |event, item|
435
439
  check_event(event, item, [:before_terminal, 'b[1, 2]'])
436
- },
437
- ->(event, item) {
440
+ end,
441
+ lambda do |event, item|
438
442
  check_event(event, item, [:after_terminal, 'b[1, 2]'])
439
- },
440
- ->(event, item) {
443
+ end,
444
+ lambda do |event, item|
441
445
  check_event(event, item, [:before_terminal, 'b[2, 3]'])
442
- },
443
- ->(event, item) {
446
+ end,
447
+ lambda do |event, item|
444
448
  check_event(event, item, [:after_terminal, 'b[2, 3]'])
445
- },
446
- ->(event, item) {
449
+ end,
450
+ lambda do |event, item|
447
451
  check_event(event, item, [:before_terminal, 'b[3, 4]'])
448
- },
449
- ->(event, item) {
452
+ end,
453
+ lambda do |event, item|
450
454
  check_event(event, item, [:after_terminal, 'b[3, 4]'])
451
- },
452
- ->(event, parent, _children) {
455
+ end,
456
+ lambda do |event, parent, _children|
453
457
  check_event(event, parent, [:after_subnodes, 'T[1, 4]'])
454
- },
455
- ->(event, item) {
458
+ end,
459
+ lambda do |event, item|
456
460
  check_event(event, item, [:after_non_terminal, 'T[1, 4]'])
457
- },
458
- ->(event, parent, children) {
461
+ end,
462
+ lambda do |event, parent, children|
459
463
  prediction = 'Alt(S => A T .)[0, 4]'
460
464
  check_event(event, parent, [:after_subnodes, prediction])
461
465
  expect(children.size).to eq(2)
462
466
  check_legs(['Alt(S => A T .)[0, 4]', 10]) # 2 * 5
463
- },
464
- ->(evt, itm) {
465
- check_event(evt, itm, [:after_alternative, 'Alt(S => A T .)[0, 4]'])
466
- },
467
- ->(event, parent, children) {
467
+ end,
468
+ lambda do |event, item|
469
+ check_event(event, item, [:after_alternative, 'Alt(S => A T .)[0, 4]'])
470
+ end,
471
+ lambda do |event, parent, children|
468
472
  check_event(event, parent, [:after_subnodes, 'S[0, 4]'])
469
473
  expect(children.size).to eq(2)
470
474
  check_legs(['S[0, 4]', 2]) # 2
471
- },
472
- ->(event, item) {
475
+ end,
476
+ lambda do |event, item|
473
477
  check_event(event, item, [:after_non_terminal, 'S[0, 4]'])
474
- },
475
- ->(event, parent, children) {
478
+ end,
479
+ lambda do |event, parent, children|
476
480
  check_event(event, parent, [:after_subnodes, 'Phi[0, 4]'])
477
481
  expect(children.size).to eq(1)
478
- },
479
- ->(event, item) {
482
+ end,
483
+ lambda do |event, item|
480
484
  check_event(event, item, [:after_non_terminal, 'Phi[0, 4]'])
481
- },
482
- ->(event, item) {
485
+ end,
486
+ lambda do |event, item|
483
487
  check_event(event, item, [:after_pforest, grm_sppf_pforest1])
484
- }
488
+ end
485
489
  ]
486
490
  subject.start
487
491
  end