Module: RedParse::Reducer

Included in:
RedParse
Defined in:
lib/redparse.rb,
lib/redparse/compile.rb

Constant Summary collapse

@@rulesets =
{}
@@class_narrowerses =
{}

Instance Method Summary collapse

Instance Method Details

#compile(recompile = false) ⇒ Object



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/redparse/compile.rb', line 250

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_reduceObject



279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/redparse/compile.rb', line 279

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