input: Write a python function to process a given sentence by tokenizing, POS tagging, and parsing it using NLTK.
  assert process_sentence("The quick brown fox jumps over the lazy dog.") == (['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog', '.'], [('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN'), ('.', '.')], <nltk.parse.stanford.StanfordParse object>)
  assert process_sentence("I am learning NLP.") == (['I', 'am', 'learning', 'NLP', '.'], [('I', 'PRP'), ('am', 'VBP'), ('learning', 'VBG'), ('NLP', 'NN'), ('.', '.')], <nltk.parse.stanford.StanfordParse object>)
output: import nltk
  from nltk.tokenize import word_tokenize
  from nltk import pos_tag
  from nltk.parse.stanford import StanfordParser
  
  def process_sentence(sentence):
      # Tokenize the sentence
      tokens = word_tokenize(sentence)
      
      # POS tagging
      pos_tags = pos_tag(tokens)
      
      # Parsing using Stanford Parser
      parser = StanfordParser()
      parse_tree = next(parser.raw_parse(sentence))
      
      return tokens, pos_tags, parse_tree