def parse ( c )
      @parserstate = INITIAL_STATE
      retval = true
      #
      # * Фиксированное состояние (определенное): -1.
      # * Не фиксированное состояние (неопределенное): -2.
      # * Переход (смена состояний): >0.
      # 
      @buffer << c

      # Задан шаблон для игнорирования символов.
      if @chain.last.ignore[:all].size > 0 then
        return retval if @chain.last.ignore[:all].include?(c)
      end
      
      # Проверка переходов в другие состояния.
      r = classify( @chain.last )

      # Переход (прыжок) в другое состояние.
      # <branch>:
      if r >= 0 then
	@chain << @states[r]
	if @chain.last.run_init( @buffer ) == nil then
	  reset( )
	  @parserstate = 'branch'
	else
	  @parserstate = 'error'
	  retval = false
	end
	
      # Возврат из текущего состояния.
      # <back>:
      elsif r == -1 then
	if @chain.last.run_fini( @buffer ) == nil then
	  #
	  # если это состояние не первое в цепочке
	  # тогда откатываемся назад.
	  if @chain.size > 1 then
	    @chain.delete_at( @chain.size - 1 )
	  end
	  reset( )
	  @parserstate = 'back'
	else
	  @parserstate = 'error'
	  retval = false
	end
	
      # Нет совпадений.
      # <miss>:
      elsif r == -3 then
	#
	# если в процессе состояния <wait>
	# мы попали в <miss>, то накопленный
	# буфер надо обработать.
	@buffer.each do |ch|
	  @parserstate = 'miss'
	  tag = true
	  if @chain.last.ignore[:handler].size > 0 then
	    tag = false if @chain.last.ignore[:handler].include?(ch)
	  end
	  if tag == true then
	    if @chain.last.run_handler( ch ) != nil then
	      @parserstate = 'error'
	      retval = false
	      break
	    end
	  end
	end
	@buffer = []
      end
      return retval
    end
def parse ( c )
      @parserstate = INITIAL_STATE
      retval = true
      #
      # * Фиксированное состояние (определенное): -1.
      # * Не фиксированное состояние (неопределенное): -2.
      # * Переход (смена состояний): >0.
      # 
      @buffer << c

      # Задан шаблон для игнорирования символов.
      if @chain.last.ignore[:all].size > 0 then
        return retval if @chain.last.ignore[:all].include?(c)
      end
      
      # Проверка переходов в другие состояния.
      r = classify( @chain.last )

      # Переход (прыжок) в другое состояние.
      # <branch>:
      if r >= 0 then
	@chain << @states[r]
	if @chain.last.run_init( @buffer ) == nil then
	  reset( )
	  @parserstate = 'branch'
	else
	  @parserstate = 'error'
	  retval = false
	end
	
      # Возврат из текущего состояния.
      # <back>:
      elsif r == -1 then
	if @chain.last.run_fini( @buffer ) == nil then
	  #
	  # если это состояние не первое в цепочке
	  # тогда откатываемся назад.
	  if @chain.size > 1 then
	    @chain.delete_at( @chain.size - 1 )
	  end
	  reset( )
	  @parserstate = 'back'
	else
	  @parserstate = 'error'
	  retval = false
	end
	
      # Нет совпадений.
      # <miss>:
      elsif r == -3 then
	#
	# если в процессе состояния <wait>
	# мы попали в <miss>, то накопленный
	# буфер надо обработать.
	@buffer.each do |ch|
	  @parserstate = 'miss'
	  tag = true
	  if @chain.last.ignore[:handler].size > 0 then
	    tag = false if @chain.last.ignore[:handler].include?(ch)
	  end
	  if tag == true then
	    if @chain.last.run_handler( ch ) != nil then
	      @parserstate = 'error'
	      retval = false
	      break
	    end
	  end
	end
	@buffer = []
      end
      return retval
    end
Main method, used for parse input stream.
 Parse will be starting in unit with nil index (0).

 Return true if parsing process is successful, else return false.