rley 0.7.07 → 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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +348 -54
  3. data/LICENSE.txt +1 -1
  4. data/README.md +3 -2
  5. data/examples/NLP/engtagger.rb +193 -190
  6. data/examples/NLP/nano_eng/nano_grammar.rb +5 -5
  7. data/examples/data_formats/JSON/cli_options.rb +1 -1
  8. data/examples/data_formats/JSON/json_ast_builder.rb +12 -9
  9. data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
  10. data/examples/data_formats/JSON/json_grammar.rb +2 -2
  11. data/examples/data_formats/JSON/json_lexer.rb +8 -8
  12. data/examples/data_formats/JSON/json_minifier.rb +1 -1
  13. data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
  14. data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
  15. data/examples/general/calc_iter1/calc_grammar.rb +2 -2
  16. data/examples/general/calc_iter1/calc_lexer.rb +6 -4
  17. data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
  18. data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
  19. data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
  20. data/examples/general/calc_iter2/calc_grammar.rb +3 -3
  21. data/examples/general/calc_iter2/calc_lexer.rb +11 -10
  22. data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
  23. data/examples/general/left.rb +2 -2
  24. data/examples/general/right.rb +2 -2
  25. data/lib/rley/base/dotted_item.rb +23 -31
  26. data/lib/rley/constants.rb +2 -2
  27. data/lib/rley/engine.rb +20 -23
  28. data/lib/rley/formatter/asciitree.rb +3 -3
  29. data/lib/rley/formatter/bracket_notation.rb +1 -8
  30. data/lib/rley/formatter/debug.rb +6 -6
  31. data/lib/rley/formatter/json.rb +2 -2
  32. data/lib/rley/gfg/call_edge.rb +1 -1
  33. data/lib/rley/gfg/edge.rb +5 -5
  34. data/lib/rley/gfg/end_vertex.rb +2 -6
  35. data/lib/rley/gfg/epsilon_edge.rb +1 -5
  36. data/lib/rley/gfg/grm_flow_graph.rb +27 -23
  37. data/lib/rley/gfg/item_vertex.rb +10 -10
  38. data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
  39. data/lib/rley/gfg/scan_edge.rb +1 -1
  40. data/lib/rley/gfg/shortcut_edge.rb +2 -2
  41. data/lib/rley/gfg/start_vertex.rb +4 -8
  42. data/lib/rley/gfg/vertex.rb +43 -39
  43. data/lib/rley/lexical/token_range.rb +6 -6
  44. data/lib/rley/parse_forest_visitor.rb +5 -5
  45. data/lib/rley/parse_rep/ast_base_builder.rb +9 -11
  46. data/lib/rley/parse_rep/cst_builder.rb +5 -6
  47. data/lib/rley/parse_rep/parse_forest_builder.rb +20 -18
  48. data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
  49. data/lib/rley/parse_rep/parse_rep_creator.rb +11 -13
  50. data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
  51. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
  52. data/lib/rley/parse_tree_visitor.rb +1 -1
  53. data/lib/rley/parser/error_reason.rb +4 -5
  54. data/lib/rley/parser/gfg_chart.rb +20 -22
  55. data/lib/rley/parser/gfg_parsing.rb +16 -30
  56. data/lib/rley/parser/parse_entry.rb +25 -31
  57. data/lib/rley/parser/parse_entry_set.rb +18 -15
  58. data/lib/rley/parser/parse_entry_tracker.rb +4 -4
  59. data/lib/rley/parser/parse_state.rb +16 -21
  60. data/lib/rley/parser/parse_state_tracker.rb +4 -4
  61. data/lib/rley/parser/parse_tracer.rb +13 -13
  62. data/lib/rley/parser/parse_walker_factory.rb +23 -28
  63. data/lib/rley/parser/state_set.rb +9 -10
  64. data/lib/rley/ptree/non_terminal_node.rb +7 -5
  65. data/lib/rley/ptree/parse_tree.rb +3 -3
  66. data/lib/rley/ptree/parse_tree_node.rb +5 -5
  67. data/lib/rley/ptree/terminal_node.rb +7 -7
  68. data/lib/rley/rley_error.rb +12 -12
  69. data/lib/rley/sppf/alternative_node.rb +6 -6
  70. data/lib/rley/sppf/composite_node.rb +7 -7
  71. data/lib/rley/sppf/epsilon_node.rb +3 -3
  72. data/lib/rley/sppf/leaf_node.rb +3 -3
  73. data/lib/rley/sppf/parse_forest.rb +16 -16
  74. data/lib/rley/sppf/sppf_node.rb +7 -8
  75. data/lib/rley/sppf/token_node.rb +3 -3
  76. data/lib/rley/syntax/grammar.rb +5 -5
  77. data/lib/rley/syntax/grammar_builder.rb +9 -9
  78. data/lib/rley/syntax/grm_symbol.rb +6 -6
  79. data/lib/rley/syntax/non_terminal.rb +9 -15
  80. data/lib/rley/syntax/production.rb +10 -10
  81. data/lib/rley/syntax/symbol_seq.rb +7 -9
  82. data/lib/rley/syntax/terminal.rb +4 -5
  83. data/lib/rley/syntax/verbatim_symbol.rb +3 -3
  84. data/lib/support/base_tokenizer.rb +19 -18
  85. data/spec/rley/base/dotted_item_spec.rb +2 -2
  86. data/spec/rley/engine_spec.rb +17 -15
  87. data/spec/rley/formatter/asciitree_spec.rb +7 -7
  88. data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
  89. data/spec/rley/formatter/json_spec.rb +1 -1
  90. data/spec/rley/gfg/end_vertex_spec.rb +5 -5
  91. data/spec/rley/gfg/item_vertex_spec.rb +10 -10
  92. data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
  93. data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
  94. data/spec/rley/gfg/start_vertex_spec.rb +5 -5
  95. data/spec/rley/gfg/vertex_spec.rb +3 -3
  96. data/spec/rley/lexical/token_range_spec.rb +16 -16
  97. data/spec/rley/lexical/token_spec.rb +2 -2
  98. data/spec/rley/parse_forest_visitor_spec.rb +165 -163
  99. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
  100. data/spec/rley/parse_rep/ast_builder_spec.rb +6 -6
  101. data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
  102. data/spec/rley/parse_rep/groucho_spec.rb +21 -21
  103. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +26 -26
  104. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +6 -6
  105. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +2 -2
  106. data/spec/rley/parse_tree_visitor_spec.rb +10 -8
  107. data/spec/rley/parser/error_reason_spec.rb +6 -6
  108. data/spec/rley/parser/gfg_earley_parser_spec.rb +4 -2
  109. data/spec/rley/parser/gfg_parsing_spec.rb +4 -8
  110. data/spec/rley/parser/parse_entry_spec.rb +19 -19
  111. data/spec/rley/parser/parse_state_spec.rb +5 -5
  112. data/spec/rley/parser/parse_walker_factory_spec.rb +1 -1
  113. data/spec/rley/parser/state_set_spec.rb +22 -22
  114. data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
  115. data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
  116. data/spec/rley/ptree/terminal_node_spec.rb +6 -6
  117. data/spec/rley/sppf/alternative_node_spec.rb +6 -6
  118. data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
  119. data/spec/rley/sppf/token_node_spec.rb +4 -4
  120. data/spec/rley/support/ambiguous_grammar_helper.rb +3 -4
  121. data/spec/rley/support/grammar_abc_helper.rb +2 -4
  122. data/spec/rley/support/grammar_ambig01_helper.rb +4 -5
  123. data/spec/rley/support/grammar_arr_int_helper.rb +4 -5
  124. data/spec/rley/support/grammar_b_expr_helper.rb +4 -5
  125. data/spec/rley/support/grammar_l0_helper.rb +10 -11
  126. data/spec/rley/support/grammar_pb_helper.rb +6 -5
  127. data/spec/rley/support/grammar_sppf_helper.rb +1 -1
  128. data/spec/rley/syntax/grammar_builder_spec.rb +5 -5
  129. data/spec/rley/syntax/grammar_spec.rb +6 -6
  130. data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
  131. data/spec/rley/syntax/non_terminal_spec.rb +8 -8
  132. data/spec/rley/syntax/production_spec.rb +13 -13
  133. data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
  134. data/spec/rley/syntax/terminal_spec.rb +5 -5
  135. data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
  136. data/spec/spec_helper.rb +0 -12
  137. data/spec/support/base_tokenizer_spec.rb +7 -2
  138. metadata +21 -62
  139. data/.simplecov +0 -8
@@ -25,12 +25,12 @@ module Rley # Open this namespace to avoid module qualifier prefixes
25
25
  builder = Syntax::GrammarBuilder.new do
26
26
  add_terminals('a', 'b')
27
27
  rule 'Phi' => 'S'
28
- rule 'S' => %w[A T]
29
- rule 'S' => %w[a T]
28
+ rule 'S' => 'A T'
29
+ rule 'S' => 'a T'
30
30
  rule 'A' => 'a'
31
- rule 'A' => %w[B A]
31
+ rule 'A' => 'B A'
32
32
  rule 'B' => []
33
- rule 'T' => %w[b b b]
33
+ rule 'T' => 'b b b'
34
34
  end
35
35
  builder.grammar
36
36
  end
@@ -49,11 +49,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
49
49
  end
50
50
 
51
51
  # Emit a text representation of the current path.
52
- def path_to_s()
52
+ def path_to_s
53
53
  text_parts = subject.curr_path.map do |path_element|
54
54
  path_element.to_string(0)
55
55
  end
56
- return text_parts.join('/')
56
+ text_parts.join('/')
57
57
  end
58
58
 
59
59
  context 'Initialization:' do
@@ -38,11 +38,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
38
38
  end
39
39
 
40
40
  # Emit a text representation of the current path.
41
- def path_to_s()
41
+ def path_to_s
42
42
  text_parts = subject.curr_path.map do |path_element|
43
43
  path_element.to_string(0)
44
44
  end
45
- return text_parts.join('/')
45
+ text_parts.join('/')
46
46
  end
47
47
 
48
48
 
@@ -11,7 +11,7 @@ require_relative './support/grammar_sppf_helper'
11
11
  require_relative '../../lib/rley/parse_tree_visitor'
12
12
 
13
13
  module Rley # Open this namespace to avoid module qualifier prefixes
14
- describe ParseTreeVisitor do
14
+ describe ParseTreeVisitor do
15
15
  let(:grammar_abc) do
16
16
  sandbox = Object.new
17
17
  sandbox.extend(GrammarABCHelper)
@@ -45,7 +45,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
45
45
  # Capital letters represent non-terminal nodes
46
46
  let(:grm_abc_ptree1) do
47
47
  engine = Rley::Engine.new
48
- engine.use_grammar(grammar_abc)
48
+ engine.use_grammar(grammar_abc)
49
49
  parse_result = engine.parse(grm_abc_tokens1)
50
50
  ptree = engine.convert(parse_result)
51
51
  ptree
@@ -161,6 +161,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
161
161
  subject.end_visit_ptree(grm_abc_ptree1)
162
162
  end
163
163
 
164
+ # rubocop: disable Naming/VariableNumber
164
165
  it 'should begin the visit when requested' do
165
166
  # Reminder: parse tree structure is
166
167
  # S[0,5]
@@ -209,11 +210,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
209
210
  expectations.each do |(msg, args)|
210
211
  expect(listener1).to receive(msg).with(*args).ordered
211
212
  end
212
-
213
+
213
214
  # Here we go...
214
215
  subject.start
215
216
  end
216
-
217
+
217
218
  it 'should also visit in pre-order' do
218
219
  # Reminder: parse tree structure is
219
220
  # S[0,5]
@@ -228,7 +229,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
228
229
  root = grm_abc_ptree1.root
229
230
  # Here we defeat encapsulation for the good cause
230
231
  subject.instance_variable_set(:@traversal, :pre_order)
231
-
232
+
232
233
  children = root.subnodes
233
234
  big_a_1 = children[0]
234
235
  big_a_1_children = big_a_1.subnodes
@@ -239,7 +240,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
239
240
  expectations = [
240
241
  [:before_ptree, [grm_abc_ptree1]]
241
242
  # TODO: fix this test
242
- # [:before_subnodes, [root, children]],
243
+ # [:before_subnodes, [root, children]],
243
244
  # [:before_non_terminal, [root]],
244
245
 
245
246
  # [:before_non_terminal, [big_a_1]],
@@ -267,10 +268,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
267
268
  expectations.each do |(msg, args)|
268
269
  expect(listener1).to receive(msg).with(*args).ordered
269
270
  end
270
-
271
+
271
272
  # Here we go...
272
273
  subject.start
273
- end
274
+ end
275
+ # rubocop: enable Naming/VariableNumber
274
276
  end # context
275
277
  end # describe
276
278
  end # module
@@ -46,8 +46,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
46
46
 
47
47
  context 'Initialization:' do
48
48
  it 'should be created with arguments' do
49
- expect do
50
- ExpectationNotMet.new(3, err_token, terminals)
49
+ expect do
50
+ ExpectationNotMet.new(3, err_token, terminals)
51
51
  end.not_to raise_error
52
52
  end
53
53
 
@@ -75,8 +75,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
75
75
 
76
76
  context 'Initialization:' do
77
77
  it 'should be created with arguments' do
78
- expect do
79
- UnexpectedToken.new(3, err_token, terminals)
78
+ expect do
79
+ UnexpectedToken.new(3, err_token, terminals)
80
80
  end.not_to raise_error
81
81
  end
82
82
  end # context
@@ -107,8 +107,8 @@ MESSAGE_END
107
107
 
108
108
  context 'Initialization:' do
109
109
  it 'should be created with arguments' do
110
- expect do
111
- PrematureInputEnd.new(3, err_token, terminals)
110
+ expect do
111
+ PrematureInputEnd.new(3, err_token, terminals)
112
112
  end.not_to raise_error
113
113
  end
114
114
  end # context
@@ -71,7 +71,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
71
71
 
72
72
  # Helper method that mimicks the output of a tokenizer
73
73
  # for the language specified by grammar_expr
74
- def grm2_tokens()
74
+ def grm2_tokens
75
75
  input_sequence = [
76
76
  { '2' => 'integer' },
77
77
  '+',
@@ -79,7 +79,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
79
79
  '*',
80
80
  { '4' => 'integer' }
81
81
  ]
82
- return build_token_sequence(input_sequence, grammar_expr)
82
+ build_token_sequence(input_sequence, grammar_expr)
83
83
  end
84
84
 
85
85
  # Default instantiation rule
@@ -104,6 +104,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
104
104
  end # context
105
105
 
106
106
  context 'Parsing: ' do
107
+ # rubocop: disable Naming/VariableNumber
107
108
  it 'should parse a valid simple input' do
108
109
  parse_result = subject.parse(grm1_tokens)
109
110
  expect(parse_result.success?).to eq(true)
@@ -183,6 +184,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
183
184
  expect(entry_set_5.entries.size).to eq(4)
184
185
  compare_entry_texts(entry_set_5, expected)
185
186
  end
187
+ # rubocop: enable Naming/VariableNumber
186
188
 
187
189
  it 'should parse a valid simple expression' do
188
190
  instance = GFGEarleyParser.new(grammar_expr)
@@ -95,14 +95,14 @@ SNIPPET
95
95
 
96
96
  context 'Parsing:' do
97
97
  # Utility method to fill the first entry set...
98
- def fill_first_set()
98
+ def fill_first_set
99
99
  subject.start_rule(subject.initial_entry, 0)
100
100
  subject.call_rule(subject.chart[0].last, 0)
101
101
  subject.start_rule(subject.chart[0].last, 0)
102
102
  end
103
103
 
104
104
  # Utility method to initialize the second entry set...
105
- def seed_second_set()
105
+ def seed_second_set
106
106
  # Cheating: we change the tokens to scan...
107
107
  # Seeding second entry set...
108
108
  subject.scan_rule(0, grm1_token_b[0])
@@ -301,8 +301,8 @@ SNIPPET
301
301
  it 'should give a text representation of itself' do
302
302
  repr = subject.to_s
303
303
  expect(repr).to match(/^success\? true/)
304
-
305
- # Let's test the last chart state only
304
+
305
+ # Let's test the last chart state only
306
306
  expectation = <<REPR
307
307
  State[5]
308
308
  T => integer . | 4
@@ -338,10 +338,6 @@ REPR
338
338
  it 'should indicate whether a parse succeeded' do
339
339
  expect(subject.success?).to be_truthy
340
340
  end
341
-
342
- it 'should build a parse forest' do
343
- expect { subject.parse_forest }.not_to raise_error if subject.success?
344
- end
345
341
  end # context
346
342
  end # describe
347
343
  end # module
@@ -52,7 +52,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
52
52
  it 'should know the origin value' do
53
53
  expect(subject.origin).to eq(origin_val)
54
54
  end
55
-
55
+
56
56
  it 'should have not antecedent at creation' do
57
57
  expect(subject.antecedents).to be_empty
58
58
  expect(subject).to be_orphan
@@ -91,13 +91,13 @@ module Rley # Open this namespace to avoid module qualifier prefixes
91
91
  instance = ParseEntry.new(GFG::EndVertex.new('NT.'), 3)
92
92
  expect(instance).to be_end_entry
93
93
  end
94
-
94
+
95
95
  it 'should know if the entry is a dotted item vertex' do
96
96
  expect(subject).not_to be_dotted_entry
97
97
 
98
98
  instance = ParseEntry.new(GFG::ItemVertex.new('P => S.'), 3)
99
99
  expect(instance).to be_dotted_entry
100
- end
100
+ end
101
101
 
102
102
  it 'should know if the vertex is at end of production (if any)' do
103
103
  # Case: start vertex
@@ -120,7 +120,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
120
120
  instance4 = ParseEntry.new(v2, 3)
121
121
  expect(instance4).to be_exit_entry
122
122
  end
123
-
123
+
124
124
  it 'should know if the vertex is at begin of production (if any)' do
125
125
  # Case: start vertex
126
126
  instance1 = ParseEntry.new(GFG::StartVertex.new('.NT'), 3)
@@ -131,17 +131,17 @@ module Rley # Open this namespace to avoid module qualifier prefixes
131
131
  expect(instance2).not_to be_entry_entry
132
132
 
133
133
  # Case: item vertex not at begin of rhs
134
- d1 = Base::DottedItem.new(sample_prod, 1)
134
+ d1 = Base::DottedItem.new(sample_prod, 1)
135
135
  v1 = GFG::ItemVertex.new(d1)
136
136
  instance3 = ParseEntry.new(v1, 3)
137
137
  expect(instance3).not_to be_entry_entry
138
138
 
139
139
  # Case: item vertex at end of rhs
140
- d2 = Base::DottedItem.new(sample_prod, 0)
141
- v2 = GFG::ItemVertex.new(d2)
140
+ d2 = Base::DottedItem.new(sample_prod, 0)
141
+ v2 = GFG::ItemVertex.new(d2)
142
142
  instance4 = ParseEntry.new(v2, 3)
143
143
  expect(instance4).to be_entry_entry
144
- end
144
+ end
145
145
 
146
146
  it 'should know the symbol before the dot (if any)' do
147
147
  # Case: start vertex
@@ -151,20 +151,20 @@ module Rley # Open this namespace to avoid module qualifier prefixes
151
151
  # Case: end vertex
152
152
  instance2 = ParseEntry.new(GFG::EndVertex.new('NT.'), 3)
153
153
  expect(instance2.prev_symbol).to be_nil # Really correct?
154
-
154
+
155
155
  # Case: item vertex not at start of rhs
156
156
  v1 = double('vertex-not-at-start')
157
157
  expect(v1).to receive(:prev_symbol).and_return('symbol')
158
158
  instance3 = ParseEntry.new(v1, 3)
159
- expect(instance3.prev_symbol).to eq('symbol')
159
+ expect(instance3.prev_symbol).to eq('symbol')
160
160
 
161
161
  # Case: item vertex at start of rhs
162
162
  v2 = double('vertex-at-start')
163
163
  expect(v2).to receive(:prev_symbol).and_return(nil)
164
164
  instance4 = ParseEntry.new(v2, 0)
165
- expect(instance4.prev_symbol).to be_nil
165
+ expect(instance4.prev_symbol).to be_nil
166
166
  end
167
-
167
+
168
168
  it 'should know the next expected symbol (if any)' do
169
169
  # Case: start vertex
170
170
  instance1 = ParseEntry.new(GFG::StartVertex.new('.NT'), 3)
@@ -173,19 +173,19 @@ module Rley # Open this namespace to avoid module qualifier prefixes
173
173
  # Case: end vertex
174
174
  instance2 = ParseEntry.new(GFG::EndVertex.new('NT.'), 3)
175
175
  expect(instance2.next_symbol).to be_nil
176
-
176
+
177
177
  # Case: item vertex not at end of rhs
178
178
  v1 = double('vertex-not-at-end')
179
179
  expect(v1).to receive(:next_symbol).and_return('symbol')
180
180
  instance3 = ParseEntry.new(v1, 3)
181
- expect(instance3.next_symbol).to eq('symbol')
181
+ expect(instance3.next_symbol).to eq('symbol')
182
182
 
183
183
  # Case: item vertex at end of rhs
184
184
  v2 = double('vertex-at-end')
185
185
  expect(v2).to receive(:next_symbol).and_return(nil)
186
186
  instance4 = ParseEntry.new(v2, 3)
187
- expect(instance4.next_symbol).to be_nil
188
- end
187
+ expect(instance4.next_symbol).to be_nil
188
+ end
189
189
 
190
190
  it 'should accept antecedents' do
191
191
  antecedent = ParseEntry.new(vertex2, origin_val)
@@ -198,7 +198,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
198
198
  expected = '.sentence | 3'
199
199
  expect(subject.to_s).to eq(expected)
200
200
  end
201
-
201
+
202
202
  it 'should be inspectable' do
203
203
  subject.add_antecedent(subject) # Cheat for the good cause...
204
204
  # expected = '.sentence | 3'
@@ -209,8 +209,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
209
209
  pattern2 = /@origin=3 @antecedents=\[/
210
210
  expect(subject.inspect).to match(pattern2)
211
211
  suffix = /<Rley::GFG::StartVertex:\d+ label=\.sentence> @origin=3\]>$/
212
- expect(subject.inspect).to match(suffix)
213
- end
212
+ expect(subject.inspect).to match(suffix)
213
+ end
214
214
  end # context
215
215
  end # describe
216
216
  end # module
@@ -63,7 +63,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
63
63
  item = Base::DottedItem.new(aProd, aRank)
64
64
  ParseState.new(item, aVal)
65
65
  end
66
-
66
+
67
67
  it 'should compare with itself' do
68
68
  synonym = subject # Fool Rubocop
69
69
  expect(subject == synonym).to eq(true)
@@ -81,14 +81,14 @@ module Rley # Open this namespace to avoid module qualifier prefixes
81
81
  diff_rule = ParseState.new(other_dotted_rule, 3)
82
82
  expect(subject == diff_rule).to eq(false)
83
83
  end
84
-
84
+
85
85
  it 'should know if the parsing is at the start of the production' do
86
86
  expect(subject).not_to be_predicted
87
87
  at_start = Base::DottedItem.new(sample_prod, 0)
88
88
 
89
89
  instance = ParseState.new(at_start, 0)
90
90
  expect(instance).to be_predicted
91
- end
91
+ end
92
92
 
93
93
  it 'should know if the parsing reached the end of the production' do
94
94
  expect(subject).not_to be_complete
@@ -101,7 +101,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
101
101
  it 'should know the next expected symbol' do
102
102
  expect(subject.next_symbol).to eq(t_c)
103
103
  end
104
-
104
+
105
105
  it 'should know whether another instance follows this one' do
106
106
  expect(subject.precedes?(subject)).to eq(false)
107
107
  state1 = new_parse_state(sample_prod, 1, origin_val)
@@ -112,7 +112,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
112
112
  state3 = new_parse_state(sample_prod, 3, origin_val)
113
113
  expect(state3.precedes?(state0)).to eq(false)
114
114
  end
115
-
115
+
116
116
  it 'should know its text representation' do
117
117
  expected = 'sentence => A B . C | 3'
118
118
  expect(subject.to_s).to eq(expected)
@@ -303,7 +303,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
303
303
  event18 = walker.next
304
304
  expectations = [:revisit, 'T. | 1', 4]
305
305
  event_expectations(event18, expectations)
306
-
306
+
307
307
  # Lazy walk: make start entry .T the current one
308
308
  # Multiple visit occurred: jump to antecedent of start entry
309
309
  event19 = walker.next
@@ -19,7 +19,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
19
19
  it 'should be created without argument' do
20
20
  expect { StateSet.new }.not_to raise_error
21
21
  end
22
-
22
+
23
23
  it 'should be empty at creation' do
24
24
  expect(subject.states).to be_empty
25
25
  end
@@ -33,19 +33,19 @@ module Rley # Open this namespace to avoid module qualifier prefixes
33
33
  subject.push_state(state2)
34
34
  expect(subject.states).to eq([state1, state2])
35
35
  end
36
-
36
+
37
37
  it 'should ignore a second push of a state' do
38
38
  expect(subject.states).to be_empty
39
39
  subject.push_state(state1)
40
40
  subject.push_state(state2)
41
41
  expect(subject.states).to eq([state1, state2])
42
-
42
+
43
43
  # One tries to push an already pushed state
44
44
  expect(subject.push_state(state1)).to be_falsy
45
-
45
+
46
46
  # ...It is not added
47
- expect(subject.states).to eq([state1, state2])
48
- end
47
+ expect(subject.states).to eq([state1, state2])
48
+ end
49
49
 
50
50
  it 'should list the states expecting a given terminal' do
51
51
  # Case of no state
@@ -73,52 +73,52 @@ module Rley # Open this namespace to avoid module qualifier prefixes
73
73
  expect(dotted_rule2).to receive(:production).and_return(a_prod)
74
74
  expect(subject.states_for(a_prod)).to eq([state2])
75
75
  end
76
-
76
+
77
77
  it 'should list the states that rewrite a given non-terminal' do
78
78
  non_term = double('fake-non-terminal')
79
79
  prod1 = double('fake-production1')
80
80
  prod2 = double('fake-production2')
81
-
81
+
82
82
  # Adding states
83
83
  subject.push_state(state1)
84
84
  subject.push_state(state2)
85
85
  expect(dotted_rule1).to receive(:production).and_return(prod1)
86
- expect(prod1).to receive(:lhs).and_return(:dummy)
86
+ expect(prod1).to receive(:lhs).and_return(:dummy)
87
87
  expect(dotted_rule2).to receive(:production).and_return(prod2)
88
88
  expect(dotted_rule2).to receive(:reduce_item?).and_return(true)
89
- expect(prod2).to receive(:lhs).and_return(non_term)
89
+ expect(prod2).to receive(:lhs).and_return(non_term)
90
90
  expect(subject.states_rewriting(non_term)).to eq([state2])
91
91
  end
92
-
92
+
93
93
  it 'should list of ambiguous states' do
94
94
  prod1 = double('fake-production1')
95
95
  prod2 = double('fake-production2')
96
96
  expect(subject.ambiguities.size).to eq(0)
97
-
97
+
98
98
  # Adding states
99
99
  subject.push_state(state1)
100
100
  allow(dotted_rule1).to receive(:production).and_return(prod1)
101
- allow(dotted_rule1).to receive(:"reduce_item?").and_return(true)
102
- allow(dotted_rule1).to receive(:lhs).and_return(:something)
101
+ allow(dotted_rule1).to receive(:reduce_item?).and_return(true)
102
+ allow(dotted_rule1).to receive(:lhs).and_return(:something)
103
103
  expect(subject.ambiguities.size).to eq(0)
104
104
  allow(dotted_rule2).to receive(:production).and_return(prod2)
105
- allow(dotted_rule2).to receive(:"reduce_item?").and_return(true)
106
- allow(dotted_rule2).to receive(:lhs).and_return(:something_else)
105
+ allow(dotted_rule2).to receive(:reduce_item?).and_return(true)
106
+ allow(dotted_rule2).to receive(:lhs).and_return(:something_else)
107
107
  subject.push_state(state2)
108
108
  expect(subject.ambiguities.size).to eq(0)
109
109
  dotted_rule3 = double('fake_dotted_rule3')
110
110
  allow(dotted_rule3).to receive(:production).and_return(prod2)
111
- allow(dotted_rule3).to receive(:"reduce_item?").and_return(true)
112
- allow(dotted_rule3).to receive(:lhs).and_return(:something_else)
111
+ allow(dotted_rule3).to receive(:reduce_item?).and_return(true)
112
+ allow(dotted_rule3).to receive(:lhs).and_return(:something_else)
113
113
  state3 = ParseState.new(dotted_rule3, 5)
114
- subject.push_state(state3)
115
- expect(subject.ambiguities[0]).to eq([state2, state3])
114
+ subject.push_state(state3)
115
+ expect(subject.ambiguities[0]).to eq([state2, state3])
116
116
  end
117
-
117
+
118
118
  it 'should complain when impossible predecessor of parse state' do
119
119
  subject.push_state(state1)
120
120
  subject.push_state(state2)
121
- expect(dotted_rule1).to receive(:prev_position).and_return(nil)
121
+ expect(dotted_rule1).to receive(:prev_position).and_return(nil)
122
122
  err = StandardError
123
123
  expect { subject.predecessor_state(state1) }.to raise_error(err)
124
124
  end