parameters: (id_: ID, rhs: SafeExpType, type_: "MockObj" = None)
return_statement: return obj
docstring: Declare a new pointer variable in the code generation.
  
      :param id_: The ID used to declare the variable.
      :param rhs: The expression to place on the right hand side of the assignment.
      :param type_: Manually define a type for the variable, only use this when it's not possible
        to do so during config validation phase (for example because of template arguments).
  
      :returns The new variable as a MockObj.
docstring_summary: Declare a new pointer variable in the code generation.
docstring_tokens: Declare a new pointer variable in the code generation .
function: def Pvariable(id_: ID, rhs: SafeExpType, type_: "MockObj" = None) -> "MockObj":
      """Declare a new pointer variable in the code generation.
  
      :param id_: The ID used to declare the variable.
      :param rhs: The expression to place on the right hand side of the assignment.
      :param type_: Manually define a type for the variable, only use this when it's not possible
        to do so during config validation phase (for example because of template arguments).
  
      :returns The new variable as a MockObj.
      """
      rhs = safe_exp(rhs)
      obj = MockObj(id_, "->")
      if type_ is not None:
          id_.type = type_
      decl = VariableDeclarationExpression(id_.type, "*", id_)
      CORE.add_global(decl)
      assignment = AssignmentExpression(None, None, id_, rhs)
      CORE.add(assignment)
      CORE.register_variable(id_, obj)
      return obj
function_tokens: def Pvariable ( id_ : ID , rhs : SafeExpType , type_ : "MockObj" = None ) -> "MockObj" : rhs = safe_exp ( rhs ) obj = MockObj ( id_ , "->" ) if type_ is not None : id_ . type = type_ decl = VariableDeclarationExpression ( id_ . type , "*" , id_ ) CORE . add_global ( decl ) assignment = AssignmentExpression ( None , None , id_ , rhs ) CORE . add ( assignment ) CORE . register_variable ( id_ , obj ) return obj