]> git.wincent.com - walrat.git/blob - lib/walrat/memoizing.rb
Fix typo in code documentation comment
[walrat.git] / lib / walrat / memoizing.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   module Memoizing
27     # This method provides a clean, optional implementation of memoizing by
28     # serving as a wrapper for all parse invocations. Rather than calling the
29     # parse methods directly, this method should be called; if it is
30     # appropriate to use a memoizer then it will be invoked, otherwise control
31     # will fall through to the real parse method. Turning off memoizing is as
32     # simple as not passing a value with the :memoizer key in the options hash.
33     # This method is defined in a separate module so that it can easily be
34     # mixed in with all Parslets, ParsletCombinations and Predicates.
35     def memoizing_parse(string, options = {})
36       # will use memoizer if available and not instructed to ignore it
37       if options.has_key?(:memoizer) and not
38          (options.has_key?(:ignore_memoizer) and options[:ignore_memoizer])
39         options[:parseable] = self
40         options[:memoizer].parse string, options
41       else # otherwise will proceed as normal
42         options[:ignore_memoizer] = false
43         parse string, options
44       end
45     end
46
47     # Can only check for left recursion if memoizing is turned on (the help of
48     # the memoizer is needed).
49     def check_left_recursion parseable, options = {}
50       return unless options.has_key?(:memoizer)
51       options[:memoizer].check_left_recursion parseable, options
52     end
53   end # module Memoizing
54 end # module Walrat