]> git.wincent.com - walrat.git/blob - lib/walrat/memoizing.rb
doc: Remove references to Gitorious
[walrat.git] / lib / walrat / memoizing.rb
1 # Copyright 2007-2014 Greg Hurrell. All rights reserved.
2 # Licensed under the terms of the BSD 2-clause license.
3
4 require 'walrat'
5
6 module Walrat
7   module Memoizing
8     # This method provides a clean, optional implementation of memoizing by
9     # serving as a wrapper for all parse invocations. Rather than calling the
10     # parse methods directly, this method should be called; if it is
11     # appropriate to use a memoizer then it will be invoked, otherwise control
12     # will fall through to the real parse method. Turning off memoizing is as
13     # simple as not passing a value with the :memoizer key in the options hash.
14     # This method is defined in a separate module so that it can easily be
15     # mixed in with all Parslets, ParsletCombinations and Predicates.
16     def memoizing_parse(string, options = {})
17       # will use memoizer if available and not instructed to ignore it
18       if options.has_key?(:memoizer) and not
19          (options.has_key?(:ignore_memoizer) and options[:ignore_memoizer])
20         options[:parseable] = self
21         options[:memoizer].parse string, options
22       else # otherwise will proceed as normal
23         options[:ignore_memoizer] = false
24         parse string, options
25       end
26     end
27
28     # Can only check for left recursion if memoizing is turned on (the help of
29     # the memoizer is needed).
30     def check_left_recursion parseable, options = {}
31       return unless options.has_key?(:memoizer)
32       options[:memoizer].check_left_recursion parseable, options
33     end
34   end # module Memoizing
35 end # module Walrat