def analyze(self): content = self.content[:] if self.prefix: self.update_attributes(self.prefix.upper().split()) variables = self.a.variables for a in self.args: assert a not in variables if is_name(a): variables[a] = Variable(self, a) elif a == '*': variables[a] = Variable(self, a) # XXX: fix me appropriately else: raise AnalyzeError('argument must be a name or * but got %r' % (a)) if isinstance(self, Function): var = variables[self.result] = Variable(self, self.result) if self.typedecl is not None: var.set_type(self.typedecl) while content: stmt = content.pop(0) if isinstance(stmt, Contains): for stmt in filter_stmts(content, SubProgramStatement): stmt.analyze() self.a.internal_subprogram[stmt.name] = stmt stmt = content.pop(0) while isinstance(stmt, Comment): stmt = content.pop(0) assert isinstance(stmt, self.end_stmt_cls), ` stmt ` elif isinstance(stmt, self.end_stmt_cls): continue else: stmt.analyze() if content: logger.info('Not analyzed content: %s' % content) # self.show_message('Not analyzed content: %s' % content) parent_provides = self.parent.get_provides() if parent_provides is not None: if self.name in parent_provides: self.warning( 'module subprogram name conflict with %s, overriding.' % (self.name)) if self.is_public(): parent_provides[self.name] = self if self.is_recursive() and self.is_elemental(): self.warning( 'C1241 violation: prefix cannot specify both ELEMENTAL and RECURSIVE' ) return
def get_variable_by_name(self, name): variables = self.a.variables if name in variables: var = variables[name] else: var = variables[name] = Variable(self, name) self.a.variable_names.append(name) return var
def analyze(self): content = self.content[:] if self.prefix: self.update_attributes(prefix.upper().split()) variables = self.a.variables for a in self.args: assert not variables.has_key(a) assert is_name(a) variables[a] = Variable(self, a) if isinstance(self, Function): var = variables[self.result] = Variable(self, self.result) if self.typedecl is not None: var.set_type(self.typedecl) while content: stmt = content.pop(0) if isinstance(stmt, Contains): for stmt in filter_stmts(content, SubProgramStatement): stmt.analyze() self.a.internal_subprogram[stmt.name] = stmt stmt = content.pop(0) assert isinstance(stmt, self.end_stmt_cls),`stmt` elif isinstance(stmt, self.end_stmt_cls): continue else: stmt.analyze() if content: self.show_message('Not analyzed content: %s' % content) #parent_provides = self.parent.get_provides() #if parent_provides is not None: # if self.is_public(): # if parent_provides.has_key(self.name): # self.warning('module subprogram name conflict with %s, overriding.' % (self.name)) # parent_provides[self.name] = self return