rley 0.8.00 → 0.8.05

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +47 -3
  3. data/CHANGELOG.md +32 -4
  4. data/examples/NLP/pico_en_demo.rb +2 -2
  5. data/examples/data_formats/JSON/README.md +34 -0
  6. data/examples/data_formats/JSON/sample01.json +3 -0
  7. data/examples/data_formats/JSON/sample01.svg +36 -0
  8. data/examples/data_formats/JSON/sample02.json +6 -0
  9. data/examples/data_formats/JSON/sample02.svg +128 -0
  10. data/examples/data_formats/JSON/sample03.json +88 -0
  11. data/examples/general/calc_iter1/README.md +26 -0
  12. data/examples/general/calc_iter2/README.md +55 -0
  13. data/examples/general/general_examples.md +37 -0
  14. data/examples/tokenizer/README.md +46 -0
  15. data/examples/tokenizer/loxxy_raw_scanner.rex +98 -0
  16. data/examples/tokenizer/loxxy_raw_scanner.rex.rb +256 -0
  17. data/examples/tokenizer/loxxy_tokenizer.rb +94 -0
  18. data/examples/tokenizer/run_tokenizer.rb +29 -0
  19. data/lib/rley/constants.rb +1 -1
  20. data/lib/rley/lexical/literal.rb +29 -0
  21. data/lib/rley/lexical/token.rb +7 -4
  22. data/lib/rley/notation/all_notation_nodes.rb +3 -1
  23. data/lib/rley/notation/ast_builder.rb +185 -191
  24. data/lib/rley/notation/ast_node.rb +5 -5
  25. data/lib/rley/notation/ast_visitor.rb +3 -1
  26. data/lib/rley/notation/grammar.rb +1 -1
  27. data/lib/rley/notation/grammar_builder.rb +87 -33
  28. data/lib/rley/notation/grouping_node.rb +1 -1
  29. data/lib/rley/notation/parser.rb +56 -56
  30. data/lib/rley/notation/sequence_node.rb +3 -3
  31. data/lib/rley/notation/symbol_node.rb +2 -2
  32. data/lib/rley/notation/tokenizer.rb +3 -15
  33. data/lib/rley/parse_rep/ast_base_builder.rb +35 -4
  34. data/lib/rley/parser/gfg_chart.rb +5 -4
  35. data/lib/rley/parser/gfg_earley_parser.rb +1 -1
  36. data/lib/rley/syntax/base_grammar_builder.rb +8 -2
  37. data/lib/rley/syntax/match_closest.rb +7 -7
  38. data/lib/rley.rb +1 -1
  39. data/spec/rley/lexical/literal_spec.rb +33 -0
  40. data/spec/rley/lexical/token_spec.rb +15 -4
  41. data/spec/rley/notation/grammar_builder_spec.rb +57 -50
  42. data/spec/rley/notation/parser_spec.rb +183 -184
  43. data/spec/rley/notation/tokenizer_spec.rb +98 -104
  44. data/spec/rley/parser/dangling_else_spec.rb +20 -20
  45. data/spec/rley/parser/gfg_chart_spec.rb +0 -1
  46. data/spec/rley/parser/gfg_earley_parser_spec.rb +166 -147
  47. data/spec/rley/parser/gfg_parsing_spec.rb +2 -2
  48. data/spec/rley/syntax/base_grammar_builder_spec.rb +7 -8
  49. data/spec/rley/syntax/grammar_spec.rb +6 -9
  50. data/spec/rley/syntax/match_closest_spec.rb +4 -4
  51. metadata +19 -9
  52. data/lib/rley/parser/parse_tracer.rb +0 -103
  53. data/lib/rley/syntax/literal.rb +0 -20
  54. data/lib/rley/syntax/verbatim_symbol.rb +0 -27
  55. data/spec/rley/syntax/literal_spec.rb +0 -31
  56. data/spec/rley/syntax/verbatim_symbol_spec.rb +0 -38
@@ -19,10 +19,10 @@ module Rley # Open this namespace to avoid module qualifier prefixes
19
19
  expect(token.lexeme).to eq(lexeme)
20
20
  end
21
21
  end
22
-
22
+
23
23
  context 'Initialization:' do
24
- let(:sample_text) { 'begin-object member-list end-object' }
25
- subject { Tokenizer.new }
24
+ let(:sample_text) { 'begin-object member-list end-object' }
25
+ subject { Tokenizer.new }
26
26
 
27
27
  it 'could be initialized with a text to tokenize or...' do
28
28
  expect { Tokenizer.new(sample_text) }.not_to raise_error
@@ -36,7 +36,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
36
36
  expect(subject.scanner).to be_kind_of(StringScanner)
37
37
  end
38
38
  end # context
39
-
39
+
40
40
  context 'Input tokenization:' do
41
41
  it 'should recognize single special character token' do
42
42
  input = '(){}?*+,'
@@ -47,9 +47,9 @@ module Rley # Open this namespace to avoid module qualifier prefixes
47
47
  %w[RIGHT_PAREN )],
48
48
  %w[LEFT_BRACE {],
49
49
  %w[RIGHT_BRACE }],
50
- %w[QUESTION_MARK ?],
51
- %w[STAR *],
52
- %w[PLUS +],
50
+ %w[QUESTION_MARK ?],
51
+ %w[STAR *],
52
+ %w[PLUS +],
53
53
  %w[COMMA ,]
54
54
  ]
55
55
  match_expectations(subject, expectations)
@@ -64,7 +64,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
64
64
  ]
65
65
  match_expectations(subject, expectations)
66
66
  end
67
-
67
+
68
68
  it 'should treat ? * + as symbols if they occur as suffix' do
69
69
  input = 'a+ + b* * 3 ?'
70
70
  subject.start_with(input)
@@ -80,7 +80,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
80
80
  %w[SYMBOL ?]
81
81
  ]
82
82
  match_expectations(subject, expectations)
83
- end
83
+ end
84
84
 
85
85
  it 'should recognize annotation keywords' do
86
86
  keywords = 'match_closest: repeat:'
@@ -110,7 +110,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
110
110
  subject.tokens[0..-2].each_with_index do |tok, i|
111
111
  expect(tok).to be_kind_of(Rley::Lexical::Token)
112
112
  expect(tok.terminal).to eq('INT_LIT')
113
- (lexeme, val) = expectations[i]
113
+ (lexeme,) = expectations[i]
114
114
  expect(tok.lexeme).to eq(lexeme)
115
115
  end
116
116
  end
@@ -135,37 +135,31 @@ module Rley # Open this namespace to avoid module qualifier prefixes
135
135
  subject.tokens.each_with_index do |str, i|
136
136
  expect(str).to be_kind_of(Rley::Lexical::Token)
137
137
  expect(str.terminal).to eq('STR_LIT')
138
- (lexeme, val) = expectations[i]
138
+ (lexeme,) = expectations[i]
139
139
  expect(str.lexeme).to eq(lexeme)
140
140
  end
141
141
  end
142
142
 
143
143
  it 'should recognize a sequence of symbols' do
144
- input = "IF ifCondition statement ELSE statement"
145
- expectations = [
146
- 'IF',
147
- 'ifCondition',
148
- 'statement',
149
- 'ELSE',
150
- 'statement'
151
- ]
144
+ input = 'IF ifCondition statement ELSE statement'
145
+ expectations = %w[IF ifCondition statement ELSE statement]
152
146
 
153
147
  subject.start_with(input)
154
148
  subject.tokens.each_with_index do |str, i|
155
149
  expect(str).to be_kind_of(Rley::Lexical::Token)
156
150
  expect(str.terminal).to eq('SYMBOL')
157
- (lexeme, val) = expectations[i]
151
+ (lexeme,) = expectations[i]
158
152
  expect(str.lexeme).to eq(lexeme)
159
153
  end
160
154
  end
161
155
 
162
156
  it 'should recognize an optional symbol' do
163
- input = "RETURN expression? SEMICOLON"
157
+ input = 'RETURN expression? SEMICOLON'
164
158
  expectations = [
165
- ['RETURN', 'SYMBOL'],
166
- ['expression', 'SYMBOL'],
167
- ['?', 'QUESTION_MARK'],
168
- ['SEMICOLON', 'SYMBOL'],
159
+ %w[RETURN SYMBOL],
160
+ %w[expression SYMBOL],
161
+ %w[? QUESTION_MARK],
162
+ %w[SEMICOLON SYMBOL]
169
163
  ]
170
164
 
171
165
  subject.start_with(input)
@@ -178,11 +172,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
178
172
  end
179
173
 
180
174
  it 'should recognize a symbol with a star quantifier' do
181
- input = "declaration* EOF"
175
+ input = 'declaration* EOF'
182
176
  expectations = [
183
- ['declaration', 'SYMBOL'],
184
- ['*', 'STAR'],
185
- ['EOF', 'SYMBOL'],
177
+ %w[declaration SYMBOL],
178
+ %w[* STAR],
179
+ %w[EOF SYMBOL]
186
180
  ]
187
181
 
188
182
  subject.start_with(input)
@@ -195,11 +189,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
195
189
  end
196
190
 
197
191
  it 'should recognize a symbol with a plus quantifier' do
198
- input = "declaration+ EOF"
192
+ input = 'declaration+ EOF'
199
193
  expectations = [
200
- ['declaration', 'SYMBOL'],
201
- ['+', 'PLUS'],
202
- ['EOF', 'SYMBOL'],
194
+ %w[declaration SYMBOL],
195
+ %w[+ PLUS],
196
+ %w[EOF SYMBOL]
203
197
  ]
204
198
 
205
199
  subject.start_with(input)
@@ -212,16 +206,16 @@ module Rley # Open this namespace to avoid module qualifier prefixes
212
206
  end
213
207
 
214
208
  it 'should recognize a grouping with a quantifier' do
215
- input = "IF ifCondition statement (ELSE statement)?"
209
+ input = 'IF ifCondition statement (ELSE statement)?'
216
210
  expectations = [
217
- ['IF', 'SYMBOL'],
218
- ['ifCondition', 'SYMBOL'],
219
- ['statement', 'SYMBOL'],
220
- ['(', 'LEFT_PAREN'],
221
- ['ELSE', 'SYMBOL'],
222
- ['statement', 'SYMBOL'],
223
- [')', 'RIGHT_PAREN'],
224
- ['?', 'QUESTION_MARK']
211
+ %w[IF SYMBOL],
212
+ %w[ifCondition SYMBOL],
213
+ %w[statement SYMBOL],
214
+ %w[( LEFT_PAREN],
215
+ %w[ELSE SYMBOL],
216
+ %w[statement SYMBOL],
217
+ %w[) RIGHT_PAREN],
218
+ %w[? QUESTION_MARK]
225
219
  ]
226
220
 
227
221
  subject.start_with(input)
@@ -236,15 +230,15 @@ module Rley # Open this namespace to avoid module qualifier prefixes
236
230
  it 'should recognize a match closest constraint' do
237
231
  input = "IF ifCondition statement ELSE { match_closest: 'IF' } statement"
238
232
  expectations = [
239
- ['IF', 'SYMBOL'],
240
- ['ifCondition', 'SYMBOL'],
241
- ['statement', 'SYMBOL'],
242
- ['ELSE', 'SYMBOL'],
243
- ['{', 'LEFT_BRACE'],
244
- ['match_closest', 'KEY'],
245
- ['IF', 'STR_LIT'],
246
- ['}', 'RIGHT_BRACE'],
247
- ['statement', 'SYMBOL']
233
+ %w[IF SYMBOL],
234
+ %w[ifCondition SYMBOL],
235
+ %w[statement SYMBOL],
236
+ %w[ELSE SYMBOL],
237
+ %w[{ LEFT_BRACE],
238
+ %w[match_closest KEY],
239
+ %w[IF STR_LIT],
240
+ %w[} RIGHT_BRACE],
241
+ %w[statement SYMBOL]
248
242
  ]
249
243
 
250
244
  subject.start_with(input)
@@ -257,17 +251,17 @@ module Rley # Open this namespace to avoid module qualifier prefixes
257
251
  end
258
252
 
259
253
  it 'should recognize a repeat constraint' do
260
- input = "IF ifCondition statement { repeat: 1 } ELSE statement"
254
+ input = 'IF ifCondition statement { repeat: 1 } ELSE statement'
261
255
  expectations = [
262
- ['IF', 'SYMBOL'],
263
- ['ifCondition', 'SYMBOL'],
264
- ['statement', 'SYMBOL'],
265
- ['{', 'LEFT_BRACE'],
266
- ['repeat', 'KEY'],
267
- ['1', 'INT_LIT'],
268
- ['}', 'RIGHT_BRACE'],
269
- ['ELSE', 'SYMBOL'],
270
- ['statement', 'SYMBOL']
256
+ %w[IF SYMBOL],
257
+ %w[ifCondition SYMBOL],
258
+ %w[statement SYMBOL],
259
+ %w[{ LEFT_BRACE],
260
+ %w[repeat KEY],
261
+ %w[1 INT_LIT],
262
+ %w[} RIGHT_BRACE],
263
+ %w[ELSE SYMBOL],
264
+ %w[statement SYMBOL]
271
265
  ]
272
266
 
273
267
  subject.start_with(input)
@@ -280,21 +274,21 @@ module Rley # Open this namespace to avoid module qualifier prefixes
280
274
  end
281
275
 
282
276
  it 'should recognize a grouping with a repeat constraint' do
283
- input = "IF ifCondition statement ( ELSE statement ){ repeat: 0..1 }"
277
+ input = 'IF ifCondition statement ( ELSE statement ){ repeat: 0..1 }'
284
278
  expectations = [
285
- ['IF', 'SYMBOL'],
286
- ['ifCondition', 'SYMBOL'],
287
- ['statement', 'SYMBOL'],
288
- ['(', 'LEFT_PAREN'],
289
- ['ELSE', 'SYMBOL'],
290
- ['statement', 'SYMBOL'],
291
- [')', 'RIGHT_PAREN'],
292
- ['{', 'LEFT_BRACE'],
293
- ['repeat', 'KEY'],
294
- ['0', 'INT_LIT'],
295
- ['..', 'ELLIPSIS'],
296
- ['1', 'INT_LIT'],
297
- ['}', 'RIGHT_BRACE']
279
+ %w[IF SYMBOL],
280
+ %w[ifCondition SYMBOL],
281
+ %w[statement SYMBOL],
282
+ %w[( LEFT_PAREN],
283
+ %w[ELSE SYMBOL],
284
+ %w[statement SYMBOL],
285
+ %w[) RIGHT_PAREN],
286
+ %w[{ LEFT_BRACE],
287
+ %w[repeat KEY],
288
+ %w[0 INT_LIT],
289
+ %w[.. ELLIPSIS],
290
+ %w[1 INT_LIT],
291
+ %w[} RIGHT_BRACE]
298
292
  ]
299
293
 
300
294
  subject.start_with(input)
@@ -309,18 +303,18 @@ module Rley # Open this namespace to avoid module qualifier prefixes
309
303
  it 'should recognize a combination of constraints' do
310
304
  input = "IF ifCondition statement ELSE { repeat: 1, match_closest: 'IF' } statement"
311
305
  expectations = [
312
- ['IF', 'SYMBOL'],
313
- ['ifCondition', 'SYMBOL'],
314
- ['statement', 'SYMBOL'],
315
- ['ELSE', 'SYMBOL'],
316
- ['{', 'LEFT_BRACE'],
317
- ['repeat', 'KEY'],
318
- ['1', 'INT_LIT'],
319
- [',', 'COMMA'],
320
- ['match_closest', 'KEY'],
321
- ['IF', 'STR_LIT'],
322
- ['}', 'RIGHT_BRACE'],
323
- ['statement', 'SYMBOL']
306
+ %w[IF SYMBOL],
307
+ %w[ifCondition SYMBOL],
308
+ %w[statement SYMBOL],
309
+ %w[ELSE SYMBOL],
310
+ %w[{ LEFT_BRACE],
311
+ %w[repeat KEY],
312
+ %w[1 INT_LIT],
313
+ %w[, COMMA],
314
+ %w[match_closest KEY],
315
+ %w[IF STR_LIT],
316
+ %w[} RIGHT_BRACE],
317
+ %w[statement SYMBOL]
324
318
  ]
325
319
 
326
320
  subject.start_with(input)
@@ -335,23 +329,23 @@ module Rley # Open this namespace to avoid module qualifier prefixes
335
329
  it 'should recognize a grouping with a nested constraint' do
336
330
  input = "IF ifCondition statement ( ELSE { match_closest: 'IF' } statement ){ repeat: 0..1 }"
337
331
  expectations = [
338
- ['IF', 'SYMBOL'],
339
- ['ifCondition', 'SYMBOL'],
340
- ['statement', 'SYMBOL'],
341
- ['(', 'LEFT_PAREN'],
342
- ['ELSE', 'SYMBOL'],
343
- ['{', 'LEFT_BRACE'],
344
- ['match_closest', 'KEY'],
345
- ['IF', 'STR_LIT'],
346
- ['}', 'RIGHT_BRACE'],
347
- ['statement', 'SYMBOL'],
348
- [')', 'RIGHT_PAREN'],
349
- ['{', 'LEFT_BRACE'],
350
- ['repeat', 'KEY'],
351
- ['0', 'INT_LIT'],
352
- ['..', 'ELLIPSIS'],
353
- ['1', 'INT_LIT'],
354
- ['}', 'RIGHT_BRACE']
332
+ %w[IF SYMBOL],
333
+ %w[ifCondition SYMBOL],
334
+ %w[statement SYMBOL],
335
+ %w[( LEFT_PAREN],
336
+ %w[ELSE SYMBOL],
337
+ %w[{ LEFT_BRACE],
338
+ %w[match_closest KEY],
339
+ %w[IF STR_LIT],
340
+ %w[} RIGHT_BRACE],
341
+ %w[statement SYMBOL],
342
+ %w[) RIGHT_PAREN],
343
+ %w[{ LEFT_BRACE],
344
+ %w[repeat KEY],
345
+ %w[0 INT_LIT],
346
+ %w[.. ELLIPSIS],
347
+ %w[1 INT_LIT],
348
+ %w[} RIGHT_BRACE]
355
349
  ]
356
350
 
357
351
  subject.start_with(input)
@@ -9,6 +9,7 @@ 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'
12
+ require_relative '../../../lib/rley/notation/grammar_builder'
12
13
 
13
14
  require_relative '../support/expectation_helper'
14
15
 
@@ -19,15 +20,18 @@ module Rley # Open this namespace to avoid module qualifier prefixes
19
20
  module Parser # Open this namespace to avoid module qualifier prefixes
20
21
  describe GFGEarleyParser do
21
22
  include ExpectationHelper # Mix-in with expectation on parse entry sets
22
-
23
+
24
+ # rubocop: disable Lint/ConstantDefinitionInBlock
25
+
23
26
  Keyword = {
24
27
  'else' => 'ELSE',
25
28
  'false' => 'FALSE',
26
29
  'if' => 'IF',
27
30
  'then' => 'THEN',
28
31
  'true' => 'TRUE'
29
- }.freeze
30
-
32
+ }.freeze
33
+ # rubocop: enable Lint/ConstantDefinitionInBlock
34
+
31
35
  def tokenizer(aTextToParse)
32
36
  scanner = StringScanner.new(aTextToParse)
33
37
  tokens = []
@@ -35,20 +39,21 @@ module Rley # Open this namespace to avoid module qualifier prefixes
35
39
  loop do
36
40
  scanner.skip(/\s+/)
37
41
  break if scanner.eos?
38
- curr_pos = scanner.pos
39
- lexeme = scanner.scan(/\S+/)
42
+
43
+ curr_pos = scanner.pos
44
+ lexeme = scanner.scan(/\S+/)
40
45
 
41
46
  term_name = Keyword[lexeme]
42
47
  unless term_name
43
48
  if lexeme =~ /\d+/
44
49
  term_name = 'INTEGER'
45
- else
50
+ else
46
51
  err_msg = "Unknown token '#{lexeme}'"
47
52
  raise StandardError, err_msg
48
53
  end
49
54
  end
50
55
  pos = Rley::Lexical::Position.new(1, curr_pos + 1)
51
- tokens << Rley::Lexical::Token.new(lexeme, term_name, pos)
56
+ tokens << Rley::Lexical::Token.new(lexeme, term_name, pos)
52
57
  end
53
58
 
54
59
  tokens
@@ -57,12 +62,12 @@ module Rley # Open this namespace to avoid module qualifier prefixes
57
62
  let(:input) { 'if false then if true then 1 else 2' }
58
63
 
59
64
  context 'Ambiguous parse: ' do
60
- # Factory method. Creates a grammar builder for a simple grammar.
65
+ # Factory method. Creates a grammar builder for a simple grammar.
61
66
  def grammar_if_else_amb
62
- builder = Rley::Syntax::BaseGrammarBuilder.new do
67
+ builder = Rley::Notation::GrammarBuilder.new do
63
68
  add_terminals('IF', 'THEN', 'ELSE')
64
69
  add_terminals('FALSE', 'TRUE', 'INTEGER')
65
-
70
+
66
71
  rule 'program' => 'stmt'
67
72
  rule 'stmt' => 'IF boolean THEN stmt'
68
73
  rule 'stmt' => 'IF boolean THEN stmt ELSE stmt'
@@ -72,7 +77,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
72
77
  rule 'boolean' => 'FALSE'
73
78
  rule 'boolean' => 'TRUE'
74
79
  end
75
-
80
+
76
81
  builder.grammar
77
82
  end
78
83
 
@@ -285,7 +290,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
285
290
 
286
291
  # Factory method. Creates a grammar builder for a simple grammar.
287
292
  def grammar_if_else
288
- builder = Rley::Syntax::BaseGrammarBuilder.new do
293
+ builder = Rley::Notation::GrammarBuilder.new do
289
294
  add_terminals('IF', 'THEN', 'ELSE')
290
295
  add_terminals('FALSE', 'TRUE', 'INTEGER')
291
296
 
@@ -294,7 +299,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
294
299
 
295
300
  # To prevent dangling else issue, the ELSE must match the closest preceding IF
296
301
  # rule 'stmt' => 'IF boolean THEN stmt ELSE{closest IF} stmt'
297
- rule 'stmt' => 'IF boolean THEN stmt ELSE stmt'
302
+ rule 'stmt' => 'IF boolean THEN stmt ELSE { match_closest: "IF" } stmt'
298
303
  rule 'stmt' => 'literal'
299
304
  rule 'literal' => 'boolean'
300
305
  rule 'literal' => 'INTEGER'
@@ -302,10 +307,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
302
307
  rule 'boolean' => 'TRUE'
303
308
  end
304
309
 
305
- grm = builder.grammar
306
- match_else_with_if(grm)
307
-
308
- grm
310
+ builder.grammar
309
311
  end
310
312
 
311
313
  subject { GFGEarleyParser.new(grammar_if_else) }
@@ -390,7 +392,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
390
392
  'boolean => . TRUE | 8'
391
393
  ]
392
394
  result8 = parse_result.chart[8]
393
- found = parse_result.chart.search_entries(4, {before: 'IF'})
395
+ # found = parse_result.chart.search_entries(4, { before: 'IF' })
394
396
  expect(result8.entries.size).to eq(11)
395
397
  compare_entry_texts(result8, expected)
396
398
  expected_terminals(result8, %w[FALSE IF INTEGER TRUE])
@@ -441,5 +443,3 @@ module Rley # Open this namespace to avoid module qualifier prefixes
441
443
  end # describe
442
444
  end # module
443
445
  end # module
444
-
445
-
@@ -7,7 +7,6 @@ require_relative '../../../lib/rley/syntax/terminal'
7
7
  require_relative '../../../lib/rley/lexical/token'
8
8
  require_relative '../../../lib/rley/gfg/start_vertex'
9
9
  require_relative '../../../lib/rley/parser/parse_entry'
10
- require_relative '../../../lib/rley/parser/parse_tracer'
11
10
  require_relative '../../../lib/rley/base/grm_items_builder'
12
11
  require_relative '../../../lib/rley/gfg/grm_flow_graph'
13
12
  require_relative '../support/grammar_abc_helper'