rley 0.7.07 → 0.7.08

Sign up to get free protection for your applications and to get access to all the features.
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