raabro 1.1.6 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2fa1cb664d06179ef03c05a8aa87173c1e097f8d
4
- data.tar.gz: 01f4350acf6028d2b33f5ca0de6775eb7e8d9a8c
2
+ SHA256:
3
+ metadata.gz: 6c97c1720256a9bd016f9a3644bf6a0a407afde36122fe666a415f65d8f11fa2
4
+ data.tar.gz: 0e52242404f2309cbccfd92f7ee1d4ef06777c883d1c40254bddcf033a63752e
5
5
  SHA512:
6
- metadata.gz: 6521b4ace2882213adf5c248181387bcb179df9c1b0b68f8f238cc5de582f773092925a3584146fc5b2944ff981743f8d06708a2965da8bb07c265acc39e3160
7
- data.tar.gz: ce28d1b1114ed171efa5e292f4af867c8a98420eeb157daad52315c44ecde15825a4db20d5e99f3bcf42dc57b968a282b2b5245cdbf7693118accd1923e30098
6
+ metadata.gz: fa0aebdcbfaeadd23dfd1ac8c442e52b839bced502c0ae144c5562bc97fc0e2a54c3114b0e048f47fdcb46c8ac2a7def92b7cd6169256195957bb7acbd65a9a6
7
+ data.tar.gz: e9c3eab148ede2853cafa1ec3fceec9967af83b4c3453017666f01741a0d51cb5eb200dde64e5d7c62ede442768b5f861a3a8bdb5587ded9a6a5afde73844b05
@@ -2,6 +2,34 @@
2
2
  # raabro CHANGELOG.md
3
3
 
4
4
 
5
+ ## raabro 1.4.0 released 2020-10-06
6
+
7
+ * Ensure that jseq, for n elts, parses n-1 separators
8
+ * Introduce Tree #symbol, #symbod, #strind and #strinpd
9
+
10
+
11
+ ## raabro 1.3.3 released 2020-09-24
12
+
13
+ * Merge Henrik's rewrite_ optimization
14
+
15
+
16
+ ## raabro 1.3.2 released 2020-09-24
17
+
18
+ * Make a tiny rewrite_ optimization
19
+
20
+
21
+ ## raabro 1.3.1 released 2020-05-10
22
+
23
+ * Add '!' (not) seq quantifier
24
+
25
+
26
+ ## raabro 1.3.0 released 2020-05-10
27
+
28
+ * Add `nott` parser element
29
+ * Add Tree#strinp and #strim
30
+ * Skip 1.2.0 to align on http://github.com/jmettraux/jaabro
31
+
32
+
5
33
  ## raabro 1.1.6 released 2018-06-22
6
34
 
7
35
  * Remove unused `add` var, gh-2, thanks to https://github.com/utilum
data/CREDITS.md CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  # raabro credits
3
3
 
4
+ * Henryk Nyh https://github.com/henrik optimized rewrite_, gh-6
4
5
  * Utilum https://github.com/utilum removed unused var
5
6
  * John Mettraux https://github.com/jmettraux author and maintainer
6
7
 
@@ -1,5 +1,5 @@
1
1
 
2
- Copyright (c) 2015-2018, John Mettraux, jmettraux@gmail.com
2
+ Copyright (c) 2015-2020, John Mettraux, jmettraux@gmail.com
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
data/Makefile CHANGED
@@ -28,7 +28,7 @@ build: gemspec_validate
28
28
  mv $(NAME)-$(VERSION).gem pkg/
29
29
 
30
30
  push: build
31
- gem push pkg/$(NAME)-$(VERSION).gem
31
+ gem push --otp "$(OTP)" pkg/$(NAME)-$(VERSION).gem
32
32
 
33
33
  spec:
34
34
  bundle exec rspec
data/README.md CHANGED
@@ -27,31 +27,44 @@ module Fun include Raabro
27
27
  #
28
28
  # Last function is the root, "i" stands for "input".
29
29
 
30
- def pa(i); rex(nil, i, /\(\s*/); end
31
- def pz(i); rex(nil, i, /\)\s*/); end
32
- def com(i); rex(nil, i, /,\s*/); end
30
+ def pstart(i); rex(nil, i, /\(\s*/); end
31
+ def pend(i); rex(nil, i, /\)\s*/); end
32
+ # parenthese start and end, including trailing white space
33
+
34
+ def comma(i); rex(nil, i, /,\s*/); end
35
+ # a comma, including trailing white space
33
36
 
34
37
  def num(i); rex(:num, i, /-?[0-9]+\s*/); end
38
+ # name is :num, a positive or negative integer
39
+
40
+ def args(i); eseq(nil, i, :pstart, :exp, :comma, :pend); end
41
+ # a set of :exp, beginning with a (, punctuated by commas and ending with )
35
42
 
36
- def args(i); eseq(nil, i, :pa, :exp, :com, :pz); end
37
43
  def funame(i); rex(nil, i, /[a-z][a-z0-9]*/); end
38
44
  def fun(i); seq(:fun, i, :funame, :args); end
45
+ # name is :fun, a function composed of a function name
46
+ # followed by arguments
39
47
 
40
48
  def exp(i); alt(nil, i, :fun, :num); end
49
+ # an expression is either (alt) a function or a number
41
50
 
42
51
  # rewrite
43
52
  #
44
53
  # Names above (:num, :fun, ...) get a rewrite_xxx function.
45
54
  # "t" stands for "tree".
46
- #
47
- # The trees with a nil name are handled by rewrite_(tree) a default
48
- # rewrite function
49
55
 
56
+ def rewrite_exp(t); rewrite(t.children[0]); end
50
57
  def rewrite_num(t); t.string.to_i; end
51
58
 
52
59
  def rewrite_fun(t)
53
- [ t.children[0].string ] +
54
- t.children[1].odd_children.collect { |a| rewrite(a) }
60
+
61
+ funame, args = t.children
62
+
63
+ [ funame.string ] +
64
+ args.gather.collect { |e| rewrite(e) }
65
+ #
66
+ # #gather collect all the children in a tree that have
67
+ # a name, in this example, names can be :exp, :num, :fun
55
68
  end
56
69
  end
57
70
 
@@ -121,6 +134,9 @@ def altg(name, input, *parsers)
121
134
  def rep(name, input, parser, min, max=0)
122
135
  # repeats the the wrapped parser
123
136
 
137
+ def nott(name, input, parser)
138
+ # succeeds if the wrapped parser fails, fails if it succeeds
139
+
124
140
  def ren(name, input, parser)
125
141
  # renames the output of the wrapped parser
126
142
 
@@ -143,6 +159,8 @@ def eseq(name, input, startpa, eltpa, seppa, endpa)
143
159
 
144
160
  `seq` is special, it understands "quantifiers": `'?'`, `'+'` or `'*'`. They make behave `seq` a bit like a classical regex.
145
161
 
162
+ The `'!'` (bang, not) quantifier is explained at the end of this section.
163
+
146
164
  ```ruby
147
165
  module CartParser include Raabro
148
166
 
@@ -162,6 +180,16 @@ end
162
180
 
163
181
  (Yes, this sample parser parses string like "appletomatocabbage", it's not very useful, but I hope you get the point about `.seq`)
164
182
 
183
+ The `'!'` (bang, not) quantifier is a kind of "negative lookahead".
184
+
185
+ ```ruby
186
+ def menu(i)
187
+ seq(:menu, i, :mise_en_bouche, :main, :main, '!', :dessert)
188
+ end
189
+ ```
190
+
191
+ Lousy example, but here a main cannot follow a main.
192
+
165
193
 
166
194
  ## trees
167
195
 
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module Raabro
3
4
 
4
- VERSION = '1.1.6'
5
+ VERSION = '1.4.0'
5
6
 
6
7
  class Input
7
8
 
@@ -78,15 +79,19 @@ module Raabro
78
79
  @children = successful_children
79
80
  end
80
81
 
81
- def string
82
+ def string; @input.string[@offset, @length]; end
83
+ def strinp; string.strip; end
84
+ alias strim strinp
85
+ def nonstring(l=7); @input.string[@offset, l]; end
82
86
 
83
- @input.string[@offset, @length]
84
- end
85
-
86
- def nonstring(l=7)
87
+ def stringd; string.downcase; end
88
+ alias strind stringd
89
+ def stringpd; strinp.downcase; end
90
+ alias strinpd stringpd
87
91
 
88
- @input.string[@offset, l]
89
- end
92
+ def symbol; strinp.to_sym; end
93
+ def symbold; symbol.downcase; end
94
+ alias symbod symbold
90
95
 
91
96
  def lookup(name=nil)
92
97
 
@@ -177,7 +182,7 @@ module Raabro
177
182
  .collect(&:inspect).join('/')
178
183
  "parsing failed .../#{path}"
179
184
  else
180
- "parsing failed, not all input was consumed"
185
+ 'parsing failed, not all input was consumed'
181
186
  end
182
187
  visual =
183
188
  visual(line, column)
@@ -187,7 +192,7 @@ module Raabro
187
192
 
188
193
  def lookup_error(stack=[])
189
194
 
190
- #print "le(): "; Raabro.pp(self, colors: true)
195
+ #print 'le(): '; Raabro.pp(self, colors: true)
191
196
  return nil if @result != 0
192
197
  return [ self, stack ] if @children.empty?
193
198
  @children.each { |c|
@@ -263,10 +268,11 @@ module Raabro
263
268
  # so that :plus and co can be overriden
264
269
 
265
270
  case parser
266
- when '?', :q, :qmark then [ 0, 1 ]
267
- when '*', :s, :star then [ 0, 0 ]
268
- when '+', :p, :plus then [ 1, 0 ]
269
- else nil
271
+ when '?', :q, :qmark then [ 0, 1 ]
272
+ when '*', :s, :star then [ 0, 0 ]
273
+ when '+', :p, :plus then [ 1, 0 ]
274
+ when '!' then :bang
275
+ else nil
270
276
  end
271
277
  end
272
278
 
@@ -298,7 +304,11 @@ module Raabro
298
304
  pa = parsers.shift
299
305
  break unless pa
300
306
 
301
- if q = _quantify(parsers.first)
307
+ if parsers.first == '!'
308
+ parsers.shift
309
+ c = nott(nil, input, pa)
310
+ r.children << c
311
+ elsif q = _quantify(parsers.first)
302
312
  parsers.shift
303
313
  c = rep(nil, input, pa, *q)
304
314
  r.children.concat(c.children)
@@ -409,6 +419,22 @@ module Raabro
409
419
  end
410
420
  alias rename ren
411
421
 
422
+ def nott(name, input, parser)
423
+
424
+ start = input.offset
425
+
426
+ r = ::Raabro::Tree.new(name, :nott, input)
427
+ c = _parse(parser, input)
428
+ r.children << c
429
+
430
+ r.length = 0
431
+ r.result = c.result == 1 ? 0 : 1
432
+
433
+ input.offset = start
434
+
435
+ r
436
+ end
437
+
412
438
  def all(name, input, parser)
413
439
 
414
440
  start = input.offset
@@ -450,26 +476,36 @@ module Raabro
450
476
 
451
477
  if r.result == 1
452
478
 
453
- i = 0
479
+ on_elt = false
480
+ count = 0
481
+ empty_stack = 0
454
482
 
455
483
  loop do
456
484
 
457
- st = i > 0 ? _parse(seppa, input) : nil
458
- et = st == nil || st.result == 1 ? _parse(eltpa, input) : nil
485
+ on_elt = ! on_elt
459
486
 
460
- break if st && et && st.empty? && et.result == 0
461
- break if st && et && st.empty? && et.empty?
487
+ cr = _parse(on_elt ? eltpa : seppa, input)
462
488
 
463
- r.children << st if st
464
- r.children << et if et
489
+ empty_stack = cr.empty? ? empty_stack + 1 : 0
490
+ cr.result = 0 if empty_stack > 1
491
+ #
492
+ # prevent "no progress"
465
493
 
466
- break if et == nil
467
- break if et.result != 1
494
+ r.children.push(cr)
495
+
496
+ if cr.result != 1
497
+ if on_elt && count > 0
498
+ lsep = r.children[-2]
499
+ lsep.result = 0
500
+ input.offset = lsep.offset
501
+ end
502
+ break
503
+ end
468
504
 
469
- i = i + 1
505
+ count += 1
470
506
  end
471
507
 
472
- r.result = 0 if jseq && i == 0
508
+ r.result = 0 if jseq && count < 1
473
509
  end
474
510
 
475
511
  if r.result == 1 && endpa
@@ -549,7 +585,7 @@ module Raabro
549
585
 
550
586
  def rewrite(tree)
551
587
 
552
- return !! methods.find { |m| m.to_s.match(/^rewrite_/) } if tree == 0
588
+ return !! methods.find { |m| m.to_s.start_with?('rewrite_') } if tree == 0
553
589
  # return true when "rewrite_xxx" methods seem to have been provided
554
590
 
555
591
  send("rewrite_#{tree.name}", tree)
@@ -10,8 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.platform = Gem::Platform::RUBY
11
11
  s.authors = [ 'John Mettraux' ]
12
12
  s.email = [ 'jmettraux+flor@gmail.com' ]
13
- s.homepage = 'http://github.com/floraison/raabro'
14
- #s.rubyforge_project = 'rufus'
13
+ s.homepage = 'https://github.com/floraison/raabro'
15
14
  s.license = 'MIT'
16
15
  s.summary = 'a very dumb PEG parser library'
17
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raabro
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-21 00:00:00.000000000 Z
11
+ date: 2020-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -38,7 +38,7 @@ files:
38
38
  - README.md
39
39
  - lib/raabro.rb
40
40
  - raabro.gemspec
41
- homepage: http://github.com/floraison/raabro
41
+ homepage: https://github.com/floraison/raabro
42
42
  licenses:
43
43
  - MIT
44
44
  metadata: {}
@@ -57,8 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
- rubyforge_project:
61
- rubygems_version: 2.5.2
60
+ rubygems_version: 3.0.3
62
61
  signing_key:
63
62
  specification_version: 4
64
63
  summary: a very dumb PEG parser library