]> git.wincent.com - walrat.git/blob - lib/walrat/parslet_omission.rb
Initial import (extraction from Walrus repo, commit 0c9d44c)
[walrat.git] / lib / walrat / parslet_omission.rb
1 # Copyright 2007-2010 Wincent Colaiuta. All rights reserved.
2 # Redistribution and use in source and binary forms, with or without
3 # modification, are permitted provided that the following conditions are met:
4 #
5 # 1. Redistributions of source code must retain the above copyright notice,
6 #    this list of conditions and the following disclaimer.
7 # 2. Redistributions in binary form must reproduce the above copyright notice,
8 #    this list of conditions and the following disclaimer in the documentation
9 #    and/or other materials provided with the distribution.
10 #
11 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
13 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
14 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
15 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
16 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
17 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
18 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
19 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
20 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
21 # POSSIBILITY OF SUCH DAMAGE.
22
23 require 'walrat'
24
25 module Walrat
26   class ParsletOmission < ParsletCombination
27     attr_reader :hash
28
29     # Raises an ArgumentError if parseable is nil.
30     def initialize parseable
31       raise ArgumentError, 'nil parseable' if parseable.nil?
32       @parseable = parseable
33
34       # fixed offset to avoid unwanted collisions with similar classes
35       @hash = @parseable.hash + 46
36     end
37
38     def parse string, options = {}
39       raise ArgumentError, 'nil string' if string.nil?
40       substring = StringResult.new
41       substring.start = [options[:line_start], options[:column_start]]
42       substring.end   = [options[:line_start], options[:column_start]]
43
44       # possibly should catch these here as well
45       #catch :NotPredicateSuccess do
46       #catch :AndPredicateSuccess do
47       # one of the fundamental problems is that if a parslet throws such a
48       # symbol any info about already skipped material is lost (because the
49       # symbols contain nothing)
50       # this may be one reason to change these to exceptions...
51       catch :ZeroWidthParseSuccess do
52         substring = @parseable.memoizing_parse(string, options)
53       end
54
55       # not enough to just return a ZeroWidthParseSuccess here; that could
56       # cause higher levels to stop parsing and in any case there'd be no
57       # clean way to embed the scanned substring in the symbol
58       raise SkippedSubstringException.new(substring,
59                                           :line_start   => options[:line_start],
60                                           :column_start => options[:column_start],
61                                           :line_end     => substring.line_end,
62                                           :column_end   => substring.column_end)
63     end
64
65     def eql?(other)
66       other.instance_of? ParsletOmission and other.parseable.eql? @parseable
67     end
68
69   protected
70
71     # For determining equality.
72     attr_reader :parseable
73   end # class ParsletOmission
74 end # module Walrat