def new_from
      source_tokens = [ :STRING ]
      from_tok = Tree::From.new(basic_options)

      # read in all the derived columns - search sources:
      while peek_token and source_tokens.include? peek_token.token
        src_token = read_token
        # check if the provider is registered in the given list:
        if provider_exists? src_token.lexeme.downcase
          from_tok.sources[src_token.lexeme] = @providers[src_token.lexeme.downcase.to_sym]
        else raise UnregisteredProviderError, "#{src_token.lexeme} is not a registered provider"
        end
      end

      if from_tok.sources.count == 0
        raise SyntaxError, "No search sources given (#{error_location})"
      end

      from_tok
    end
def new_from
      source_tokens = [ :STRING ]
      from_tok = Tree::From.new(basic_options)

      # read in all the derived columns - search sources:
      while peek_token and source_tokens.include? peek_token.token
        src_token = read_token
        # check if the provider is registered in the given list:
        if provider_exists? src_token.lexeme.downcase
          from_tok.sources[src_token.lexeme] = @providers[src_token.lexeme.downcase.to_sym]
        else raise UnregisteredProviderError, "#{src_token.lexeme} is not a registered provider"
        end
      end

      if from_tok.sources.count == 0
        raise SyntaxError, "No search sources given (#{error_location})"
      end

      from_tok
    end
Creates a new Tree::From