def classify ( state ) # :nodoc:
      case @matchstate[:state]
	
      # Состояние еще не определено.
      # :state = 0
      when 0
	mcount = 0
	mindex = 0
	backtag = 0
	#
	# Проверка условия выхода из состояния.
	if cmp( state.leave, state.ileave ) then
	  state.ileave = state.ileave.next
	  #
	  # Возврат в предыдущее состояние.
	  if state.ileave >= state.leave.size then
	    return -1
	  end
	  backtag = 1
	  mindex  = -1
	else
	  #
	  # Нет совпадения, но если уже часть сравнений
	  # успешна, то возможно входной символ совпадает
	  # с предыдущими, уже совпавшими символами,
	  # т.е. как откат в режиме <wait>.
	  #
	  i = checkback( state.leave, state.ileave )

	  if i != -1 then
	    state.ileave = i.next
	    backtag = 1
	  else
	    state.ileave = 0
	    backtag = 0
	  end
	end
	#
	# Проверка возможных переходов для
	# указанного в параметрах состояния.
	state.branches.each do |b|
	  if cmp( @states[b].entry, @states[b].ientry ) then
	    mcount = mcount + 1
	    mindex = b
	    @states[b].ientry = @states[b].ientry.next
	    #
	    # состояние полностью пройдено.
	    if @states[ b ].ientry >= @states[ b ].entry.size then
	      return b
	    end
	  else
	    #
	    # Нет совпадения, но если уже часть сравнений
	    # успешна, то возможно входной символ совпадает
	    # с предыдущими, уже совпавшими символами,
	    # т.е. как откат в режиме <wait>.
	    i = checkback( @states[b].entry, @states[b].ientry )

	    if i != -1 then
	      mcount = mcount + 1
	      mindex = b
	      @states[b].ientry = i.next
	    else
	      @states[b].ientry = 0
	    end
	  end
	end
	#
	# Анализ количества совпадений.
	case (mcount + backtag)
	#
	# нет совпадений.
	when 0
	  return (-3 + backtag)
	#
	# однозначное совпадение, но весь массив шаблонов
	# еще не пройден.
	when 1
	  if mindex == -1 then
	    @matchstate[:state] = 2
	  else
	    @matchstate[:state] = 1
	    @matchstate[:index] = mindex
	  end
	  return -2
	#
	# нет однозначного соответствия.
	else
	  return -2
	end
	
      # Состояние точно определено (переход в перед).
      # :state = 1
      when 1
	i = @matchstate[:index]
	if cmp( @states[ i ].entry, @states[ i ].ientry ) then
	  #
	  # Инкремент счетчика (индекса) вхождений.
	  @states[ i ].ientry = @states[ i ].ientry.next
	  #
	  # Массив шаблонов совпадает полностью.
	  # можно считать, что 100% совпадение.
	  if @states[ i ].ientry >= @states[ i ].entry.size then
	    @matchstate[:state] = 0
	    return i
	  end
	  return -2
	end
	#
	# Нет совпадения, но если уже часть сравнений
	# успешна, то возможно входной символ совпадает
	# с предыдущими, уже совпавшими символами,
	# т.е. как откат в режиме <wait>.
	idx = checkback( @states[i].entry, @states[i].ientry )

	if idx != -1 then
	  @states[i].ientry = idx.next
	  return -2
	end
	@states[i].ientry = 0
	@matchstate[:state] = 0
	return -3
	
      # Состояние точно определено (возврат назад).
      # :state = 2
      when 2
	if cmp( state.leave, state.ileave ) then
	  state.ileave = state.ileave.next
	  #
	  # Возврат в предыдущее состояние.
	  if state.ileave >= state.leave.size then
	    @matchstate[:state] = 0
	    return -1
	  end
	  return -2
	end
	#
	# Нет совпадения, но если уже часть сравнений
	# успешна, то возможно входной символ совпадает
	# с предыдущими, уже совпавшими символами,
	# т.е. как откат в режиме <wait>.
	#
	i = checkback( state.leave, state.ileave )

	if i != -1 then
	  state.ileave = i.next
	  return -2
	end
	state.ileave = 0
	@matchstate[:state] = 0
	return -3
	
      end # case @matchstate
    end
def classify ( state ) # :nodoc:
      case @matchstate[:state]
	
      # Состояние еще не определено.
      # :state = 0
      when 0
	mcount = 0
	mindex = 0
	backtag = 0
	#
	# Проверка условия выхода из состояния.
	if cmp( state.leave, state.ileave ) then
	  state.ileave = state.ileave.next
	  #
	  # Возврат в предыдущее состояние.
	  if state.ileave >= state.leave.size then
	    return -1
	  end
	  backtag = 1
	  mindex  = -1
	else
	  #
	  # Нет совпадения, но если уже часть сравнений
	  # успешна, то возможно входной символ совпадает
	  # с предыдущими, уже совпавшими символами,
	  # т.е. как откат в режиме <wait>.
	  #
	  i = checkback( state.leave, state.ileave )

	  if i != -1 then
	    state.ileave = i.next
	    backtag = 1
	  else
	    state.ileave = 0
	    backtag = 0
	  end
	end
	#
	# Проверка возможных переходов для
	# указанного в параметрах состояния.
	state.branches.each do |b|
	  if cmp( @states[b].entry, @states[b].ientry ) then
	    mcount = mcount + 1
	    mindex = b
	    @states[b].ientry = @states[b].ientry.next
	    #
	    # состояние полностью пройдено.
	    if @states[ b ].ientry >= @states[ b ].entry.size then
	      return b
	    end
	  else
	    #
	    # Нет совпадения, но если уже часть сравнений
	    # успешна, то возможно входной символ совпадает
	    # с предыдущими, уже совпавшими символами,
	    # т.е. как откат в режиме <wait>.
	    i = checkback( @states[b].entry, @states[b].ientry )

	    if i != -1 then
	      mcount = mcount + 1
	      mindex = b
	      @states[b].ientry = i.next
	    else
	      @states[b].ientry = 0
	    end
	  end
	end
	#
	# Анализ количества совпадений.
	case (mcount + backtag)
	#
	# нет совпадений.
	when 0
	  return (-3 + backtag)
	#
	# однозначное совпадение, но весь массив шаблонов
	# еще не пройден.
	when 1
	  if mindex == -1 then
	    @matchstate[:state] = 2
	  else
	    @matchstate[:state] = 1
	    @matchstate[:index] = mindex
	  end
	  return -2
	#
	# нет однозначного соответствия.
	else
	  return -2
	end
	
      # Состояние точно определено (переход в перед).
      # :state = 1
      when 1
	i = @matchstate[:index]
	if cmp( @states[ i ].entry, @states[ i ].ientry ) then
	  #
	  # Инкремент счетчика (индекса) вхождений.
	  @states[ i ].ientry = @states[ i ].ientry.next
	  #
	  # Массив шаблонов совпадает полностью.
	  # можно считать, что 100% совпадение.
	  if @states[ i ].ientry >= @states[ i ].entry.size then
	    @matchstate[:state] = 0
	    return i
	  end
	  return -2
	end
	#
	# Нет совпадения, но если уже часть сравнений
	# успешна, то возможно входной символ совпадает
	# с предыдущими, уже совпавшими символами,
	# т.е. как откат в режиме <wait>.
	idx = checkback( @states[i].entry, @states[i].ientry )

	if idx != -1 then
	  @states[i].ientry = idx.next
	  return -2
	end
	@states[i].ientry = 0
	@matchstate[:state] = 0
	return -3
	
      # Состояние точно определено (возврат назад).
      # :state = 2
      when 2
	if cmp( state.leave, state.ileave ) then
	  state.ileave = state.ileave.next
	  #
	  # Возврат в предыдущее состояние.
	  if state.ileave >= state.leave.size then
	    @matchstate[:state] = 0
	    return -1
	  end
	  return -2
	end
	#
	# Нет совпадения, но если уже часть сравнений
	# успешна, то возможно входной символ совпадает
	# с предыдущими, уже совпавшими символами,
	# т.е. как откат в режиме <wait>.
	#
	i = checkback( state.leave, state.ileave )

	if i != -1 then
	  state.ileave = i.next
	  return -2
	end
	state.ileave = 0
	@matchstate[:state] = 0
	return -3
	
      end # case @matchstate
    end
Находит соответствие между символами входного потока
 и возможными переходами.

 При совпадени возвращает индекс состояния
 в массиве состояний, иначе:

 >0 : прыжок в новое состояние
 -1 : возврат в предыдущее состояние
 -2 : еще идет проверка.
 -3 : нет cовпадений (промах).