iregexp 0.0.1 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6fe6ee35f1dd62cd10b9aa7105cf58c46f76c16f20a23a752c70ffd3e043fb6
4
- data.tar.gz: 93a7a857b277c22f055b922761cdd152524fd48c8755ca503501f5082bf78263
3
+ metadata.gz: b48ffdc37779e3d0a862960ac7fcfd685de4cf59ef24dbc7556557372c5058c5
4
+ data.tar.gz: 074b33ad95b11cef1dc154f90eeee325432172d1721da222b08ab178791ae504
5
5
  SHA512:
6
- metadata.gz: c8dc4f7369ab2e828fb3be27f848369a7763a4345f0aec9026a11b4397a3ef2b3bfc34648bcf18013435be8fac05582203b965f5bbd9ead54cbcc10d48774354
7
- data.tar.gz: 1d43505cf373b29f6cf8e670b644e879e10b0dba00a4efc06c56610026be8fb3c796fd96f1ca9247ef170682b92f0b8d223f96367bc78c86453eef153c621a11
6
+ metadata.gz: 423cf8699b215e8aa87d6480a15be10d4964e1b51ebe736e721369c0d5a7d499786af1ab600b42d478f1ece5363557cd94c9d7bdc631a28ae7d7d935631eb102
7
+ data.tar.gz: aa366d615c0e246d50653a41efa1f852caf596db29952c0864c5fa63a3a9f69e545fc3242ff712726555fff97c5cfaa7e46a52de0420dfb302365563e15066a2
data/bin/iregexp CHANGED
@@ -15,7 +15,7 @@ FUNCSIG_CHARS = {"l" => :logical, "n" => :nodes, "v" => :value}
15
15
  $options = OpenStruct.new
16
16
  begin
17
17
  op = OptionParser.new do |opts|
18
- opts.banner = "Usage: jpt.rb [options] file.jp"
18
+ opts.banner = "Usage: iregexp [options] file | -e expr"
19
19
 
20
20
  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
21
21
  $options.verbose = v
data/iregexp.gemspec CHANGED
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "iregexp"
3
- s.version = "0.0.1"
3
+ s.version = "0.0.3"
4
4
  s.summary = "I-Regexp Tools"
5
5
  s.description = %q{iregexp implements converters and miscellaneous tools for I-Regexp}
6
6
  s.author = "Carsten Bormann"
7
7
  s.email = "cabo@tzi.org"
8
8
  s.license = "MIT"
9
9
  s.homepage = "http://github.com/cabo/iregexp"
10
- s.files = Dir['lib/**/*.rb'] + %w(iregexp.gemspec) + Dir['data/*'] + Dir['bin/**/*.rb']
10
+ s.files = Dir['lib/**/*.rb'] + %w(iregexp.gemspec) + Dir['data/*'] + Dir['test-data/*'] + Dir['bin/**/*.rb']
11
11
  s.executables = Dir['bin/*'].map {|x| File.basename(x)}
12
12
  s.required_ruby_version = '>= 3.0'
13
13
 
data/lib/iregexp.rb CHANGED
@@ -16,7 +16,7 @@ class IREGEXP
16
16
  reason << line
17
17
  reason << "#{'~' * (parser.failure_column - 1)}^"
18
18
  end
19
- reason.join("\n").gsub(/[\u0000-\u0009\u000b\u001f\u007f]/) {|c| "\\u%04x" % c.ord}
19
+ reason.join("\n").gsub(/[\u0000-\u0009\u000b-\u001f\u007f]/) {|c| "\\u%04x" % c.ord}
20
20
  end
21
21
 
22
22
  SAFE_FN = /\A[-._a-zA-Z0-9]+\z/
@@ -24,7 +24,7 @@ class IREGEXP
24
24
  def self.from_iregexp(s)
25
25
  ast = @@parser.parse s
26
26
  if !ast
27
- fail ParseError.new(self.reason(@@parser, s))
27
+ fail ParseError.new("\n" << self.reason(@@parser, s))
28
28
  end
29
29
  ret = IREGEXP.new(ast)
30
30
 
@@ -196,19 +196,6 @@ module IREGEXPGRAMMAR
196
196
  end
197
197
  end
198
198
 
199
- module Quantifier1
200
- def quantity
201
- elements[1]
202
- end
203
-
204
- end
205
-
206
- module Quantifier2
207
- def ast
208
- quantity.ast
209
- end
210
- end
211
-
212
199
  def _nt_quantifier
213
200
  start_index = index
214
201
  if node_cache[:quantifier].has_key?(index)
@@ -222,11 +209,11 @@ module IREGEXPGRAMMAR
222
209
 
223
210
  i0 = index
224
211
  i1 = index
225
- if has_terminal?(@regexps[gr = '\A[\\*-\\+]'] ||= Regexp.new(gr), :regexp, index)
212
+ if (match_len = has_terminal?("*", false, index))
226
213
  r2 = true
227
- @index += 1
214
+ @index += match_len
228
215
  else
229
- terminal_parse_failure('[\\*-\\+]')
216
+ terminal_parse_failure('"*"')
230
217
  r2 = nil
231
218
  end
232
219
  if r2
@@ -235,11 +222,11 @@ module IREGEXPGRAMMAR
235
222
  r1.extend(Quantifier0)
236
223
  r1.extend(Quantifier0)
237
224
  else
238
- if (match_len = has_terminal?("?", false, index))
225
+ if (match_len = has_terminal?("+", false, index))
239
226
  r3 = true
240
227
  @index += match_len
241
228
  else
242
- terminal_parse_failure('"?"')
229
+ terminal_parse_failure('"+"')
243
230
  r3 = nil
244
231
  end
245
232
  if r3
@@ -248,48 +235,32 @@ module IREGEXPGRAMMAR
248
235
  r1.extend(Quantifier0)
249
236
  r1.extend(Quantifier0)
250
237
  else
251
- @index = i1
252
- r1 = nil
238
+ if (match_len = has_terminal?("?", false, index))
239
+ r4 = true
240
+ @index += match_len
241
+ else
242
+ terminal_parse_failure('"?"')
243
+ r4 = nil
244
+ end
245
+ if r4
246
+ r4 = SyntaxNode.new(input, (index-1)...index) if r4 == true
247
+ r1 = r4
248
+ r1.extend(Quantifier0)
249
+ r1.extend(Quantifier0)
250
+ else
251
+ @index = i1
252
+ r1 = nil
253
+ end
253
254
  end
254
255
  end
255
256
  if r1
256
257
  r1 = SyntaxNode.new(input, (index-1)...index) if r1 == true
257
258
  r0 = r1
258
259
  else
259
- i4, s4 = index, []
260
- if (match_len = has_terminal?("{", false, index))
261
- r5 = true
262
- @index += match_len
263
- else
264
- terminal_parse_failure('"{"')
265
- r5 = nil
266
- end
267
- s4 << r5
260
+ r5 = _nt_range_quantifier
268
261
  if r5
269
- r6 = _nt_quantity
270
- s4 << r6
271
- if r6
272
- if (match_len = has_terminal?("}", false, index))
273
- r7 = true
274
- @index += match_len
275
- else
276
- terminal_parse_failure('"}"')
277
- r7 = nil
278
- end
279
- s4 << r7
280
- end
281
- end
282
- if s4.last
283
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
284
- r4.extend(Quantifier1)
285
- r4.extend(Quantifier2)
286
- else
287
- @index = i4
288
- r4 = nil
289
- end
290
- if r4
291
- r4 = SyntaxNode.new(input, (index-1)...index) if r4 == true
292
- r0 = r4
262
+ r5 = SyntaxNode.new(input, (index-1)...index) if r5 == true
263
+ r0 = r5
293
264
  else
294
265
  @index = i0
295
266
  r0 = nil
@@ -301,20 +272,20 @@ module IREGEXPGRAMMAR
301
272
  r0
302
273
  end
303
274
 
304
- module Quantity0
275
+ module RangeQuantifier0
305
276
  end
306
277
 
307
- module Quantity1
278
+ module RangeQuantifier1
308
279
  def QuantExact
309
- elements[0]
280
+ elements[1]
310
281
  end
311
282
 
312
283
  end
313
284
 
314
- module Quantity2
285
+ module RangeQuantifier2
315
286
  def ast
316
- l = elements[0].ast
317
- r = if rp = elements[1].elements
287
+ l = elements[1].ast
288
+ r = if rp = elements[2].elements
318
289
  if rp[1].text_value != ''
319
290
  rp[1].ast
320
291
  else
@@ -327,63 +298,83 @@ module IREGEXPGRAMMAR
327
298
  end
328
299
  end
329
300
 
330
- def _nt_quantity
301
+ def _nt_range_quantifier
331
302
  start_index = index
332
- if node_cache[:quantity].has_key?(index)
333
- cached = node_cache[:quantity][index]
303
+ if node_cache[:range_quantifier].has_key?(index)
304
+ cached = node_cache[:range_quantifier][index]
334
305
  if cached
335
- node_cache[:quantity][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
306
+ node_cache[:range_quantifier][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
336
307
  @index = cached.interval.end
337
308
  end
338
309
  return cached
339
310
  end
340
311
 
341
312
  i0, s0 = index, []
342
- r1 = _nt_QuantExact
313
+ if (match_len = has_terminal?("{", false, index))
314
+ r1 = true
315
+ @index += match_len
316
+ else
317
+ terminal_parse_failure('"{"')
318
+ r1 = nil
319
+ end
343
320
  s0 << r1
344
321
  if r1
345
- i3, s3 = index, []
346
- if (match_len = has_terminal?(",", false, index))
347
- r4 = true
348
- @index += match_len
349
- else
350
- terminal_parse_failure('","')
351
- r4 = nil
352
- end
353
- s3 << r4
354
- if r4
355
- r6 = _nt_QuantExact
356
- if r6
357
- r5 = r6
322
+ r2 = _nt_QuantExact
323
+ s0 << r2
324
+ if r2
325
+ i4, s4 = index, []
326
+ if (match_len = has_terminal?(",", false, index))
327
+ r5 = true
328
+ @index += match_len
358
329
  else
359
- r5 = instantiate_node(SyntaxNode,input, index...index)
330
+ terminal_parse_failure('","')
331
+ r5 = nil
332
+ end
333
+ s4 << r5
334
+ if r5
335
+ r7 = _nt_QuantExact
336
+ if r7
337
+ r6 = r7
338
+ else
339
+ r6 = instantiate_node(SyntaxNode,input, index...index)
340
+ end
341
+ s4 << r6
342
+ end
343
+ if s4.last
344
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
345
+ r4.extend(RangeQuantifier0)
346
+ else
347
+ @index = i4
348
+ r4 = nil
349
+ end
350
+ if r4
351
+ r3 = r4
352
+ else
353
+ r3 = instantiate_node(SyntaxNode,input, index...index)
354
+ end
355
+ s0 << r3
356
+ if r3
357
+ if (match_len = has_terminal?("}", false, index))
358
+ r8 = true
359
+ @index += match_len
360
+ else
361
+ terminal_parse_failure('"}"')
362
+ r8 = nil
363
+ end
364
+ s0 << r8
360
365
  end
361
- s3 << r5
362
- end
363
- if s3.last
364
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
365
- r3.extend(Quantity0)
366
- else
367
- @index = i3
368
- r3 = nil
369
- end
370
- if r3
371
- r2 = r3
372
- else
373
- r2 = instantiate_node(SyntaxNode,input, index...index)
374
366
  end
375
- s0 << r2
376
367
  end
377
368
  if s0.last
378
369
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
379
- r0.extend(Quantity1)
380
- r0.extend(Quantity2)
370
+ r0.extend(RangeQuantifier1)
371
+ r0.extend(RangeQuantifier2)
381
372
  else
382
373
  @index = i0
383
374
  r0 = nil
384
375
  end
385
376
 
386
- node_cache[:quantity][start_index] = r0
377
+ node_cache[:range_quantifier][start_index] = r0
387
378
 
388
379
  r0
389
380
  end
@@ -547,11 +538,11 @@ module IREGEXPGRAMMAR
547
538
  r0.extend(NormalChar0)
548
539
  r0.extend(NormalChar0)
549
540
  else
550
- if has_terminal?(@regexps[gr = '\A[,-\\-]'] ||= Regexp.new(gr), :regexp, index)
541
+ if (match_len = has_terminal?(",", false, index))
551
542
  r2 = true
552
- @index += 1
543
+ @index += match_len
553
544
  else
554
- terminal_parse_failure('[,-\\-]')
545
+ terminal_parse_failure('","')
555
546
  r2 = nil
556
547
  end
557
548
  if r2
@@ -560,11 +551,11 @@ module IREGEXPGRAMMAR
560
551
  r0.extend(NormalChar0)
561
552
  r0.extend(NormalChar0)
562
553
  else
563
- if has_terminal?(@regexps[gr = '\A[/->]'] ||= Regexp.new(gr), :regexp, index)
554
+ if (match_len = has_terminal?("-", false, index))
564
555
  r3 = true
565
- @index += 1
556
+ @index += match_len
566
557
  else
567
- terminal_parse_failure('[/->]')
558
+ terminal_parse_failure('"-"')
568
559
  r3 = nil
569
560
  end
570
561
  if r3
@@ -573,11 +564,11 @@ module IREGEXPGRAMMAR
573
564
  r0.extend(NormalChar0)
574
565
  r0.extend(NormalChar0)
575
566
  else
576
- if has_terminal?(@regexps[gr = '\A[@-Z]'] ||= Regexp.new(gr), :regexp, index)
567
+ if has_terminal?(@regexps[gr = '\A[/->]'] ||= Regexp.new(gr), :regexp, index)
577
568
  r4 = true
578
569
  @index += 1
579
570
  else
580
- terminal_parse_failure('[@-Z]')
571
+ terminal_parse_failure('[/->]')
581
572
  r4 = nil
582
573
  end
583
574
  if r4
@@ -586,11 +577,11 @@ module IREGEXPGRAMMAR
586
577
  r0.extend(NormalChar0)
587
578
  r0.extend(NormalChar0)
588
579
  else
589
- if has_terminal?(@regexps[gr = '\A[\\^-z]'] ||= Regexp.new(gr), :regexp, index)
580
+ if has_terminal?(@regexps[gr = '\A[@-Z]'] ||= Regexp.new(gr), :regexp, index)
590
581
  r5 = true
591
582
  @index += 1
592
583
  else
593
- terminal_parse_failure('[\\^-z]')
584
+ terminal_parse_failure('[@-Z]')
594
585
  r5 = nil
595
586
  end
596
587
  if r5
@@ -599,11 +590,11 @@ module IREGEXPGRAMMAR
599
590
  r0.extend(NormalChar0)
600
591
  r0.extend(NormalChar0)
601
592
  else
602
- if has_terminal?(@regexps[gr = '\A[~-􏿿]'] ||= Regexp.new(gr), :regexp, index)
593
+ if has_terminal?(@regexps[gr = '\A[\\^-z]'] ||= Regexp.new(gr), :regexp, index)
603
594
  r6 = true
604
595
  @index += 1
605
596
  else
606
- terminal_parse_failure('[~-􏿿]')
597
+ terminal_parse_failure('[\\^-z]')
607
598
  r6 = nil
608
599
  end
609
600
  if r6
@@ -612,8 +603,22 @@ module IREGEXPGRAMMAR
612
603
  r0.extend(NormalChar0)
613
604
  r0.extend(NormalChar0)
614
605
  else
615
- @index = i0
616
- r0 = nil
606
+ if has_terminal?(@regexps[gr = '\A[~-􏿿]'] ||= Regexp.new(gr), :regexp, index)
607
+ r7 = true
608
+ @index += 1
609
+ else
610
+ terminal_parse_failure('[~-􏿿]')
611
+ r7 = nil
612
+ end
613
+ if r7
614
+ r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
615
+ r0 = r7
616
+ r0.extend(NormalChar0)
617
+ r0.extend(NormalChar0)
618
+ else
619
+ @index = i0
620
+ r0 = nil
621
+ end
617
622
  end
618
623
  end
619
624
  end
@@ -726,85 +731,97 @@ module IREGEXPGRAMMAR
726
731
  r3 = SyntaxNode.new(input, (index-1)...index) if r3 == true
727
732
  r2 = r3
728
733
  else
729
- if has_terminal?(@regexps[gr = '\A[\\--\\.]'] ||= Regexp.new(gr), :regexp, index)
734
+ if (match_len = has_terminal?("-", false, index))
730
735
  r4 = true
731
- @index += 1
736
+ @index += match_len
732
737
  else
733
- terminal_parse_failure('[\\--\\.]')
738
+ terminal_parse_failure('"-"')
734
739
  r4 = nil
735
740
  end
736
741
  if r4
737
742
  r4 = SyntaxNode.new(input, (index-1)...index) if r4 == true
738
743
  r2 = r4
739
744
  else
740
- if (match_len = has_terminal?("?", false, index))
745
+ if (match_len = has_terminal?(".", false, index))
741
746
  r5 = true
742
747
  @index += match_len
743
748
  else
744
- terminal_parse_failure('"?"')
749
+ terminal_parse_failure('"."')
745
750
  r5 = nil
746
751
  end
747
752
  if r5
748
753
  r5 = SyntaxNode.new(input, (index-1)...index) if r5 == true
749
754
  r2 = r5
750
755
  else
751
- if has_terminal?(@regexps[gr = '\A[\\[-\\^]'] ||= Regexp.new(gr), :regexp, index)
756
+ if (match_len = has_terminal?("?", false, index))
752
757
  r6 = true
753
- @index += 1
758
+ @index += match_len
754
759
  else
755
- terminal_parse_failure('[\\[-\\^]')
760
+ terminal_parse_failure('"?"')
756
761
  r6 = nil
757
762
  end
758
763
  if r6
759
764
  r6 = SyntaxNode.new(input, (index-1)...index) if r6 == true
760
765
  r2 = r6
761
766
  else
762
- if (match_len = has_terminal?("n", false, index))
767
+ if has_terminal?(@regexps[gr = '\A[\\[-\\^]'] ||= Regexp.new(gr), :regexp, index)
763
768
  r7 = true
764
- @index += match_len
769
+ @index += 1
765
770
  else
766
- terminal_parse_failure('"n"')
771
+ terminal_parse_failure('[\\[-\\^]')
767
772
  r7 = nil
768
773
  end
769
774
  if r7
770
775
  r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
771
776
  r2 = r7
772
777
  else
773
- if (match_len = has_terminal?("r", false, index))
778
+ if (match_len = has_terminal?("n", false, index))
774
779
  r8 = true
775
780
  @index += match_len
776
781
  else
777
- terminal_parse_failure('"r"')
782
+ terminal_parse_failure('"n"')
778
783
  r8 = nil
779
784
  end
780
785
  if r8
781
786
  r8 = SyntaxNode.new(input, (index-1)...index) if r8 == true
782
787
  r2 = r8
783
788
  else
784
- if (match_len = has_terminal?("t", false, index))
789
+ if (match_len = has_terminal?("r", false, index))
785
790
  r9 = true
786
791
  @index += match_len
787
792
  else
788
- terminal_parse_failure('"t"')
793
+ terminal_parse_failure('"r"')
789
794
  r9 = nil
790
795
  end
791
796
  if r9
792
797
  r9 = SyntaxNode.new(input, (index-1)...index) if r9 == true
793
798
  r2 = r9
794
799
  else
795
- if has_terminal?(@regexps[gr = '\A[\\{-\\}]'] ||= Regexp.new(gr), :regexp, index)
800
+ if (match_len = has_terminal?("t", false, index))
796
801
  r10 = true
797
- @index += 1
802
+ @index += match_len
798
803
  else
799
- terminal_parse_failure('[\\{-\\}]')
804
+ terminal_parse_failure('"t"')
800
805
  r10 = nil
801
806
  end
802
807
  if r10
803
808
  r10 = SyntaxNode.new(input, (index-1)...index) if r10 == true
804
809
  r2 = r10
805
810
  else
806
- @index = i2
807
- r2 = nil
811
+ if has_terminal?(@regexps[gr = '\A[\\{-\\}]'] ||= Regexp.new(gr), :regexp, index)
812
+ r11 = true
813
+ @index += 1
814
+ else
815
+ terminal_parse_failure('[\\{-\\}]')
816
+ r11 = nil
817
+ end
818
+ if r11
819
+ r11 = SyntaxNode.new(input, (index-1)...index) if r11 == true
820
+ r2 = r11
821
+ else
822
+ @index = i2
823
+ r2 = nil
824
+ end
808
825
  end
809
826
  end
810
827
  end
@@ -1390,41 +1407,65 @@ module IREGEXPGRAMMAR
1390
1407
  s0 << r1
1391
1408
  if r1
1392
1409
  i3 = index
1393
- if has_terminal?(@regexps[gr = '\A[l-m]'] ||= Regexp.new(gr), :regexp, index)
1410
+ if (match_len = has_terminal?("l", false, index))
1394
1411
  r4 = true
1395
- @index += 1
1412
+ @index += match_len
1396
1413
  else
1397
- terminal_parse_failure('[l-m]')
1414
+ terminal_parse_failure('"l"')
1398
1415
  r4 = nil
1399
1416
  end
1400
1417
  if r4
1401
1418
  r4 = SyntaxNode.new(input, (index-1)...index) if r4 == true
1402
1419
  r3 = r4
1403
1420
  else
1404
- if (match_len = has_terminal?("o", false, index))
1421
+ if (match_len = has_terminal?("m", false, index))
1405
1422
  r5 = true
1406
1423
  @index += match_len
1407
1424
  else
1408
- terminal_parse_failure('"o"')
1425
+ terminal_parse_failure('"m"')
1409
1426
  r5 = nil
1410
1427
  end
1411
1428
  if r5
1412
1429
  r5 = SyntaxNode.new(input, (index-1)...index) if r5 == true
1413
1430
  r3 = r5
1414
1431
  else
1415
- if has_terminal?(@regexps[gr = '\A[t-u]'] ||= Regexp.new(gr), :regexp, index)
1432
+ if (match_len = has_terminal?("o", false, index))
1416
1433
  r6 = true
1417
- @index += 1
1434
+ @index += match_len
1418
1435
  else
1419
- terminal_parse_failure('[t-u]')
1436
+ terminal_parse_failure('"o"')
1420
1437
  r6 = nil
1421
1438
  end
1422
1439
  if r6
1423
1440
  r6 = SyntaxNode.new(input, (index-1)...index) if r6 == true
1424
1441
  r3 = r6
1425
1442
  else
1426
- @index = i3
1427
- r3 = nil
1443
+ if (match_len = has_terminal?("t", false, index))
1444
+ r7 = true
1445
+ @index += match_len
1446
+ else
1447
+ terminal_parse_failure('"t"')
1448
+ r7 = nil
1449
+ end
1450
+ if r7
1451
+ r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
1452
+ r3 = r7
1453
+ else
1454
+ if (match_len = has_terminal?("u", false, index))
1455
+ r8 = true
1456
+ @index += match_len
1457
+ else
1458
+ terminal_parse_failure('"u"')
1459
+ r8 = nil
1460
+ end
1461
+ if r8
1462
+ r8 = SyntaxNode.new(input, (index-1)...index) if r8 == true
1463
+ r3 = r8
1464
+ else
1465
+ @index = i3
1466
+ r3 = nil
1467
+ end
1468
+ end
1428
1469
  end
1429
1470
  end
1430
1471
  end
@@ -1934,19 +1975,31 @@ module IREGEXPGRAMMAR
1934
1975
  r5 = SyntaxNode.new(input, (index-1)...index) if r5 == true
1935
1976
  r3 = r5
1936
1977
  else
1937
- if has_terminal?(@regexps[gr = '\A[n-o]'] ||= Regexp.new(gr), :regexp, index)
1978
+ if (match_len = has_terminal?("n", false, index))
1938
1979
  r6 = true
1939
- @index += 1
1980
+ @index += match_len
1940
1981
  else
1941
- terminal_parse_failure('[n-o]')
1982
+ terminal_parse_failure('"n"')
1942
1983
  r6 = nil
1943
1984
  end
1944
1985
  if r6
1945
1986
  r6 = SyntaxNode.new(input, (index-1)...index) if r6 == true
1946
1987
  r3 = r6
1947
1988
  else
1948
- @index = i3
1949
- r3 = nil
1989
+ if (match_len = has_terminal?("o", false, index))
1990
+ r7 = true
1991
+ @index += match_len
1992
+ else
1993
+ terminal_parse_failure('"o"')
1994
+ r7 = nil
1995
+ end
1996
+ if r7
1997
+ r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
1998
+ r3 = r7
1999
+ else
2000
+ @index = i3
2001
+ r3 = nil
2002
+ end
1950
2003
  end
1951
2004
  end
1952
2005
  end
@@ -0,0 +1,49 @@
1
+ =
2
+ =.
3
+ =a
4
+ =🤔
5
+ -\
6
+ -\v
7
+ -\\\
8
+ -\\\v
9
+ -\\\z
10
+ -\ca
11
+ =\(\)\*\+\.\?\[\\
12
+ =\]\{\|\}\t\r\n
13
+ =a*
14
+ =🤔*
15
+ -a**
16
+ =a|b
17
+ =aa|bb
18
+ =aa|
19
+ =|bb
20
+ =aa|bb*
21
+ =aa|bb+
22
+ =aa|bb?
23
+ =aa|bb{6}
24
+ =aa|bb{6,}
25
+ =aa|bb{6,8}
26
+ =(aa)
27
+ -aa)
28
+ -(aa
29
+ =aa(bb|cc)dd
30
+ -aabb|cc)dd
31
+ -aa(bb|ccdd
32
+ =[abc]
33
+ -[a
34
+ -a]
35
+ =[a🤔b]
36
+ =[^abc]
37
+ =[ab-f]
38
+ =[^ab-f]
39
+ =[^-ab-f]
40
+ =[-ab-f]
41
+ =[ab-f-]
42
+ =[a\n-\r-]
43
+ =\p{Nd}
44
+ =\P{Ll}
45
+ =\P{L}
46
+ =\p{Co}
47
+ *[\p{Nd}]
48
+ *[\P{Nd}]
49
+ *[^\p{Nd}\p{Ll}]
@@ -0,0 +1,114 @@
1
+ = ["seq"]
2
+ ""
3
+ =. ["dot"]
4
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"
5
+ =a "a"
6
+ "a"
7
+ =🤔 "🤔"
8
+ "🤔"
9
+ -\ Expected one of [\(-\+], "-", ".", "?", [\[-\^], "n", "r", "t", [\{-\}] at line 1, column 2 (byte 2):
10
+ \
11
+ ~^
12
+ -\v Expected one of [\(-\+], "-", ".", "?", [\[-\^], "n", "r", "t", [\{-\}] at line 1, column 2 (byte 2):
13
+ \v
14
+ ~^
15
+ -\\\ Expected one of [\(-\+], "-", ".", "?", [\[-\^], "n", "r", "t", [\{-\}] at line 1, column 4 (byte 4):
16
+ \\\
17
+ ~~~^
18
+ -\\\v Expected one of [\(-\+], "-", ".", "?", [\[-\^], "n", "r", "t", [\{-\}] at line 1, column 4 (byte 4):
19
+ \\\v
20
+ ~~~^
21
+ -\\\z Expected one of [\(-\+], "-", ".", "?", [\[-\^], "n", "r", "t", [\{-\}] at line 1, column 4 (byte 4):
22
+ \\\z
23
+ ~~~^
24
+ -\ca Expected one of [\(-\+], "-", ".", "?", [\[-\^], "n", "r", "t", [\{-\}] at line 1, column 2 (byte 2):
25
+ \ca
26
+ ~^
27
+ =\(\)\*\+\.\?\[\\ ["seq", "(", ")", "*", "+", ".", "?", "[", "\\"]
28
+ "()*+.?[\\"
29
+ =\]\{\|\}\t\r\n ["seq", "]", "{", "|", "}", "\t", "\r", "\n"]
30
+ "]{|}\t\r\n"
31
+ =a* ["rep", 0, false, "a"]
32
+ "", "a", "aa", "aaa", "aaaa"
33
+ =🤔* ["rep", 0, false, "🤔"]
34
+ "", "🤔", "🤔🤔", "🤔🤔🤔", "🤔🤔🤔🤔"
35
+ -a** Expected one of [\u0000-'], ",", "-", [/->], [@-Z], [\^-z], [~-􏿿], ".", "\\", "\\p{", "\\P{", "[", "(", "|" at line 1, column 3 (byte 3):
36
+ a**
37
+ ~~^
38
+ =a|b ["alt", "a", "b"]
39
+ "a", "b"
40
+ =aa|bb ["alt", ["seq", "a", "a"], ["seq", "b", "b"]]
41
+ "aa", "bb"
42
+ =aa| ["alt", ["seq", "a", "a"], ["seq"]]
43
+ "aa", ""
44
+ =|bb ["alt", ["seq"], ["seq", "b", "b"]]
45
+ "", "bb"
46
+ =aa|bb* ["alt", ["seq", "a", "a"], ["seq", "b", ["rep", 0, false, "b"]]]
47
+ "aa", "b", "bb", "bbb", "bbbb", "bbbbb"
48
+ =aa|bb+ ["alt", ["seq", "a", "a"], ["seq", "b", ["rep", 1, false, "b"]]]
49
+ "aa", "bb", "bbb", "bbbb", "bbbbb", "bbbbbb"
50
+ =aa|bb? ["alt", ["seq", "a", "a"], ["seq", "b", ["rep", 0, 1, "b"]]]
51
+ "aa", "b", "bb"
52
+ =aa|bb{6} ["alt", ["seq", "a", "a"], ["seq", "b", ["rep", 6, 6, "b"]]]
53
+ "aa", "bbbbbbb"
54
+ =aa|bb{6,} ["alt", ["seq", "a", "a"], ["seq", "b", ["rep", 6, false, "b"]]]
55
+ "aa", "bbbbbbb", "bbbbbbbb", "bbbbbbbbb", "bbbbbbbbbb", "bbbbbbbbbbb"
56
+ =aa|bb{6,8} ["alt", ["seq", "a", "a"], ["seq", "b", ["rep", 6, 8, "b"]]]
57
+ "aa", "bbbbbbb", "bbbbbbbb", "bbbbbbbbb"
58
+ =(aa) ["seq", "a", "a"]
59
+ "aa"
60
+ -aa) Expected one of "*", "+", "?", "{", [\u0000-'], ",", "-", [/->], [@-Z], [\^-z], [~-􏿿], ".", "\\", "\\p{", "\\P{", "[", "(", "|" at line 1, column 3 (byte 3):
61
+ aa)
62
+ ~~^
63
+ -(aa Expected one of "*", "+", "?", "{", [\u0000-'], ",", "-", [/->], [@-Z], [\^-z], [~-􏿿], ".", "\\", "\\p{", "\\P{", "[", "(", "|", ")" at line 1, column 4 (byte 4):
64
+ (aa
65
+ ~~~^
66
+ =aa(bb|cc)dd ["seq", "a", "a", ["alt", ["seq", "b", "b"], ["seq", "c", "c"]], "d", "d"]
67
+ "aabbdd", "aaccdd"
68
+ -aabb|cc)dd Expected one of "*", "+", "?", "{", [\u0000-'], ",", "-", [/->], [@-Z], [\^-z], [~-􏿿], ".", "\\", "\\p{", "\\P{", "[", "(", "|" at line 1, column 8 (byte 8):
69
+ aabb|cc)dd
70
+ ~~~~~~~^
71
+ -aa(bb|ccdd Expected one of "*", "+", "?", "{", [\u0000-'], ",", "-", [/->], [@-Z], [\^-z], [~-􏿿], ".", "\\", "\\p{", "\\P{", "[", "(", "|", ")" at line 1, column 11 (byte 11):
72
+ aa(bb|ccdd
73
+ ~~~~~~~~~~^
74
+ =[abc] ["pos", "a", "b", "c"]
75
+ "a", "b", "c"
76
+ -[a Expected one of "-", [\u0000-,], [\.-Z], [\^-􏿿], "\\", "\\p{", "\\P{", "]" at line 1, column 3 (byte 3):
77
+ [a
78
+ ~~^
79
+ -a] Expected one of "*", "+", "?", "{", [\u0000-'], ",", "-", [/->], [@-Z], [\^-z], [~-􏿿], ".", "\\", "\\p{", "\\P{", "[", "(", "|" at line 1, column 2 (byte 2):
80
+ a]
81
+ ~^
82
+ =[a🤔b] ["pos", "a", "🤔", "b"]
83
+ "a", "🤔", "b"
84
+ =[^abc] ["neg", "a", "b", "c"]
85
+ "\n", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v"
86
+ =[ab-f] ["pos", "a", ["-", "b", "f"]]
87
+ "a", "b", "c", "d", "e", "f"
88
+ =[^ab-f] ["neg", "a", ["-", "b", "f"]]
89
+ "\n", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y"
90
+ =[^-ab-f] ["neg", "-", "a", ["-", "b", "f"]]
91
+ "\n", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y"
92
+ =[-ab-f] ["pos", "-", "a", ["-", "b", "f"]]
93
+ "-", "a", "b", "c", "d", "e", "f"
94
+ =[ab-f-] ["pos", "a", ["-", "b", "f"], "-"]
95
+ "a", "b", "c", "d", "e", "f", "-"
96
+ =[a\n-\r-] ["pos", "a", ["-", "\n", "\r"], "-"]
97
+ "a", "\n", "\u000b", "\f", "\r", "-"
98
+ =\p{Nd} ["p", "Nd"]
99
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"
100
+ =\P{Ll} ["P", "Ll"]
101
+ "\n", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S"
102
+ =\P{L} ["P", "L"]
103
+ "\n", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "!", "\"", "#", "%", "&", "'", "(", ")", "*"
104
+ =\p{Co} ["p", "Co"]
105
+ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
106
+ *[\p{Nd}] ["pos", ["p", "Nd"]]
107
+ bug in regexp example generator:
108
+ "p", "{", "N", "d", "}"
109
+ *[\P{Nd}] ["pos", ["P", "Nd"]]
110
+ bug in regexp example generator:
111
+ "P", "{", "N", "d", "}"
112
+ *[^\p{Nd}\p{Ll}] ["neg", ["p", "Nd"], ["p", "Ll"]]
113
+ bug in regexp example generator:
114
+ "\n", "a", "b", "c", "e", "f", "g", "h", "i", "j", "k", "m", "n", "o", "q", "r", "s", "t", "u", "v"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iregexp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-29 00:00:00.000000000 Z
11
+ date: 2023-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,17 +70,17 @@ description: iregexp implements converters and miscellaneous tools for I-Regexp
70
70
  email: cabo@tzi.org
71
71
  executables:
72
72
  - iregexp
73
- - iregexp~
74
73
  extensions: []
75
74
  extra_rdoc_files: []
76
75
  files:
77
76
  - bin/iregexp
78
- - bin/iregexp~
79
77
  - iregexp.gemspec
80
78
  - lib/iregexp.rb
81
79
  - lib/parser/iregexp-util.rb
82
80
  - lib/parser/iregexpgrammar.rb
83
81
  - lib/writer/iregexp-writer.rb
82
+ - test-data/simple.irl
83
+ - test-data/simple.out
84
84
  homepage: http://github.com/cabo/iregexp
85
85
  licenses:
86
86
  - MIT
data/bin/iregexp~ DELETED
@@ -1,102 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'pp'
3
- require 'yaml'
4
- require 'treetop'
5
- require 'json'
6
-
7
- require_relative '../lib/jpt'
8
-
9
- Encoding.default_external = Encoding::UTF_8
10
- require 'optparse'
11
- require 'ostruct'
12
-
13
- FUNCSIG_CHARS = {"l" => :logical, "n" => :nodes, "v" => :value}
14
-
15
- $options = OpenStruct.new
16
- begin
17
- op = OptionParser.new do |opts|
18
- opts.banner = "Usage: jpt.rb [options] file.jp"
19
-
20
- opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
21
- $options.verbose = v
22
- end
23
- opts.on("-l", "--[no-]lines", "multi-line mode") do |v|
24
- $options.lines = v
25
- end
26
- opts.on("-q", "--[no-]test", "test-file mode") do |v|
27
- $options.test = v
28
- end
29
- opts.on("-fFUNCSIG", "--[no-]f=FUNCSIG", "add function signature name=rppp") do |v|
30
- fail "funcsig format must be name=rppp" unless v =~ /\A([a-z][_a-z0-9]*)-([lnv]+)\z/
31
-
32
- JPTType.add_funcsig($1, $2)
33
- end
34
- opts.on("-tFMT", "--to=FMT", [:basic, :neat, :json, :yaml, :enum, :jp], "Target format") do |v|
35
- $options.target = v
36
- end
37
- end
38
- op.parse!
39
- rescue Exception => e
40
- warn e
41
- exit 1
42
- end
43
-
44
- if ARGV == []
45
- puts op
46
- exit 1
47
- end
48
- jp_file = ARGF.read
49
-
50
- if $options.test
51
- argument = query = output = nil
52
- jp_file.scan(/((?:^(?:$|[^$=].*)\n)+)|([$].*)|=(.*)|#.*/) do |arg,qy,out|
53
- begin
54
- if arg
55
- argument = JSON.parse(arg)
56
- puts
57
- puts JSON.dump(argument)
58
- elsif qy
59
- jpt = JPT.from_jp(qy)
60
- output = jpt.apply(argument)
61
- print jpt.tree.inspect << " "
62
- puts "➔ #{JSON.dump(output)}"
63
- elsif out
64
- suggested = JSON.parse(out)
65
- if output != suggested
66
- p [:SUGGESTED, suggested]
67
- end
68
- end
69
- rescue => e
70
- warn "*** #{e.detailed_message} #{e.backtrace}"
71
- end
72
- end
73
- elsif $options.lines
74
- lines = jp_file.lines(chomp: true)
75
- col = lines.map(&:length).max
76
- form = "%-#{col}s %s"
77
- lines.each do |line|
78
- jpt = JPT.from_jp(line)
79
- result = jpt.tree.inspect
80
- puts form % [line, result]
81
- end
82
- else
83
-
84
- jpt = JPT.from_jp(jp_file)
85
- result = jpt.tree
86
-
87
- case $options.target
88
- when :basic, nil
89
- pp result
90
- when :neat, :json
91
- require 'neatjson'
92
- puts JSON.neat_generate(result, after_comma: 1, after_colon: 1)
93
- when :yaml
94
- puts result.to_yaml
95
- when :jp
96
- require_relative '../lib/writer/jp-writer.rb'
97
- puts jpt.to_s
98
- else
99
- warn ["Unknown target format: ", $options.target].inspect
100
- end
101
-
102
- end