rley 0.7.06 → 0.8.01

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 (167) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +362 -62
  3. data/.travis.yml +6 -6
  4. data/CHANGELOG.md +20 -4
  5. data/LICENSE.txt +1 -1
  6. data/README.md +7 -7
  7. data/examples/NLP/engtagger.rb +193 -190
  8. data/examples/NLP/nano_eng/nano_en_demo.rb +7 -11
  9. data/examples/NLP/nano_eng/nano_grammar.rb +21 -21
  10. data/examples/NLP/pico_en_demo.rb +2 -2
  11. data/examples/data_formats/JSON/cli_options.rb +1 -1
  12. data/examples/data_formats/JSON/json_ast_builder.rb +21 -27
  13. data/examples/data_formats/JSON/json_ast_nodes.rb +12 -21
  14. data/examples/data_formats/JSON/json_demo.rb +1 -2
  15. data/examples/data_formats/JSON/json_grammar.rb +13 -13
  16. data/examples/data_formats/JSON/json_lexer.rb +8 -8
  17. data/examples/data_formats/JSON/json_minifier.rb +1 -1
  18. data/examples/general/calc_iter1/calc_ast_builder.rb +13 -10
  19. data/examples/general/calc_iter1/calc_ast_nodes.rb +23 -37
  20. data/examples/general/calc_iter1/calc_grammar.rb +7 -6
  21. data/examples/general/calc_iter1/calc_lexer.rb +6 -4
  22. data/examples/general/calc_iter1/spec/calculator_spec.rb +5 -5
  23. data/examples/general/calc_iter2/calc_ast_builder.rb +5 -3
  24. data/examples/general/calc_iter2/calc_ast_nodes.rb +27 -43
  25. data/examples/general/calc_iter2/calc_grammar.rb +12 -12
  26. data/examples/general/calc_iter2/calc_lexer.rb +11 -10
  27. data/examples/general/calc_iter2/spec/calculator_spec.rb +26 -26
  28. data/examples/general/left.rb +2 -2
  29. data/examples/general/right.rb +2 -2
  30. data/lib/rley.rb +1 -1
  31. data/lib/rley/base/dotted_item.rb +28 -31
  32. data/lib/rley/base/grm_items_builder.rb +6 -0
  33. data/lib/rley/constants.rb +2 -2
  34. data/lib/rley/engine.rb +22 -25
  35. data/lib/rley/formatter/asciitree.rb +3 -3
  36. data/lib/rley/formatter/bracket_notation.rb +1 -8
  37. data/lib/rley/formatter/debug.rb +6 -6
  38. data/lib/rley/formatter/json.rb +2 -2
  39. data/lib/rley/gfg/call_edge.rb +1 -1
  40. data/lib/rley/gfg/edge.rb +5 -5
  41. data/lib/rley/gfg/end_vertex.rb +2 -6
  42. data/lib/rley/gfg/epsilon_edge.rb +1 -5
  43. data/lib/rley/gfg/grm_flow_graph.rb +27 -23
  44. data/lib/rley/gfg/item_vertex.rb +10 -10
  45. data/lib/rley/gfg/non_terminal_vertex.rb +4 -4
  46. data/lib/rley/gfg/scan_edge.rb +1 -1
  47. data/lib/rley/gfg/shortcut_edge.rb +2 -2
  48. data/lib/rley/gfg/start_vertex.rb +4 -8
  49. data/lib/rley/gfg/vertex.rb +43 -39
  50. data/lib/rley/interface.rb +16 -0
  51. data/lib/rley/lexical/token_range.rb +6 -6
  52. data/lib/rley/notation/all_notation_nodes.rb +2 -0
  53. data/lib/rley/notation/ast_builder.rb +191 -0
  54. data/lib/rley/notation/ast_node.rb +44 -0
  55. data/lib/rley/notation/ast_visitor.rb +113 -0
  56. data/lib/rley/notation/grammar.rb +49 -0
  57. data/lib/rley/notation/grammar_builder.rb +504 -0
  58. data/lib/rley/notation/grouping_node.rb +23 -0
  59. data/lib/rley/notation/parser.rb +56 -0
  60. data/lib/rley/notation/sequence_node.rb +35 -0
  61. data/lib/rley/notation/symbol_node.rb +29 -0
  62. data/lib/rley/notation/tokenizer.rb +192 -0
  63. data/lib/rley/parse_forest_visitor.rb +5 -5
  64. data/lib/rley/parse_rep/ast_base_builder.rb +48 -11
  65. data/lib/rley/parse_rep/cst_builder.rb +5 -6
  66. data/lib/rley/parse_rep/parse_forest_builder.rb +22 -18
  67. data/lib/rley/parse_rep/parse_forest_factory.rb +3 -3
  68. data/lib/rley/parse_rep/parse_rep_creator.rb +14 -16
  69. data/lib/rley/parse_rep/parse_tree_builder.rb +4 -4
  70. data/lib/rley/parse_rep/parse_tree_factory.rb +27 -27
  71. data/lib/rley/parse_tree_visitor.rb +1 -1
  72. data/lib/rley/parser/error_reason.rb +4 -5
  73. data/lib/rley/parser/gfg_chart.rb +118 -26
  74. data/lib/rley/parser/gfg_parsing.rb +22 -33
  75. data/lib/rley/parser/parse_entry.rb +25 -31
  76. data/lib/rley/parser/parse_entry_set.rb +19 -16
  77. data/lib/rley/parser/parse_entry_tracker.rb +4 -4
  78. data/lib/rley/parser/parse_tracer.rb +13 -13
  79. data/lib/rley/parser/parse_walker_factory.rb +23 -28
  80. data/lib/rley/ptree/non_terminal_node.rb +7 -5
  81. data/lib/rley/ptree/parse_tree.rb +3 -3
  82. data/lib/rley/ptree/parse_tree_node.rb +5 -5
  83. data/lib/rley/ptree/terminal_node.rb +7 -7
  84. data/lib/rley/rley_error.rb +12 -12
  85. data/lib/rley/sppf/alternative_node.rb +6 -6
  86. data/lib/rley/sppf/composite_node.rb +7 -7
  87. data/lib/rley/sppf/epsilon_node.rb +3 -3
  88. data/lib/rley/sppf/leaf_node.rb +3 -3
  89. data/lib/rley/sppf/parse_forest.rb +16 -16
  90. data/lib/rley/sppf/sppf_node.rb +7 -8
  91. data/lib/rley/sppf/token_node.rb +3 -3
  92. data/lib/rley/syntax/{grammar_builder.rb → base_grammar_builder.rb} +61 -23
  93. data/lib/rley/syntax/grammar.rb +5 -5
  94. data/lib/rley/syntax/grm_symbol.rb +7 -7
  95. data/lib/rley/syntax/match_closest.rb +43 -0
  96. data/lib/rley/syntax/non_terminal.rb +9 -15
  97. data/lib/rley/syntax/production.rb +16 -10
  98. data/lib/rley/syntax/symbol_seq.rb +7 -9
  99. data/lib/rley/syntax/terminal.rb +4 -5
  100. data/lib/rley/syntax/verbatim_symbol.rb +3 -3
  101. data/lib/support/base_tokenizer.rb +19 -18
  102. data/spec/rley/base/dotted_item_spec.rb +2 -2
  103. data/spec/rley/engine_spec.rb +23 -21
  104. data/spec/rley/formatter/asciitree_spec.rb +7 -7
  105. data/spec/rley/formatter/bracket_notation_spec.rb +13 -13
  106. data/spec/rley/formatter/json_spec.rb +1 -1
  107. data/spec/rley/gfg/end_vertex_spec.rb +5 -5
  108. data/spec/rley/gfg/grm_flow_graph_spec.rb +2 -2
  109. data/spec/rley/gfg/item_vertex_spec.rb +10 -10
  110. data/spec/rley/gfg/non_terminal_vertex_spec.rb +3 -3
  111. data/spec/rley/gfg/shortcut_edge_spec.rb +1 -1
  112. data/spec/rley/gfg/start_vertex_spec.rb +5 -5
  113. data/spec/rley/gfg/vertex_spec.rb +3 -3
  114. data/spec/rley/lexical/token_range_spec.rb +16 -16
  115. data/spec/rley/lexical/token_spec.rb +2 -2
  116. data/spec/rley/notation/grammar_builder_spec.rb +302 -0
  117. data/spec/rley/notation/parser_spec.rb +184 -0
  118. data/spec/rley/notation/tokenizer_spec.rb +370 -0
  119. data/spec/rley/parse_forest_visitor_spec.rb +165 -163
  120. data/spec/rley/parse_rep/ambiguous_parse_spec.rb +44 -44
  121. data/spec/rley/parse_rep/ast_builder_spec.rb +6 -7
  122. data/spec/rley/parse_rep/cst_builder_spec.rb +5 -5
  123. data/spec/rley/parse_rep/groucho_spec.rb +24 -26
  124. data/spec/rley/parse_rep/parse_forest_builder_spec.rb +27 -27
  125. data/spec/rley/parse_rep/parse_forest_factory_spec.rb +8 -8
  126. data/spec/rley/parse_rep/parse_tree_factory_spec.rb +3 -3
  127. data/spec/rley/parse_tree_visitor_spec.rb +10 -8
  128. data/spec/rley/parser/dangling_else_spec.rb +445 -0
  129. data/spec/rley/parser/error_reason_spec.rb +6 -6
  130. data/spec/rley/parser/gfg_earley_parser_spec.rb +120 -12
  131. data/spec/rley/parser/gfg_parsing_spec.rb +6 -13
  132. data/spec/rley/parser/parse_entry_spec.rb +19 -19
  133. data/spec/rley/parser/parse_walker_factory_spec.rb +10 -10
  134. data/spec/rley/ptree/non_terminal_node_spec.rb +5 -3
  135. data/spec/rley/ptree/parse_tree_node_spec.rb +4 -4
  136. data/spec/rley/ptree/terminal_node_spec.rb +6 -6
  137. data/spec/rley/sppf/alternative_node_spec.rb +6 -6
  138. data/spec/rley/sppf/non_terminal_node_spec.rb +3 -3
  139. data/spec/rley/sppf/token_node_spec.rb +4 -4
  140. data/spec/rley/support/ambiguous_grammar_helper.rb +4 -5
  141. data/spec/rley/support/grammar_abc_helper.rb +3 -5
  142. data/spec/rley/support/grammar_ambig01_helper.rb +5 -6
  143. data/spec/rley/support/grammar_arr_int_helper.rb +5 -6
  144. data/spec/rley/support/grammar_b_expr_helper.rb +5 -6
  145. data/spec/rley/support/grammar_int_seq_helper.rb +51 -0
  146. data/spec/rley/support/grammar_l0_helper.rb +14 -17
  147. data/spec/rley/support/grammar_pb_helper.rb +8 -7
  148. data/spec/rley/support/grammar_sppf_helper.rb +3 -3
  149. data/spec/rley/syntax/{grammar_builder_spec.rb → base_grammar_builder_spec.rb} +35 -16
  150. data/spec/rley/syntax/grammar_spec.rb +6 -6
  151. data/spec/rley/syntax/grm_symbol_spec.rb +1 -1
  152. data/spec/rley/syntax/match_closest_spec.rb +46 -0
  153. data/spec/rley/syntax/non_terminal_spec.rb +8 -8
  154. data/spec/rley/syntax/production_spec.rb +17 -13
  155. data/spec/rley/syntax/symbol_seq_spec.rb +2 -2
  156. data/spec/rley/syntax/terminal_spec.rb +5 -5
  157. data/spec/rley/syntax/verbatim_symbol_spec.rb +1 -1
  158. data/spec/spec_helper.rb +0 -12
  159. data/spec/support/base_tokenizer_spec.rb +7 -2
  160. metadata +48 -74
  161. data/.simplecov +0 -7
  162. data/lib/rley/parser/parse_state.rb +0 -83
  163. data/lib/rley/parser/parse_state_tracker.rb +0 -59
  164. data/lib/rley/parser/state_set.rb +0 -101
  165. data/spec/rley/parser/parse_state_spec.rb +0 -125
  166. data/spec/rley/parser/parse_tracer_spec.rb +0 -200
  167. data/spec/rley/parser/state_set_spec.rb +0 -130
@@ -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
@@ -5,7 +5,7 @@ require 'stringio'
5
5
  require_relative '../../../lib/rley/syntax/verbatim_symbol'
6
6
  require_relative '../../../lib/rley/syntax/non_terminal'
7
7
  require_relative '../../../lib/rley/syntax/production'
8
- require_relative '../../../lib/rley/syntax/grammar_builder'
8
+ require_relative '../../../lib/rley/syntax/base_grammar_builder'
9
9
  require_relative '../../../lib/rley/lexical/token'
10
10
  require_relative '../../../lib/rley/base/dotted_item'
11
11
  require_relative '../../../lib/rley/parser/gfg_parsing'
@@ -13,6 +13,7 @@ require_relative '../../../lib/rley/parser/gfg_parsing'
13
13
  # Load builders and lexers for sample grammars
14
14
  require_relative '../support/grammar_abc_helper'
15
15
  require_relative '../support/ambiguous_grammar_helper'
16
+ require_relative '../support/grammar_int_seq_helper'
16
17
  require_relative '../support/grammar_pb_helper'
17
18
  require_relative '../support/grammar_helper'
18
19
  require_relative '../support/expectation_helper'
@@ -71,7 +72,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
71
72
 
72
73
  # Helper method that mimicks the output of a tokenizer
73
74
  # for the language specified by grammar_expr
74
- def grm2_tokens()
75
+ def grm2_tokens
75
76
  input_sequence = [
76
77
  { '2' => 'integer' },
77
78
  '+',
@@ -79,7 +80,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
79
80
  '*',
80
81
  { '4' => 'integer' }
81
82
  ]
82
- return build_token_sequence(input_sequence, grammar_expr)
83
+ build_token_sequence(input_sequence, grammar_expr)
83
84
  end
84
85
 
85
86
  # Default instantiation rule
@@ -104,6 +105,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
104
105
  end # context
105
106
 
106
107
  context 'Parsing: ' do
108
+ # rubocop: disable Naming/VariableNumber
107
109
  it 'should parse a valid simple input' do
108
110
  parse_result = subject.parse(grm1_tokens)
109
111
  expect(parse_result.success?).to eq(true)
@@ -183,6 +185,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
183
185
  expect(entry_set_5.entries.size).to eq(4)
184
186
  compare_entry_texts(entry_set_5, expected)
185
187
  end
188
+ # rubocop: enable Naming/VariableNumber
186
189
 
187
190
  it 'should parse a valid simple expression' do
188
191
  instance = GFGEarleyParser.new(grammar_expr)
@@ -279,6 +282,91 @@ module Rley # Open this namespace to avoid module qualifier prefixes
279
282
  compare_entry_texts(parse_result.chart[5], expected)
280
283
  end
281
284
 
285
+ it 'should support Kleene plus ' do
286
+ extend(GrammarIntSeqHelper)
287
+ grammar = grammar_int_seq_builder.grammar
288
+ instance = GFGEarleyParser.new(grammar)
289
+ tokens = int_seq_tokenizer('6, 36, 216')
290
+ parse_result = nil
291
+ expect { parse_result = instance.parse(tokens) }.not_to raise_error
292
+ expect(parse_result.success?).to eq(true)
293
+
294
+ ###################### S(0): . 6, 36, 216
295
+ # Expectation chart[0]:
296
+ expected = [
297
+ '.S | 0', # Initialization
298
+ 'S => . sequence | 0', # start rule
299
+ 'S => . | 0', # start rule
300
+ '.sequence | 0', # call rule
301
+ 'S. | 0', # exit rule
302
+ 'sequence => . sequence comma integer | 0', # start rule
303
+ 'sequence => . integer | 0', # start rule
304
+ '.integer | 0', # call rule
305
+ 'integer => . digit_plus | 0' , # start rule
306
+ '.digit_plus | 0', # call rule
307
+ 'digit_plus => . digit_plus digit | 0', # start rule (generated)
308
+ 'digit_plus => . digit | 0' # start rule (generated)
309
+ ]
310
+ compare_entry_texts(parse_result.chart[0], expected)
311
+
312
+ ###################### S(1): 6 ., 36, 216
313
+ # Expectation chart[1]:
314
+ expected = [
315
+ 'digit_plus => digit . | 0', # Scan
316
+ 'digit_plus. | 0', # exit rule
317
+ 'integer => digit_plus . | 0' , # end rule
318
+ 'digit_plus => digit_plus . digit | 0', # rule (generated)
319
+ 'integer. | 0', # exit rule
320
+ 'sequence => integer . | 0', # end rule
321
+ 'sequence. | 0', # exit rule
322
+ 'S => sequence . | 0', # end rule
323
+ 'sequence => sequence . comma integer | 0', # rule
324
+ 'S. | 0' # exit rule
325
+ ]
326
+ compare_entry_texts(parse_result.chart[1], expected)
327
+
328
+ ###################### S(2): 6 , . 36, 216
329
+ # Expectation chart[2]:
330
+ expected = [
331
+ 'sequence => sequence comma . integer | 0', # Scan
332
+ '.integer | 2', # call rule
333
+ 'integer => . digit_plus | 2' , # start rule
334
+ '.digit_plus | 2', # call rule
335
+ 'digit_plus => . digit_plus digit | 2', # start rule (generated)
336
+ 'digit_plus => . digit | 2' # start rule (generated)
337
+ ]
338
+ compare_entry_texts(parse_result.chart[2], expected)
339
+
340
+ ###################### S(3): 6 , 3 . 6. , 216
341
+ # Expectation chart[3]:
342
+ expected = [
343
+ 'digit_plus => digit . | 2', # Scan
344
+ 'digit_plus. | 2', # exit rule
345
+ 'integer => digit_plus . | 2' , # end rule
346
+ 'digit_plus => digit_plus . digit | 2', # rule (generated)
347
+ 'integer. | 2', # exit rule
348
+ 'sequence => sequence comma integer . | 0', # rule
349
+ 'sequence. | 0', # exit rule
350
+ 'S => sequence . | 0', # end rule
351
+ 'sequence => sequence . comma integer | 0', # rule
352
+ ]
353
+ compare_entry_texts(parse_result.chart[3], expected)
354
+
355
+ ###################### S(4): 6 , 36 . . , 216
356
+ # Expectation chart[4]:
357
+ expected = [
358
+ 'digit_plus => digit_plus digit . | 2', # Scan
359
+ 'digit_plus. | 2', # exit rule
360
+ 'integer => digit_plus . | 2' , # end rule
361
+ 'digit_plus => digit_plus . digit | 2', #
362
+ 'integer. | 2', # exit rule
363
+ 'sequence => sequence comma integer . | 0', # rule
364
+ 'sequence. | 0', # exit rule
365
+ 'S => sequence . | 0', # end rule
366
+ ]
367
+ compare_entry_texts(parse_result.chart[4], expected)
368
+ end
369
+
282
370
  it 'should parse a nullable grammar' do
283
371
  # Simple but problematic grammar for the original Earley parser
284
372
  # (based on example in D. Grune, C. Jacobs "Parsing Techniques" book)
@@ -286,7 +374,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
286
374
  # A => ;
287
375
  t_x = Syntax::VerbatimSymbol.new('x')
288
376
 
289
- builder = Syntax::GrammarBuilder.new do
377
+ builder = Notation::GrammarBuilder.new do
290
378
  add_terminals(t_x)
291
379
  rule 'Ss' => 'A A x'
292
380
  rule 'A' => []
@@ -332,11 +420,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
332
420
  t_plus = Syntax::VerbatimSymbol.new('+')
333
421
  t_star = Syntax::VerbatimSymbol.new('*')
334
422
 
335
- builder = Syntax::GrammarBuilder.new do
423
+ builder = Syntax::BaseGrammarBuilder.new do
336
424
  add_terminals(t_int, t_plus, t_star)
337
425
  rule 'P' => 'S'
338
- rule 'S' => %w[S + S]
339
- rule 'S' => %w[S * S]
426
+ rule 'S' => 'S + S'
427
+ rule 'S' => 'S * S'
340
428
  rule 'S' => 'L'
341
429
  rule 'L' => 'integer'
342
430
  end
@@ -731,7 +819,7 @@ MSG
731
819
  t_star = Syntax::VerbatimSymbol.new('*')
732
820
  t_slash = Syntax::VerbatimSymbol.new('/')
733
821
 
734
- builder = Syntax::GrammarBuilder.new do
822
+ builder = Syntax::BaseGrammarBuilder.new do
735
823
  add_terminals(t_a, t_star, t_slash)
736
824
  rule 'Z' => 'E'
737
825
  rule 'E' => %w[E Q F]
@@ -846,10 +934,11 @@ MSG
846
934
  # S => ;
847
935
  # This grammar requires a time that is quadratic in the number of
848
936
  # input tokens
849
- builder = Syntax::GrammarBuilder.new
850
- builder.add_terminals('a')
851
- builder.add_production('S' => %w[a S])
852
- builder.add_production('S' => [])
937
+ builder = Notation::GrammarBuilder.new do
938
+ add_terminals('a')
939
+ rule('S' => 'a S')
940
+ rule('S' => '')
941
+ end
853
942
  grammar = builder.grammar
854
943
  tokens = build_token_sequence(%w[a a a a], grammar)
855
944
 
@@ -929,6 +1018,25 @@ MSG
929
1018
  ]
930
1019
  compare_entry_texts(parse_result.chart[4], expected)
931
1020
  end
1021
+
1022
+ it 'should support modifier(s) in start rule' do
1023
+ # An implicit EOF marker is a special terminal
1024
+ # that denotes the end of input string but doesn't
1025
+ # appear explicitly as some character or text in the input.
1026
+ builder = Notation::GrammarBuilder.new do
1027
+ add_terminals('a', 'b', 'EOF')
1028
+
1029
+ rule('S' => 'a_or_b* EOF')
1030
+ rule('a_or_b' => 'a')
1031
+ rule('a_or_b' => 'b')
1032
+ end
1033
+ grammar = builder.grammar
1034
+ tokens = build_token_sequence(%w[EOF], grammar)
1035
+ tokens[0].instance_variable_set(:@lexeme, '')
1036
+ instance = GFGEarleyParser.new(grammar)
1037
+ parse_result = instance.parse(tokens)
1038
+ expect(parse_result.success?).to eq(true)
1039
+ end
932
1040
  end # context
933
1041
  end # describe
934
1042
  end # module
@@ -6,7 +6,7 @@ require 'stringio'
6
6
  require_relative '../../../lib/rley/syntax/non_terminal'
7
7
  require_relative '../../../lib/rley/syntax/verbatim_symbol'
8
8
  require_relative '../../../lib/rley/syntax/production'
9
- require_relative '../../../lib/rley/syntax/grammar_builder'
9
+ require_relative '../../../lib/rley/syntax/base_grammar_builder'
10
10
  require_relative '../../../lib/rley/base/dotted_item'
11
11
  require_relative '../../../lib/rley/lexical/token'
12
12
  require_relative '../../../lib/rley/parser/parse_tracer'
@@ -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])
@@ -252,9 +252,6 @@ SNIPPET
252
252
  end
253
253
 
254
254
  =begin
255
-
256
-
257
-
258
255
  it 'should retrieve the parse states that expect a given terminal' do
259
256
  item1 = DottedItem.new(prod_A1, 2)
260
257
  item2 = DottedItem.new(prod_A1, 1)
@@ -303,9 +300,9 @@ SNIPPET
303
300
 
304
301
  it 'should give a text representation of itself' do
305
302
  repr = subject.to_s
306
- expect(repr).to match /^success\? true/
307
-
308
- # Let's test the last chart state only
303
+ expect(repr).to match(/^success\? true/)
304
+
305
+ # Let's test the last chart state only
309
306
  expectation = <<REPR
310
307
  State[5]
311
308
  T => integer . | 4
@@ -341,10 +338,6 @@ REPR
341
338
  it 'should indicate whether a parse succeeded' do
342
339
  expect(subject.success?).to be_truthy
343
340
  end
344
-
345
- it 'should build a parse forest' do
346
- expect { subject.parse_forest }.not_to raise_error if subject.success?
347
- end
348
341
  end # context
349
342
  end # describe
350
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative '../../spec_helper'
4
4
 
5
- require_relative '../../../lib/rley/syntax/grammar_builder'
5
+ require_relative '../../../lib/rley/syntax/base_grammar_builder'
6
6
  require_relative '../support/grammar_helper'
7
7
  require_relative '../support/expectation_helper'
8
8
 
@@ -45,15 +45,15 @@ module Rley # Open this namespace to avoid module qualifier prefixes
45
45
  # "SPPF=Style Parsing From Earley Recognizers" in
46
46
  # Notes in Theoretical Computer Science 203, (2008), pp. 53-67
47
47
  # contains a hidden left recursion and a cycle
48
- builder = Syntax::GrammarBuilder.new do
48
+ builder = Syntax::BaseGrammarBuilder.new do
49
49
  add_terminals('a', 'b')
50
- rule'Phi' => 'S'
51
- rule'S' => %w[A T]
52
- rule'S' => %w[a T]
53
- rule'A' => 'a'
54
- rule'A' => %w[B A]
55
- rule'B' => []
56
- rule'T' => %w[b b b]
50
+ rule 'Phi' => 'S'
51
+ rule 'S' => %w[A T]
52
+ rule 'S' => %w[a T]
53
+ rule 'A' => 'a'
54
+ rule 'A' => %w[B A]
55
+ rule 'B' => []
56
+ rule 'T' => %w[b b b]
57
57
  end
58
58
  builder.grammar
59
59
  end
@@ -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