123456789_123456789_123456789_123456789_123456789_

Class: IRB::SLex::Node

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/irb/slex.rb

Overview


class Node -

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(preproc = nil, postproc = nil) ⇒ Node

if postproc is nil, this node is an abstract node. if postproc is non-nil, this node is a real node.

[ GitHub ]

  
# File 'lib/irb/slex.rb', line 95

def initialize(preproc = nil, postproc = nil)
  @Tree = {}
  @preproc = preproc
  @postproc = postproc
end

Instance Attribute Details

#postproc (rw)

[ GitHub ]

  
# File 'lib/irb/slex.rb', line 102

attr_accessor :postproc

#preproc (rw)

[ GitHub ]

  
# File 'lib/irb/slex.rb', line 101

attr_accessor :preproc

Instance Method Details

#create_subnode(chrs, preproc = nil, postproc = nil)

[ GitHub ]

  
# File 'lib/irb/slex.rb', line 119

def create_subnode(chrs, preproc = nil, postproc = nil)
  if chrs.empty?
    if @postproc
      D_DETAIL.pp node
      SLex.fail ErrNodeAlreadyExists
    else
      D_DEBUG.puts "change abstract node to real node."
      @preproc = preproc
      @postproc = postproc
    end
    return self
  end

  ch = chrs.shift
  if node = @Tree[ch]
    if chrs.empty?
      if node.postproc
        DebugLogger.pp node
        DebugLogger.pp self
        DebugLogger.pp ch
        DebugLogger.pp chrs
        SLex.fail ErrNodeAlreadyExists
      else
        D_WARN.puts "change abstract node to real node"
        node.preproc = preproc
        node.postproc = postproc
      end
    else
      node.create_subnode(chrs, preproc, postproc)
    end
  else
    if chrs.empty?
      node = Node.new(preproc, postproc)
    else
      node = Node.new
      node.create_subnode(chrs, preproc, postproc)
    end
    @Tree[ch] = node
  end
  node
end

#match(chrs, op = "")

chrs: String

character array
io must have getc()/ungetc(); and ungetc() must be
able to be called arbitrary number of times.
[ GitHub ]

  
# File 'lib/irb/slex.rb', line 167

def match(chrs, op = "")
  D_DETAIL.print "match>: ", chrs, "op:", op, "\n"
  if chrs.empty?
    if @preproc.nil? || @preproc.call(op, chrs)
      DOUT.printf(D_DETAIL, "op1: %s\n", op)
      @postproc.call(op, chrs)
    else
      nil
    end
  else
    ch = chrs.shift
    if node = @Tree[ch]
      if ret = node.match(chrs, op+ch)
        return ret
      else
        chrs.unshift ch
        if @postproc and @preproc.nil? || @preproc.call(op, chrs)
          DOUT.printf(D_DETAIL, "op2: %s\n", op.inspect)
          ret = @postproc.call(op, chrs)
          return ret
        else
          return nil
        end
      end
    else
      chrs.unshift ch
      if @postproc and @preproc.nil? || @preproc.call(op, chrs)
        DOUT.printf(D_DETAIL, "op3: %s\n", op)
        @postproc.call(op, chrs)
        return ""
      else
        return nil
      end
    end
  end
end

#match_io(io, op = "")

[ GitHub ]

  
# File 'lib/irb/slex.rb', line 204

def match_io(io, op = "")
  if op == ""
    ch = io.getc
    if ch == nil
      return nil
    end
  else
    ch = io.getc_of_rests
  end
  if ch.nil?
    if @preproc.nil? || @preproc.call(op, io)
      D_DETAIL.printf("op1: %s\n", op)
      @postproc.call(op, io)
    else
      nil
    end
  else
    if node = @Tree[ch]
      if ret = node.match_io(io, op+ch)
        ret
      else
        io.ungetc ch
        if @postproc and @preproc.nil? || @preproc.call(op, io)
          DOUT.exec_if{D_DETAIL.printf "op2: %s\n", op.inspect}
          @postproc.call(op, io)
        else
          nil
        end
      end
    else
      io.ungetc ch
      if @postproc and @preproc.nil? || @preproc.call(op, io)
        D_DETAIL.printf("op3: %s\n", op)
        @postproc.call(op, io)
      else
        nil
      end
    end
  end
end

#search(chrs, opt = nil)

[ GitHub ]

  
# File 'lib/irb/slex.rb', line 104

def search(chrs, opt = nil)
  return self if chrs.empty?
  ch = chrs.shift
  if node = @Tree[ch]
    node.search(chrs, opt)
  else
    if opt
      chrs.unshift ch
      self.create_subnode(chrs)
    else
      SLex.fail ErrNodeNothing
    end
  end
end