Call to_parseable before storing rules
authorWincent Colaiuta <win@wincent.com>
Fri, 27 Aug 2010 16:17:14 +0000 (18:17 +0200)
committerWincent Colaiuta <win@wincent.com>
Fri, 27 Aug 2010 16:17:14 +0000 (18:17 +0200)
Given a rule like:

  rule :foo, 'bar'

We previously stored the string literal in the rules hash. At parse
time, these rules get accessed via the SymbolParslet class, which
does:

  result = grammar.rules[@symbol].memoizing_parse(...)

The memoizing_parse method itself calls to_parseable on the rule,
which means that every time we evaluate a rule like :foo we end up
creating a new StringParslet instance.

By storing 'bar'.to_parseable in the rules hash instead we avoid
the unnecessary object creation. With this change each time
memoizing_parse calls to_parseable on the stored value, the same
instance is returned and no new object is created, thus reducing memory
use.

Signed-off-by: Wincent Colaiuta <win@wincent.com>
lib/walrat/grammar.rb

index 1dde2effeae14fc1f2b8a3f8cb902bb0ce501764..7b996f88b2e3bf3cd5a28da5983e13999e01ce90 100755 (executable)
@@ -131,16 +131,17 @@ module Walrat
 
       # Defines a rule and stores it
       #
-      # Expects an object that responds to the parse message, such as a Parslet
-      # or ParsletCombination. As this is intended to work with Parsing
-      # Expression Grammars, each rule may only be defined once. Defining a
-      # rule more than once will raise an ArgumentError.
+      # Expects an object that responds to the to_parseable message.
+      #
+      # As this is intended to work with Parsing Expression Grammars, each rule
+      # may only be defined once. Defining a rule more than once will raise an
+      # ArgumentError.
       def rule symbol, parseable
         raise ArgumentError, 'nil symbol' if symbol.nil?
         raise ArgumentError, 'nil parseable' if parseable.nil?
         raise ArgumentError,
           "rule '#{symbol}' already defined" if rules.has_key? symbol
-        rules[symbol] = parseable
+        rules[symbol] = parseable.to_parseable
       end
 
       # Dynamically creates a Node subclass inside the namespace of the current