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