module RedParse::Reducer

Public Instance Methods

compile(recompile=false) click to toggle source
# File lib/redparse/compile.rb, line 158
def compile(recompile=false)
  klass=self.class

  #use cached result if available
  if @@rulesets[klass] and !recompile
    @ruleset=@@rulesets[klass]
    @class_narrowers=@@class_narrowerses[klass]
    return
  end

  #actual rule compilation
  @ruleset=RuleSet.new @rules
  @class_narrowers=[tos=Hash.new(0),la=Hash.new(0)]
  @ruleset.each_rule{|r,i|
      @ruleset.LOOKAHEAD_CLASSES(r).each{|klass2|
        la[klass2] |= 1<<i
      }
      @ruleset.TOS_CLASSES(r).each{|klass2|
        tos[klass2] |= 1<<i
      }
  }

  #save result to cache if not too dynamic
  if !recompile
    @@rulesets[klass]=@ruleset
    @@class_narrowerses[klass]=@class_narrowers
  end
end
new_reduce() click to toggle source
# File lib/redparse/compile.rb, line 187
    def new_reduce
#      mask=-1
#      (-1).downto(-@class_narrowers.size){|i|
#        mask &= @class_narrowers[i][@stack[i].class]
#      }
      mask= 
        @class_narrowers[-1][@stack[-1].class]&
        @class_narrowers[-2][@stack[-2].class]
      @ruleset.each_rule(mask){|r,i|
        res=evaluate(r) and return res
      }
      return false
    end