123456789_123456789_123456789_123456789_123456789_

Class: IRB::SLex::Node Private

Relationships & Source Files
Inherits: Object
Defined in: lib/yard/parser/ruby/legacy/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/yard/parser/ruby/legacy/irb/slex.rb', line 89

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

Instance Attribute Details

#postproc (rw)

[ GitHub ]

  
# File 'lib/yard/parser/ruby/legacy/irb/slex.rb', line 96

attr_accessor :postproc

#preproc (rw)

[ GitHub ]

  
# File 'lib/yard/parser/ruby/legacy/irb/slex.rb', line 95

attr_accessor :preproc

Instance Method Details

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

[ GitHub ]

  
# File 'lib/yard/parser/ruby/legacy/irb/slex.rb', line 113

def create_subnode(chrs, preproc = nil, postproc = nil)
  if chrs.empty?
    if @postproc
      D_DETAIL.pp node
      raise "node already exists"
    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
        raise "node already exists"
      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/yard/parser/ruby/legacy/irb/slex.rb', line 161

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/yard/parser/ruby/legacy/irb/slex.rb', line 198

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/yard/parser/ruby/legacy/irb/slex.rb', line 98

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
      raise "node nothing"
    end
  end
end