parslet 0.10.1 → 0.11.0

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.
data/HISTORY.txt CHANGED
@@ -1,4 +1,9 @@
1
- = 0.10.1 / ???
1
+ = 0.11.0 / 25Nov2010
2
+
3
+ ! Bugfixes to tree handling. Let's hope that was the last such significant
4
+ change to the core.
5
+
6
+ = 0.10.1 / 22Nov2010
2
7
 
3
8
  + Allow match['a-z'], shortcut for match('[a-z]')
4
9
 
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ spec = Gem::Specification.new do |s|
18
18
 
19
19
  # Change these as appropriate
20
20
  s.name = "parslet"
21
- s.version = "0.10.1"
21
+ s.version = "0.11.0"
22
22
  s.summary = "Parser construction library with great error reporting in Ruby."
23
23
  s.author = "Kaspar Schiess"
24
24
  s.email = "kaspar.schiess@absurd.li"
@@ -35,7 +35,7 @@ class Parslet::Atoms::Base
35
35
  # p [:try, self, io.string[io.pos, 20]]
36
36
  begin
37
37
  r = try(io)
38
- # p [:return_from, self, flatten(r)]
38
+ # p [:return_from, self, r, flatten(r)]
39
39
  @last_cause = nil
40
40
  return r
41
41
  rescue Parslet::ParseFailed => ex
@@ -89,30 +89,34 @@ class Parslet::Atoms::Base
89
89
  fail "BUG: Unknown tag #{tag.inspect}."
90
90
  end
91
91
  def flatten_sequence(list)
92
- list.inject('') { |r, e| # and then merge flat elements
93
- case [r, e].map { |o| o.class }
94
- when [Hash, Hash] # two keyed subtrees: make one
95
- warn_about_duplicate_keys(r, e)
96
- r.merge(e)
97
- # a keyed tree and an array (push down)
98
- when [Hash, Array]
99
- [r] + e
100
- when [Array, Hash]
101
- r + [e]
102
- when [String, String]
103
- r << e
92
+ list.compact.inject('') { |r, e| # and then merge flat elements
93
+ merge_fold(r, e)
94
+ }
95
+ end
96
+ def merge_fold(l, r)
97
+ # equal pairs: merge.
98
+ if l.class == r.class
99
+ if l.is_a?(Hash)
100
+ warn_about_duplicate_keys(l, r)
101
+ return l.merge(r)
104
102
  else
105
- if r.instance_of? Hash
106
- r # Ignore e, since its not a hash we can merge
107
- else
108
- # Now e is either nil, in which case we drop it, or something else.
109
- # If it is something else, it is probably more important than r,
110
- # since we've checked for important values of r above.
111
- e||r
112
- end
103
+ return l + r
113
104
  end
114
- }
105
+ end
106
+
107
+ # unequal pairs: hoist to same level.
108
+
109
+ # special case: If one of them is a string, the other is more important
110
+ return l if r.class == String
111
+ return r if l.class == String
112
+
113
+ # otherwise just create an array for one of them to live in
114
+ return l + [r] if r.class == Hash
115
+ return [l] + r if l.class == Hash
116
+
117
+ fail "Unhandled case when foldr'ing sequence."
115
118
  end
119
+
116
120
  def flatten_repetition(list)
117
121
  if list.any? { |e| e.instance_of?(Hash) }
118
122
  # If keyed subtrees are in the array, we'll want to discard all
@@ -2,6 +2,9 @@
2
2
  # Allows specifying rules as strings using the exact same grammar that treetop
3
3
  # does, minus the actions. This is on one hand a good example of a fully fledged
4
4
  # parser and on the other hand might even turn out really useful.
5
+ #
6
+ # This can be viewed as an extension to parslet and might even be hosted in
7
+ # its own gem one fine day.
5
8
  #
6
9
  # NOT FINISHED & EXPERIMENTAL
7
10
  #
@@ -22,7 +25,7 @@ class Parslet::Expression
22
25
  def transform(tree)
23
26
  transform = Treetop::Transform.new
24
27
 
25
- pp tree
28
+ # pp tree
26
29
  transform.apply(tree)
27
30
  end
28
31
 
@@ -2,18 +2,15 @@ class Parslet::Expression::Treetop
2
2
  class Parser < Parslet::Parser
3
3
  root(:expression)
4
4
 
5
- rule(:expression) {
6
- alternatives
7
- }
5
+ rule(:expression) { alternatives }
8
6
 
7
+ # alternative 'a' / 'b'
9
8
  rule(:alternatives) {
10
- simple >> (spaced('/') >> alternatives) |
11
- simple
9
+ (simple >> (spaced('/') >> simple).repeat).as(:alt)
12
10
  }
13
11
 
14
- rule(:simple) {
15
- perhaps.repeat
16
- }
12
+ # sequence by simple concatenation 'a' 'b'
13
+ rule(:simple) { perhaps.repeat(1).as(:seq) }
17
14
 
18
15
  rule(:perhaps) {
19
16
  atom.as(:maybe) >> spaced('?') |
@@ -43,8 +40,9 @@ class Parslet::Expression::Treetop
43
40
  end
44
41
 
45
42
  class Transform < Parser::Transform
43
+ rule(:alt => subtree(:alt)) { Parslet::Atoms::Alternative.new(*alt) }
44
+ rule(:seq => sequence(:s)) { Parslet::Atoms::Sequence.new(*s) }
46
45
  rule(:unwrap => simple(:u)) { u }
47
- rule(sequence(:s)) { |d| Parslet::Atoms::Sequence.new(*d[:s]) }
48
46
  rule(:maybe => simple(:m)) { |d| d[:m].maybe }
49
47
  rule(:string => simple(:s)) { |d| str(d[:s]) }
50
48
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 10
8
- - 1
9
- version: 0.10.1
7
+ - 11
8
+ - 0
9
+ version: 0.11.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Kaspar Schiess
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-23 00:00:00 +01:00
17
+ date: 2010-11-25 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency