code: def query_specification(self, tree):
      target_list = None
      from_clause = None
      where_clause = None
      groupby_clause = None
      orderby_clause = None
      limit_count = None
  
      # first child is a SELECT terminal token
      for child in tree.children[1:]:
          try:
              if child.data == "select_elements":
                  target_list = self.visit(child)
              elif child.data == "from_clause":
                  clause = self.visit(child)
                  from_clause = clause.get("from", None)
                  where_clause = clause.get("where", None)
                  groupby_clause = clause.get("groupby", None)
              elif child.data == "order_by_clause":
                  orderby_clause = self.visit(child)
              elif child.data == "limit_clause":
                  limit_count = self.visit(child)
  
          except BaseException as e:
              # stop parsing something bad happened
              logger.error(
                  "Error while parsing \
                                  QuerySpecification"
              )
              raise e
  
      select_stmt = SelectStatement(
          target_list,
          from_clause,
          where_clause,
          groupby_clause=groupby_clause,
          orderby_list=orderby_clause,
          limit_count=limit_count,
      )
  
      return select_stmt
  
imports: from lark import Token, Tree
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.parser.select_statement import SelectStatement
  from evadb.parser.table_ref import Alias, JoinNode, TableRef, TableValuedExpression
  from evadb.parser.types import JoinType
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 6 for calling the TableSources obj's underlying member method code with example usage: obj.query_specification(tree) and returns: select_stmt