Module: RedParse::Reducer

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

Constant Summary collapse

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

Instance Method Summary collapse

Instance Method Details

#compile(recompile = false) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# 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_reduceObject



187
188
189
190
191
192
193
194
195
196
197
198
199
# 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