def step(state, stream)
state.rules.each do |rule|
if rule.is_a?(State)
puts " entering mixin #{rule.name}" if @debug
return true if step(rule, stream)
puts " exiting mixin #{rule.name}" if @debug
else
puts " trying #{rule.inspect}" if @debug
next if rule.beginning_of_line && !stream.beginning_of_line?
if (size = stream.skip(rule.re))
puts " got #{stream[0].inspect}" if @debug
instance_exec(stream, &rule.callback)
if size.zero?
@null_steps += 1
if @null_steps > MAX_NULL_SCANS
puts " too many scans without consuming the string!" if @debug
return false
end
else
@null_steps = 0
end
return true
end
end
end
false
end