parslet 1.2.3 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -60,6 +60,12 @@ class Parslet::Source
60
60
  # # would describe [0, 10], (10, 20], (20, 30]
61
61
  #
62
62
  module RangeSearch # :nodoc:
63
+ def find_mid(left, right)
64
+ # NOTE: Jonathan Hinkle reported that when mathn is required, just
65
+ # dividing and relying on the integer truncation is not enough.
66
+ left + ((right - left) / 2).floor
67
+ end
68
+
63
69
  # Scans the array for the first number that is > than bound. Returns the
64
70
  # index of that number.
65
71
  #
@@ -71,7 +77,7 @@ class Parslet::Source
71
77
  right = size - 1
72
78
 
73
79
  loop do
74
- mid = left + (right - left) / 2
80
+ mid = find_mid(left, right)
75
81
 
76
82
  if self[mid] > bound
77
83
  right = mid
@@ -11,14 +11,22 @@ require 'blankslate'
11
11
  # end
12
12
  #
13
13
  class Parslet::Transform::Context < BlankSlate # :nodoc:
14
- def initialize(bindings)
15
- @bindings = bindings
14
+ reveal :methods
15
+ reveal :respond_to?
16
+ reveal :inspect
17
+ reveal :to_s
18
+ reveal :instance_variable_set
19
+
20
+ def meta_def(name, &body)
21
+ metaclass = class <<self; self; end
22
+
23
+ metaclass.send(:define_method, name, &body)
16
24
  end
17
25
 
18
- def method_missing(sym, *args, &block)
19
- super unless args.empty?
20
- super unless @bindings.has_key?(sym.to_sym)
21
-
22
- @bindings[sym]
26
+ def initialize(bindings)
27
+ bindings.each do |key, value|
28
+ meta_def(key.to_sym) { value }
29
+ instance_variable_set("@#{key}", value)
30
+ end
23
31
  end
24
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parslet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-22 00:00:00.000000000Z
12
+ date: 2012-03-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: blankslate
16
- requirement: &70142555622900 !ruby/object:Gem::Requirement
16
+ requirement: &70331801365680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70142555622900
24
+ version_requirements: *70331801365680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70142555622120 !ruby/object:Gem::Requirement
27
+ requirement: &70331801365040 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70142555622120
35
+ version_requirements: *70331801365040
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: flexmock
38
- requirement: &70142555621000 !ruby/object:Gem::Requirement
38
+ requirement: &70331802115280 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70142555621000
46
+ version_requirements: *70331802115280
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &70142555620020 !ruby/object:Gem::Requirement
49
+ requirement: &70331802114800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70142555620020
57
+ version_requirements: *70331802114800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sdoc
60
- requirement: &70142555618980 !ruby/object:Gem::Requirement
60
+ requirement: &70331802114300 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,40 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70142555618980
68
+ version_requirements: *70331802114300
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard
71
+ requirement: &70331802113400 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70331802113400
80
+ - !ruby/object:Gem::Dependency
81
+ name: guard-rspec
82
+ requirement: &70331802112700 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70331802112700
91
+ - !ruby/object:Gem::Dependency
92
+ name: growl
93
+ requirement: &70331802112180 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70331802112180
69
102
  description:
70
103
  email: kaspar.schiess@absurd.li
71
104
  executables: []
@@ -73,13 +106,13 @@ extensions: []
73
106
  extra_rdoc_files:
74
107
  - README
75
108
  files:
76
- - Gemfile
77
109
  - HISTORY.txt
78
110
  - LICENSE
79
111
  - Rakefile
80
112
  - README
81
113
  - lib/parslet/atoms/alternative.rb
82
114
  - lib/parslet/atoms/base.rb
115
+ - lib/parslet/atoms/can_flatten.rb
83
116
  - lib/parslet/atoms/context.rb
84
117
  - lib/parslet/atoms/dsl.rb
85
118
  - lib/parslet/atoms/entity.rb
@@ -89,9 +122,13 @@ files:
89
122
  - lib/parslet/atoms/repetition.rb
90
123
  - lib/parslet/atoms/sequence.rb
91
124
  - lib/parslet/atoms/str.rb
92
- - lib/parslet/atoms/transform.rb
93
125
  - lib/parslet/atoms/visitor.rb
94
126
  - lib/parslet/atoms.rb
127
+ - lib/parslet/bytecode/compiler.rb
128
+ - lib/parslet/bytecode/instructions.rb
129
+ - lib/parslet/bytecode/vm.rb
130
+ - lib/parslet/bytecode.rb
131
+ - lib/parslet/cause.rb
95
132
  - lib/parslet/convenience.rb
96
133
  - lib/parslet/error_tree.rb
97
134
  - lib/parslet/export.rb
@@ -114,9 +151,11 @@ files:
114
151
  - example/empty.rb
115
152
  - example/erb.rb
116
153
  - example/ignore.rb
154
+ - example/ignore_whitespace.rb
117
155
  - example/ip_address.rb
118
156
  - example/json.rb
119
157
  - example/local.rb
158
+ - example/mathn.rb
120
159
  - example/minilisp.rb
121
160
  - example/output/boolean_algebra.out
122
161
  - example/output/comments.out
@@ -126,9 +165,11 @@ files:
126
165
  - example/output/empty.err
127
166
  - example/output/erb.out
128
167
  - example/output/ignore.out
168
+ - example/output/ignore_whitespace.out
129
169
  - example/output/ip_address.out
130
170
  - example/output/json.out
131
171
  - example/output/local.out
172
+ - example/output/mathn.out
132
173
  - example/output/minilisp.out
133
174
  - example/output/parens.out
134
175
  - example/output/readme.out
@@ -160,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
201
  version: '0'
161
202
  segments:
162
203
  - 0
163
- hash: 4497395910031021567
204
+ hash: 3769329244908936169
164
205
  required_rubygems_version: !ruby/object:Gem::Requirement
165
206
  none: false
166
207
  requirements:
@@ -169,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
210
  version: '0'
170
211
  requirements: []
171
212
  rubyforge_project:
172
- rubygems_version: 1.8.6
213
+ rubygems_version: 1.8.16
173
214
  signing_key:
174
215
  specification_version: 3
175
216
  summary: Parser construction library with great error reporting in Ruby.
data/Gemfile DELETED
@@ -1,16 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gem 'rake'
4
- gem 'blankslate', '~> 2'
5
-
6
- group :development do
7
- gem 'rspec'
8
- gem 'flexmock'
9
-
10
- gem 'rdoc'
11
- gem 'sdoc'
12
-
13
- gem 'guard'
14
- gem 'guard-rspec'
15
- gem 'growl'
16
- end
@@ -1,75 +0,0 @@
1
-
2
- require 'parslet/atoms/visitor'
3
-
4
- # A helper class that allows transforming one grammar into another. You can
5
- # use this class as a base class:
6
- #
7
- # Example:
8
- # class MyTransform < Parslet::Atoms::Transform
9
- # def visit_str(str)
10
- # # mangle string here
11
- # super(str)
12
- # end
13
- # end
14
- #
15
- # Note that all the methods in a Transform must return parser atoms. The
16
- # quickest way to do so is to call super with your own arguments. This will
17
- # just create the same kind of atom that was just visited.
18
- #
19
- # In essence, this base class performs what is called an 'identity transform'
20
- # with one small caveat: It returns a brand new grammar composed of brand new
21
- # parser atoms. This is like a deep clone of your grammar.
22
- #
23
- # But nothing stops you from doing something that is far from a deep clone.
24
- # You can totally transform the language your grammar accepts. Or maybe
25
- # turn all repetitions into non-greedy ones? Go wild.
26
- #
27
- class Parslet::Atoms::Transform
28
- # Applies a transformation to a grammar and returns a new grammar that
29
- # is the result of the transform.
30
- #
31
- # Example:
32
- # Parslet::Atoms::Transform.new.apply(my_grammar) # => deep clone of my_grammar
33
- #
34
- def apply(grammar)
35
- grammar.accept(self)
36
- end
37
-
38
- def visit_str(str)
39
- Parslet.str(str)
40
- end
41
-
42
- def visit_sequence(parslets)
43
- parslets[1..-1].inject(parslets[0]) { |a,p| a >> p.accept(self) }
44
- end
45
-
46
- def visit_re(match)
47
- Parslet.match(match)
48
- end
49
-
50
- def visit_alternative(parslets)
51
- parslets[1..-1].inject(parslets[0]) { |a,p| a | p.accept(self) }
52
- end
53
-
54
- def visit_lookahead(positive, parslet)
55
- Parslet::Atoms::Lookahead.new(positive, parslet.accept(self))
56
- end
57
-
58
- def visit_entity(name, block)
59
- # NOTE: This is kinda tricky. We return a new entity that keeps a reference
60
- # to the transformer around. Once somebody accesses the parslet in that
61
- # entity, the original block will produce the original parslet, and then
62
- # we transform that then and there. Its lazy and futuristic!
63
- transformer = self
64
- transformed_block = proc { block.call.accept(transformer) }
65
- Parslet::Atoms::Entity.new(name, &transformed_block)
66
- end
67
-
68
- def visit_named(name, parslet)
69
- parslet.accept(self).as(name)
70
- end
71
-
72
- def visit_repetition(min, max, parslet)
73
- parslet.accept(self).repeat(min, max)
74
- end
75
- end