def _visit_param_list_node(self, node):
     """Go through the method parameters and create a variable
     symbol for each one - these are returned as a list.
     """
     params = []
     for param in node.children:
         id_node = param.children[1]
         p_type = get_full_type(param.children[0].value,
                        self._t_env)
         # Check if it's an array or a simple identifier
         p_name = ''
         try:
             # Treat it like an array
             p_name = id_node.children[0].value
             dimensions = id_node.children[1].value
             p_type = ArrayType(p_type, dimensions)
             params.append(ArraySymbol(p_name, p_type, dimensions))
         except AttributeError:
             # It's a regular variable
             p_name = id_node.value
             params.append(VarSymbol(p_name, p_type))
         # Check the name does not clash with a type
         # or field name
         self._check_param_name(p_name)
     return params
 def _get_method_node_type(self, node):
     """Gets the return type of a particular method."""
     type_node = node.children[1]
     type_ = 'void'
     if type_node.value != 'void':
         type_ = get_full_type(type_node.value, self._t_env)
     return type_
 def _visit_field_dcl_assign_node(self, node):
     field_s = None
     try:
         # For arrays
         array_node = node.children[1].children[0]
         name = array_node.children[0].value
         type_ = get_full_type(node.children[0].value, self._t_env)
         dimensions = array_node.children[1].value
         type_ = ArrayType(type_, dimensions)
         field_s = ArrayFieldSymbol(name, type_, dimensions)
     except AttributeError:
         # Regular variables
         name = node.children[1].children[0].value
         type_ = get_full_type(node.children[0].value, self._t_env)
         field_s = FieldSymbol(name, type_)
     self._field_names.append(name)
     field_s.modifiers = node.modifiers
     return field_s
 def _visit_field_dcl_node(self, node):
     """Helper method for scan_classes_methods which scans properties of the
     method, create a symbol for it, and returns it.
     """
     field_s = None
     try:
         # For arrays
         name = node.children[1].children[0].value
         type_ = get_full_type(node.children[0].value, self._t_env)
         dimensions = node.children[1].children[1].value
         type_ = ArrayType(type_, dimensions)
         field_s = ArrayFieldSymbol(name, type_, dimensions)
     except AttributeError:
         # Regular variables
         name = node.children[1].value
         type_ = get_full_type(node.children[0].value, self._t_env)
         field_s = FieldSymbol(name, type_)
     # Build up list of the names
     self._field_names.append(name)
     field_s.modifiers = node.modifiers
     return field_s