def process_assert(line): assert type(line) == Assert if command_line.do_assert: if '(' not in line.text or ')' not in line.text: error.fail(line, "Syntax error in ASSERT statement (parentheses)") condition = "(%s" % (line.text.split('(', 1)[1]) if condition == "": error.fail(line, "Error in Assert statement") condition_str = condition.replace("'", "''") i = line.i f = line.filename txt = line.text.strip() result = [ Empty_line(i, "!", f), Empty_line(i, "! >>> %s" % (txt, ), f), If(i, " if (.not.%s) then" % (condition, ), f), Simple_line(i, " print *, irp_here//': Assert failed:'", f), Simple_line(i, " print *, ' file: %s, line: %d'" % (f, i), f), Simple_line(i, " print *, '%s'" % (condition_str, ), f), ] + debug_conditions(line) + [ Simple_line(i, " stop 1", f), Endif(i, " endif", f), Empty_line(i, "! <<< END %s" % (txt, ), f), Empty_line(i, "!", f) ] else: result = [] return result
def fun(x): if x not in variables: error.fail(line, "Variable %s unknown" % (x, )) return ([], Simple_line(line.i, " %s_is_built = .True." % (x, ), line.filename))
def change_includes(text): '''Deals with include files''' result = [] for line in text: if type(line) == Include: txt = line.text.replace('"', "'").split("'") if len(txt) != 3: print txt error.fail(line, "Error in include statement") directory = (("./" + line.filename).rsplit('/', 1)[0] + '/')[2:] if directory == "": filename = txt[1].strip() else: filename = directory + txt[1].strip() try: file = open(filename, 'r') file.close() result.append( Include(line.i, "! include '%s'" % filename, filename)) result += create_preprocessed_text(filename) except IOError: result.append(Declaration(line.i, line.text, line.filename)) else: result.append(line) return result
def process_assert(line): assert type(line) == Assert if command_line.do_assert: condition = "(%s"%(line.text.split('(',1)[1]) if condition == "": error.fail(line,"Error in Assert statement") condition_str = condition.replace("'","''") i = line.i f = line.filename txt = line.text.strip() result = [ Empty_line(i, "!", f), Empty_line(i, "! >>> %s"%(txt,), f), If (i, " if (.not.%s) then"%(condition,), f), Simple_line(i, " call irp_trace", f), Simple_line(i, " print *, irp_here//': Assert failed:'", f), Simple_line(i, " print *, ' file: %s, line: %d'"%(f,i), f), Simple_line(i, " print *, '%s'"%(condition_str,), f), ] + debug_conditions(line) + [ Simple_line(i, " stop 1", f), Endif (i, " endif", f), Empty_line(i, "! <<< END %s"%(txt,), f), Empty_line(i, "!", f) ] else: result = [] return result
def check_begin_end(text): '''Checks x...endx consistence''' filter_line = lambda line: type(line) in [ Do, Enddo, If, Endif, \ Program, Begin_provider, End_provider, \ Subroutine, Function, End, Begin_doc, End_doc ] text = filter(filter_line, text) d = { 'do' : Do, 'enddo': Enddo, 'if' : If, 'endif': Endif, '_doc': Begin_doc, 'end_doc': End_doc} assert type(text) == list def find_matching_end_ifdo(begin,x): level = 1 for i in range(begin+1,len(text)): line = text[i] if type(line) == d[x]: level += 1 elif type(line) == d["end%s"%(x,)]: level -= 1 if level == 0: return True elif type(line) in [End, End_provider]: break error.fail(text[begin],"Missing 'end%s'"%(x,)) def find_matching_end_subfunpro(begin,x): for i in range(begin+1,len(text)): line = text[i] if type(line) == x: return if type(line) in [ Subroutine, Function, Program, Begin_provider ]: error.fail(text[begin],type(line).str+" is not closed") error.fail(text[begin],type(line).str + " is not closed") level = 0 for i,line in enumerate(text): if type(line) == Begin_doc: find_matching_end_ifdo(i,'_doc') for i,line in enumerate(text): if type(line) == Do: find_matching_end_ifdo(i,'do') elif type(line) == If: find_matching_end_ifdo(i,'if') elif type(line) in [Subroutine, Function, Program]: level += 1 find_matching_end_subfunpro(i,End) elif type(line) == Begin_provider: level += 1 find_matching_end_subfunpro(i,End_provider) elif type(line) == End: level -= 1 elif type(line) == End_provider: level -= 1 if level < 0: error.fail(line,"Beginning of block not matched") return True
def find_matching_end_subfunpro(begin,x): for i in range(begin+1,len(text)): line = text[i] if type(line) == x: return if type(line) in [ Subroutine, Function, Program, Begin_provider ]: error.fail(text[begin],type(line).str+" is not closed") error.fail(text[begin],type(line).str + " is not closed")
def change_matching_enddo(begin,number): for i in range(begin+1,len(text)): line = text[i] if type(line) in [Continue,Enddo]: buffer = line.text.split() if buffer[0] == number: text[i] = Enddo(line.i," enddo",line.filename) return error.fail(text[begin],"Old-style do loops should end with 'continue' or 'end do'")
def fun(x): if x not in variables: error.fail(line, "Variable %s unknown" % (x, )) return [([], Simple_line(line.i, " call touch_%s" % (x, ), line.filename)), ([], Use(line.i, " use %s" % (variables[x].fmodule), line.filename))]
def find_subname(line): buffer = line.lower if not buffer.endswith(')'): buffer += "()" buffer = buffer.split('(') buffer = buffer[0].split() if len(buffer) < 2: error.fail(line,"Syntax Error") return buffer[-1]
def find_subname(line): buffer = line.lower if not buffer.endswith(')'): buffer += "()" buffer = buffer.split('(') buffer = buffer[0].split() if len(buffer) < 2: error.fail(line, "Syntax Error") return buffer[-1]
def find_matching_end_subfunpro(begin, x): line = text[begin] for i in range(begin + 1, len(text)): line = text[i] if type(line) == x: return if type(line) in [Subroutine, Function, Program, Begin_provider]: error.fail(text[begin], type(line).str + " is not closed") error.fail(text[begin], type(line).str + " is not closed")
def process_cont_provider(line): assert type(line) == Cont_provider buffer = line.lower.replace('[', " ") buffer = buffer.replace(']', "") buffer = buffer.split(',') if len(buffer) < 2: error.fail(line, "Error in Cont_provider statement") varname = buffer[1].strip() i = line.i f = line.filename return [Cont_provider(i, line.text, (f, varname))]
def execute_shell(text): '''Execute the embedded shell scripts''' def fail(l, a, b): error.fail(l, "In Begin_Shell, %s '%s'" % (a, b)) inside = False result = [] for line in text: if inside: if type(line) == Begin_shell: error.fail(line, "Nested Begin_shell") elif type(line) == End_shell: inside = False # Write script file scriptname = "%s%s_shell_%d" % (irpdir, line.filename, line.i) file = open(scriptname, 'w') file.writelines(script) file.close() scriptname = "%s_shell_%d" % (line.filename, line.i) file = open(scriptname, 'w') file.writelines(script) file.close() # Execute shell import os pipe = os.popen("%s < %s" % (shell, scriptname), 'r') lines = pipe.readlines() pipe.close() result += get_text(lines, scriptname) os.remove(scriptname) else: script.append(line.text + '\n') else: if type(line) == Begin_shell: inside = True begin = line.i script = [] # Find shell executable buffer = line.text.split('[') if len(buffer) > 2: fail(line, "Too many", '[') elif len(buffer) < 2: fail(line, "Missing", '[') buffer = buffer[1] buffer = buffer.split(']') if len(buffer) > 2: fail(line, "Too many", ']') elif len(buffer) < 2: fail(line, "Missing", ']') shell = buffer[0].strip() elif type(line) == End_shell: error.fail(line, "Begin_shell missing") else: result.append(line) return result
def change_matching_enddo(begin, number): for i in range(begin + 1, len(text)): line = text[i] if type(line) in [Continue, Enddo]: buffer = line.text.split() if buffer[0] == number: text[i] = Enddo(line.i, " enddo", line.filename) return error.fail( text[begin], "Old-style do loops should end with 'continue' or 'end do'")
def process_cont_provider(line): assert type(line) == Cont_provider buffer = line.lower.replace('['," ") buffer = buffer.replace(']',"") buffer = buffer.split(',') if len(buffer) < 2: error.fail(line,"Error in Cont_provider statement") varname = buffer[1].strip() i = line.i f = line.filename return [ Cont_provider(i,line.text,(f,varname)) ]
def type(self): if '_type' not in self.__dict__: line = self.line.text buffer = line.split(',')[0] try: buffer = buffer.split('[')[1].strip() except IndexError: error.fail(None,"Error in definition of %s."%(self.name)) if self.dim != []: buffer = "%s, allocatable"%(buffer) self._type = buffer return self._type
def type(self): if '_type' not in self.__dict__: line = self.line.text buffer = line.split(',')[0] try: buffer = buffer.split('[')[1].strip() except IndexError: error.fail(None, "Error in definition of %s." % (self.name)) if self.dim != []: buffer = "%s, allocatable" % (buffer) self._type = buffer return self._type
def execute_shell(text): '''Execute the embedded shell scripts''' def fail(l,a,b): error.fail(l,"In Begin_Shell, %s '%s'"%(a,b)) inside = False result = [] for line in text: if inside: if type(line) == Begin_shell: error.fail(line,"Nested Begin_shell") elif type(line) == End_shell: inside = False # Write script file scriptname = "%s%s_shell_%d"%(irpdir,line.filename,line.i) file = open(scriptname,'w') file.writelines(script) file.close() scriptname = "%s_shell_%d"%(line.filename,line.i) file = open(scriptname,'w') file.writelines(script) file.close() # Execute shell import os pipe = os.popen("%s < %s"%(shell,scriptname),'r') lines = pipe.readlines() pipe.close() result += get_text(lines,scriptname) os.remove(scriptname) else: script.append(line.text+'\n') else: if type(line) == Begin_shell: inside = True begin = line.i script = [] # Find shell executable buffer = line.text.split('[') if len(buffer) > 2: fail(line,"Too many",'[') elif len(buffer) < 2: fail(line,"Missing",'[') buffer = buffer[1] buffer = buffer.split(']') if len(buffer) > 2: fail(line,"Too many",']') elif len(buffer) < 2: fail(line,"Missing",']') shell = buffer[0].strip() elif type(line) == End_shell: error.fail(line,"Begin_shell missing") else: result.append(line) return result
def find_matching_end_ifdo(begin, x): level = 1 for i in range(begin + 1, len(text)): line = text[i] if type(line) == d[x]: level += 1 elif type(line) == d["end%s" % (x, )]: level -= 1 if level == 0: return True elif type(line) in [End, End_provider]: break error.fail(text[begin], "Missing 'end%s'" % (x, ))
def find_matching_end_ifdo(begin,x): level = 1 for i in range(begin+1,len(text)): line = text[i] if type(line) == d[x]: level += 1 elif type(line) == d["end%s"%(x,)]: level -= 1 if level == 0: return True elif type(line) in [End, End_provider]: break error.fail(text[begin],"Missing 'end%s'"%(x,))
def update_variables(): for filename,text in preprocessed_text: for line in filter(lambda x: type(x) in [ Touch, SoftTouch ], text): vars = line.lower.split() if len(vars) < 2: error.fail(line,"Syntax error") for v in vars[1:]: if v not in variables: error.fail(line,"Variable %s unknown"%(v,)) variables[v]._is_touched = True for line in filter(lambda x: type(x) == Free,text): vars = line.lower.split() if len(vars) < 2: error.fail(line,"Syntax error") for v in vars[1:]: if v not in variables: error.fail(line,"Variable %s unknown"%(v,)) variables[v].is_freed = True for line in filter(lambda x: type(x) == Irp_read,text): variables[line.filename]._is_read = True for line in filter(lambda x: type (x) == Irp_write,text): variables[line.filename]._is_written = True
def check_touch(line,vars,main_vars): def fun(main_var): if main_var not in variables: error.fail(line,"Variable %s unknown"%(main_var,)) x = variables[main_var] return [main_var]+x.others all_others = make_single(flatten( map(fun,main_vars) )) all_others.sort() vars.sort() for x,y in zip(vars,all_others): if x != y: message = "The following entities should be touched:\n" message = "\n".join([message]+map(lambda x: "- %s"%(x,),all_others)) error.fail(line,message)
def update_variables(): for filename, text in preprocessed_text: for line in filter(lambda x: type(x) in [Touch, SoftTouch], text): vars = line.lower.split() if len(vars) < 2: error.fail(line, "Syntax error") for v in vars[1:]: if v not in variables: error.fail(line, "Variable %s unknown" % (v, )) variables[v]._is_touched = True for line in filter(lambda x: type(x) == Free, text): vars = line.lower.split() if len(vars) < 2: error.fail(line, "Syntax error") for v in vars[1:]: if v not in variables: error.fail(line, "Variable %s unknown" % (v, )) variables[v].is_freed = True for line in filter(lambda x: type(x) == Irp_read, text): variables[line.filename]._is_read = True for line in filter(lambda x: type(x) == Irp_write, text): variables[line.filename]._is_written = True
def name(self): '''Name is lowercase''' if '_name' not in self.__dict__: buffer = None text = self.text for line in text: if type(line) == Begin_provider: self._name = line.filename[1] if "(" in self._name: error.fail(line,"""'(' not allowed in variable name. A ',' is probably missing between the name of the variable and the dimension. """) break return self._name
def check_touch(line, vars, main_vars): def fun(main_var): if main_var not in variables: error.fail(line, "Variable %s unknown" % (main_var, )) x = variables[main_var] return [main_var] + x.others all_others = make_single(flatten(map(fun, main_vars))) all_others.sort() vars.sort() for x, y in zip(vars, all_others): if x != y: message = "The following entities should be touched:\n" message = "\n".join([message] + map(lambda x: "- %s" % (x, ), all_others)) error.fail(line, message)
def change_single_line_ifs(text): '''Changes: if (test) result to if (test) then result endif''' assert type(text) == list result = [] for line in text: if type(line) == If: if line.lower.endswith("then"): result.append(line) else: buffer = line.text begin = buffer.find('(') if begin < 0: error.fail(line, "Error in if statement") level = 0 instring = False for i, c in enumerate(buffer[begin:]): if c == "'": instring = not instring if instring: pass elif c == '(': level += 1 elif c == ')': level -= 1 if level == 0: end = begin + i + 1 break if level != 0: error.fail(line, "Error in if statement") test = buffer[:end] code = buffer[end:] i = line.i f = line.filename result.append(If(i, "%s then" % (test, ), f)) result += get_type(i, f, code, False)[0] result.append(Endif(i, " endif", f)) else: result.append(line) return result
def change_single_line_ifs(text): '''Changes: if (test) result to if (test) then result endif''' assert type(text) == list result = [] for line in text: if type(line) == If: if line.lower.endswith("then"): result.append(line) else: buffer = line.text begin = buffer.find('(') if begin < 0: error.fail(line,"Error in if statement") level = 0 instring = False for i,c in enumerate(buffer[begin:]): if c == "'": instring = not instring if instring: pass elif c == '(': level +=1 elif c == ')': level -= 1 if level == 0: end = begin+i+1 break if level != 0: error.fail(line,"Error in if statement") test = buffer[:end] code = buffer[end:] i = line.i f = line.filename result.append( If(i,"%s then"%(test,),f) ) result += get_type(i,f,code,False)[0] result.append( Endif(i," endif",f) ) else: result.append(line) return result
def process_begin_provider(line): assert type(line) == Begin_provider buffer = line.lower.replace('['," ") buffer = buffer.replace(']',"") buffer = buffer.split(',') if len(buffer) < 2: error.fail(line,"Error in Begin_provider statement") varname = buffer[1].strip() length = len(varname) i = line.i f = line.filename result = [ Begin_provider(i,line.text, (f,varname)), Declaration(i," character*(%d) :: irp_here = '%s'"%(length,varname), f) ] if command_line.do_assert or command_line.do_debug: result += [ Simple_line(i," call irp_enter(irp_here)", f), ] return result
def children(self): if '_children' not in self.__dict__: if not self.is_main: self._children = [] from variables import variables if '_needs' not in self.__dict__: import parsed_text result = [] for x in self.needs: result.append(x) try: result += variables[x].children except RuntimeError: pass # Exception will be checked after self._children = make_single(result) if self.name in result: error.fail(self.line,"Cyclic dependencies:\n%s"%(str(self._children))) return self._children
def check_OpenMP(text): assert type(text) == list result = [] inside_openmp = False for line in text: if type(line) == Openmp: # Detect OpenMP blocks buffer = line.text.lower().split() if buffer[1] == "parallel": inside_openmp = True if buffer[1] == "end" and buffer[2] == "parallel": inside_openmp = False result.append(line) if inside_openmp: if type(line) in [ Provide_all, Provide, Touch, SoftTouch ]: error.fail(line,type(line).str+" is not allowed in an OpenMP block.") return result
def children(self): if '_children' not in self.__dict__: if not self.is_main: self._children = [] from variables import variables if '_needs' not in self.__dict__: import parsed_text result = [] for x in self.needs: result.append(x) try: result += variables[x].children except RuntimeError: pass # Exception will be checked after self._children = make_single(result) if self.name in result: error.fail(self.line, "Cyclic dependencies:\n%s" % (str(self._children))) return self._children
def change_includes(text): '''Deals with include files''' result = [] for line in text: if type(line) == Include: txt = line.text.replace('"',"'").split("'") if len(txt) != 3: print txt error.fail(line,"Error in include statement") filename = txt[1].strip() try: file = open(filename,'r') file.close() result.append(Include(line.i,"! include '%s'"%filename,filename)) result += create_preprocessed_text(filename) except IOError: result.append(Declaration(line.i,line.text,line.filename)) else: result.append(line) return result
def check_OpenMP(text): assert type(text) == list result = [] inside_openmp = False for line in text: if type(line) == Openmp: # Detect OpenMP blocks buffer = line.text.lower().split() if buffer[1] == "parallel": inside_openmp = True if buffer[1] == "end" and buffer[2] == "parallel": inside_openmp = False result.append(line) if inside_openmp: if type(line) in [Provide_all, Provide, Touch, SoftTouch]: error.fail( line, type(line).str + " is not allowed in an OpenMP block.") return result
def parents(self): if '_parents' not in self.__dict__: if not self.is_main: self._parents = [] else: from variables import variables if '_needed_by' not in self.__dict__: import parsed_text if command_line.do_unused and self.needed_by == []: error.warn(None, "Provider %s is not used"%self.name) result = [] for x in self.needed_by: result.append(x) try: result += variables[x].parents except RuntimeError: pass # Exception will be checked after self._parents = make_single(result) if self.name in result: error.fail(self.line,"Cyclic dependencies:\n%s"%(str(self._parents))) return self._parents
def process_irp_rw(line,rw,t): assert type(line) == t buffer = line.text.split() if len(buffer) == 2: dummy, variable = buffer num = "0" elif len(buffer) == 3: dummy, variable, num = buffer else: error.fail(line,"Error in IRP_%s statement"%(rw,)) variable = variable.lower() i = line.i f = line.filename txt = line.text.lstrip() result = [ Empty_line(i,"!",f), t(i,"! >>> %s"%(txt,),variable ), Provide_all(i," call %ser_%s('%s')"%(rw,variable,num),f), Empty_line(i,"! >>> END %s "%(txt,),f ), Empty_line(line.i,"!",f), ] return result
def process_irp_rw(line, rw, t): assert type(line) == t buffer = line.text.split() if len(buffer) == 2: dummy, variable = buffer num = "0" elif len(buffer) == 3: dummy, variable, num = buffer else: error.fail(line, "Error in IRP_%s statement" % (rw, )) variable = variable.lower() i = line.i f = line.filename txt = line.text.lstrip() result = [ Empty_line(i, "!", f), t(i, "! >>> %s" % (txt, ), variable), Provide_all(i, " call %ser_%s('%s')" % (rw, variable, num), f), Empty_line(i, "! >>> END %s " % (txt, ), f), Empty_line(line.i, "!", f), ] return result
def process_begin_provider(line): assert type(line) == Begin_provider buffer = line.lower.replace('[', " ") buffer = buffer.replace(']', "") buffer = buffer.split(',') if len(buffer) < 2: error.fail(line, "Error in Begin_provider statement") varname = buffer[1].strip() length = len(varname) i = line.i f = line.filename result = [ Begin_provider(i, line.text, (f, varname)), Declaration( i, " character*(%d) :: irp_here = '%s'" % (length, varname), f) ] if command_line.do_debug: result += [ Simple_line(i, " call irp_enter(irp_here)", f), ] return result
def parents(self): if '_parents' not in self.__dict__: if not self.is_main: self._parents = [] else: from variables import variables if '_needed_by' not in self.__dict__: import parsed_text if command_line.do_unused and self.needed_by == []: error.warn(None, "Provider %s is not used" % self.name) result = [] for x in self.needed_by: result.append(x) try: result += variables[x].parents except RuntimeError: pass # Exception will be checked after self._parents = make_single(result) if self.name in result: error.fail( self.line, "Cyclic dependencies:\n%s" % (str(self._parents))) return self._parents
def get_type (i, filename, line, is_doc): '''Find the type of a text line''' assert type(i) == int assert type(filename) == str assert type(line) == str assert type(is_doc) == bool # add support for interface block has_interface = False line = line.rstrip() line = line.replace("$IRP_ALIGN",command_line.align) lower_line0 = line.lstrip().lower() lower_line = lower_line0.replace("!"," ! ") # Replacements lower_line = re_elseif.sub("elseif",lower_line) lower_line = re_enddo.sub("enddo",lower_line) lower_line = re_endtype.sub("endtype",lower_line) lower_line = re_endmodule.sub("endmodule",lower_line) lower_line = re_endif.sub("endif",lower_line) lower_line = re_endselect.sub("endselect",lower_line) lower_line = re_endinterface.sub("endinterface",lower_line) for c in """()'"[]""": lower_line = lower_line.replace(c," "+c+" ") buffer = lower_line.split() if len(buffer) == 0: return [ Empty_line(i,line,filename) ], is_doc firstword = buffer[0] if firstword.isdigit(): assert len(buffer) > 1 buffer = buffer[1:] firstword = buffer[0] # Identify line if firstword == "endinterface": has_interface = False return [ Simple_line (i,line,filename) ], False if firstword == "interface" or has_interface: has_interface = True return [ Simple_line (i,line,filename) ], False if firstword == "end_doc": return [ End_doc (i,line,filename) ], False if firstword == "begin_doc": return [ Begin_doc (i,line,filename) ], True if is_doc: return [ Doc (i,line,filename) ], is_doc if firstword in simple_dict: return [ simple_dict[firstword](i,line,filename) ], is_doc if firstword in [ "select", "selectcase" ]: return [ Select(i,line,filename) ] , is_doc if len(lower_line0) > 4: if firstword[0] == '#': result = [ Simple_line(i,line,filename) ] error.warn ( result[0] , """irpf90 may not work with preprocessor directives. You can use Irp_if ... Irp_else ... Irp_endif instead of #ifdef ... #else ... #endif""" ) return result, is_doc if firstword.startswith("case("): return [ Case(i,line,filename) ], is_doc if lower_line0[1:5] == "$omp": return [ Openmp(i,line,filename) ], is_doc elif lower_line0[1:5] in ["dec$", "dir$"] and command_line.directives: return [ Directive(i,line,filename) ], is_doc elif lower_line0[1:3] == "$ ": return [ Openmp(i,line,filename) ], is_doc if re_decl.match(lower_line) is not None: if "function" in buffer[1:3]: return [ Function (i,line,filename) ], is_doc else: return [ Declaration (i,line,filename) ], is_doc # Detect errors if firstword == "dowhile": error.fail( Do(i,line,filename) , "'do while' should be in 2 words." ) return [ Simple_line(i,line,filename) ], is_doc
def fail(l, a, b): error.fail(l, "In %s, %s" % (a, b))
def func(filename, text): varlist = [] result = [] append = result.append for line in text: #filter( # lambda x: type(x) not in [ Doc, Begin_doc, End_doc ], # text): if type(line) in [ \ Empty_line, Continue, Return, Begin_shell, End_shell, Openmp, Directive, Use, Enddo, End_select, Endif, Implicit, Program, Subroutine, Function, End, ]: append(([], line)) elif type(line) in [Begin_provider, Cont_provider]: if type(line) == Begin_provider: varlist = [] buffer = map(strip, line.lower.replace(']', '').split(',')) assert len(buffer) > 1 v = buffer[1] varlist.append(v) variable_list = find_variables_in_line(line) try: variable_list.remove(variables[v].same_as) except ValueError: print v, variables[v].same_as raise append((variable_list, line)) elif type(line) == End_provider: varlist = [] append(([], line)) elif type(line) == Provide: l = line.lower.split()[1:] l = filter(lambda x: x not in varlist, l) for v in l: if v not in variables: error.fail(line, "Variable %s is unknown" % (v)) append( (l, Simple_line(line.i, "!%s" % (line.text), line.filename))) elif type(line) == NoDep: l = line.lower.split()[1:] for v in l: if v not in variables: error.fail(line, "Variable %s is unknown" % (v)) l = map(lambda x: "-%s" % (x), l) append( (l, Simple_line(line.i, "!%s" % (line.text), line.filename))) elif type(line) in [Touch, SoftTouch]: vars = line.lower.split() if len(vars) < 2: error.fail(line, "Syntax error") vars = vars[1:] def fun(x): main = variables[x].same_as return main main_vars = make_single(map(fun, vars)) check_touch(line, vars, main_vars) txt = " ".join(vars) append((vars, Simple_line(line.i, "!", line.filename))) append(([], Simple_line(line.i, "! >>> TOUCH %s" % (txt, ), line.filename))) def fun(x): if x not in variables: error.fail(line, "Variable %s unknown" % (x, )) return [([], Simple_line(line.i, " call touch_%s" % (x, ), line.filename)), ([], Use(line.i, " use %s" % (variables[x].fmodule), line.filename))] result += flatten(map(fun, main_vars)) def fun(x): if x not in variables: error.fail(line, "Variable %s unknown" % (x, )) return ([], Simple_line(line.i, " %s_is_built = .True." % (x, ), line.filename)) result += map(fun, main_vars[:-1]) if type(line) == SoftTouch: append(([], Simple_line(line.i, "! <<< END TOUCH (Soft)", line.filename))) else: append(([], Provide_all(line.i, "! <<< END TOUCH", line.filename))) elif type(line) == Call: l = find_variables_in_line(line) l = filter(lambda x: x not in varlist, l) sub = find_subroutine_in_line(line) if sub not in subroutines: t = Simple_line append((l, Simple_line(line.i, line.text, line.filename))) else: append((l, line)) if subroutines[sub].touches != []: append(([], Provide_all(line.i, "", line.filename))) elif type(line) == Free: vars = line.lower.split() vars = vars[1:] append( ([], Simple_line(line.i, "!%s" % (line.text), line.filename))) use = map(lambda x: " use %s" % (variables[x].fmodule), vars) for var in vars: result += map( lambda x: ([], Use(line.i, x, line.filename)), make_single(use)) result += map( lambda x: ([], Simple_line(line.i, x, line.filename)), variables[var].free) elif type(line) == Irp_read: append( ([], Simple_line(line.i, "!%s" % (line.text), line.filename))) elif type(line) == Irp_write: append( ([], Simple_line(line.i, "!%s" % (line.text), line.filename))) elif type(line) in [Begin_doc, End_doc, Doc]: pass else: l = find_variables_in_line(line) l = filter(lambda x: x not in varlist, l) append((l, line)) return result
def fail(l, a, b): error.fail(l, "In Begin_Shell, %s '%s'" % (a, b))
def func(filename, text): result = [] append = result.append # 1st pass varlist = [] ifvars = [] elsevars = [] old_varlist = [] old_ifvars = [] old_elsevars = [] revtext = list(text) revtext.reverse() try: for vars, line in revtext: if type(line) in [End_provider, End]: varlist = [] append(([], line)) elif type(line) in [Endif, End_select]: old_ifvars.append(list(ifvars)) old_elsevars.append(list(elsevars)) old_varlist.append(list(varlist)) varlist = [] append(([], line)) elif type(line) == Else: elsevars += list(varlist) append((varlist, line)) varlist = [] elif type(line) in [Elseif, Case]: ifvars += list(varlist) append((varlist, line)) if vars != []: varlist = old_varlist.pop() varlist += vars old_varlist.append(list(varlist)) varlist = [] elif type(line) in [If, Select]: ifvars += list(varlist) append((varlist, line)) vars += filter(lambda x: x in elsevars, ifvars) ifvars = old_ifvars.pop() elsevars = old_elsevars.pop() varlist = old_varlist.pop() + vars elif type(line) in [ Begin_provider, Program, Subroutine, Function ]: varlist += vars append((varlist, line)) if old_varlist != [] \ or old_ifvars != [] \ or old_elsevars != []: error.fail(line, "End if missing") varlist = [] elif type(line) == Provide_all: append((vars, line)) else: varlist += vars append(([], line)) except: error.fail(line, "Unable to parse file") result.reverse() # 2nd pass text = result result = [] append = result.append old_varlist = [] varlist = [] try: for vars, line in text: if vars != []: vars = make_single(vars) if type(line) in [ Begin_provider, Program, Subroutine, Function ]: varlist = list(vars) elif type(line) in [If, Select]: old_varlist.append(varlist) vars = filter(lambda x: x not in varlist, vars) varlist = make_single(varlist + vars) assert old_varlist is not varlist elif type(line) in [Elseif, Else, Case]: varlist = old_varlist.pop() old_varlist.append(varlist) vars = filter(lambda x: x not in varlist, vars) varlist = make_single(varlist + vars) assert old_varlist is not varlist elif type(line) in [Endif, End_select]: varlist = old_varlist.pop() elif type(line) == Provide_all: vars += varlist elif type(line) in [End_provider, End]: assert old_varlist == [] varlist = [] for v in vars[:]: if v[0] == '-': vars.remove(v) vars.remove(v[1:]) result.append((vars, line)) except: error.fail(line, "Unable to parse file") return result
def fun(main_var): if main_var not in variables: error.fail(line,"Variable %s unknown"%(main_var,)) x = variables[main_var] return [main_var]+x.others
def check_begin_end(text): '''Checks x...endx consistence''' filter_line = lambda line: type(line) in [ Do, Enddo, If, Endif, \ Program, Begin_provider, End_provider, \ Subroutine, Function, End, Begin_doc, End_doc ] text = filter(filter_line, text) d = { 'do': Do, 'enddo': Enddo, 'if': If, 'endif': Endif, '_doc': Begin_doc, 'end_doc': End_doc } assert type(text) == list def find_matching_end_ifdo(begin, x): level = 1 for i in range(begin + 1, len(text)): line = text[i] if type(line) == d[x]: level += 1 elif type(line) == d["end%s" % (x, )]: level -= 1 if level == 0: return True elif type(line) in [End, End_provider]: break error.fail(text[begin], "Missing 'end%s'" % (x, )) def find_matching_end_subfunpro(begin, x): line = text[begin] for i in range(begin + 1, len(text)): line = text[i] if type(line) == x: return if type(line) in [Subroutine, Function, Program, Begin_provider]: error.fail(text[begin], type(line).str + " is not closed") error.fail(text[begin], type(line).str + " is not closed") level = 0 for i, line in enumerate(text): if type(line) == Begin_doc: find_matching_end_ifdo(i, '_doc') for i, line in enumerate(text): if type(line) == Do: find_matching_end_ifdo(i, 'do') elif type(line) == If: find_matching_end_ifdo(i, 'if') elif type(line) in [Subroutine, Function, Program]: level += 1 find_matching_end_subfunpro(i, End) elif type(line) == Begin_provider: level += 1 find_matching_end_subfunpro(i, End_provider) elif type(line) == End: level -= 1 elif type(line) == End_provider: level -= 1 if level < 0: error.fail(line, "Beginning of block not matched") return True
def get_type(i, filename, line, is_doc): '''Find the type of a text line''' assert type(i) == int assert type(filename) == str assert type(line) == str assert type(is_doc) == bool # add support for interface block has_interface = False line = line.rstrip() line = line.replace("$IRP_ALIGN", command_line.align) lower_line0 = line.lstrip().lower() lower_line = lower_line0.replace("!", " ! ") # Replacements lower_line = re_elseif.sub("elseif", lower_line) lower_line = re_enddo.sub("enddo", lower_line) lower_line = re_endtype.sub("endtype", lower_line) lower_line = re_endmodule.sub("endmodule", lower_line) lower_line = re_endif.sub("endif", lower_line) lower_line = re_endselect.sub("endselect", lower_line) lower_line = re_endinterface.sub("endinterface", lower_line) for c in """()'"[]""": lower_line = lower_line.replace(c, " " + c + " ") buffer = lower_line.split() if len(buffer) == 0: return [Empty_line(i, line, filename)], is_doc firstword = buffer[0] if firstword.isdigit(): assert len(buffer) > 1 buffer = buffer[1:] firstword = buffer[0] # Identify line if firstword == "endinterface": has_interface = False return [Simple_line(i, line, filename)], False if firstword == "interface" or has_interface: has_interface = True return [Simple_line(i, line, filename)], False if firstword == "end_doc": return [End_doc(i, line, filename)], False if firstword == "begin_doc": return [Begin_doc(i, line, filename)], True if is_doc: return [Doc(i, line, filename)], is_doc if firstword in simple_dict: return [simple_dict[firstword](i, line, filename)], is_doc if firstword in ["select", "selectcase"]: return [Select(i, line, filename)], is_doc if len(lower_line0) > 4: if firstword[0] == '#': result = [Simple_line(i, line, filename)] error.warn( result[0], """irpf90 may not work with preprocessor directives. You can use Irp_if ... Irp_else ... Irp_endif instead of #ifdef ... #else ... #endif""") return result, is_doc if firstword.startswith("case("): return [Case(i, line, filename)], is_doc if lower_line0[1:5] == "$omp": return [Openmp(i, line, filename)], is_doc elif lower_line0[1:5] in ["dec$", "dir$"] and command_line.directives: return [Directive(i, line, filename)], is_doc elif lower_line0[1:3] == "$ ": return [Openmp(i, line, filename)], is_doc if re_decl.match(lower_line) is not None: if "function" in buffer[1:3]: return [Function(i, line, filename)], is_doc else: return [Declaration(i, line, filename)], is_doc # Detect errors if firstword == "dowhile": error.fail(Do(i, line, filename), "'do while' should be in 2 words.") return [Simple_line(i, line, filename)], is_doc
def fail(l,a,b): error.fail(l,"In %s, %s"%(a,b)) def get_variables(line):
def fail(l,a,b): error.fail(l,"In Begin_Shell, %s '%s'"%(a,b)) inside = False
def func(filename, text): varlist = [] result = [] append = result.append for line in text: #filter( # lambda x: type(x) not in [ Doc, Begin_doc, End_doc ], # text): if type(line) in [ \ Empty_line, Continue, Return, Begin_shell, End_shell, Openmp, Directive, Use, Enddo, End_select, Endif, Implicit, Program, Subroutine, Function, End, ]: append( ([],line) ) elif type(line) in [ Begin_provider, Cont_provider ]: if type(line) == Begin_provider: varlist = [] buffer = map(strip,line.lower.replace(']','').split(',')) assert len(buffer) > 1 v = buffer[1] varlist.append(v) variable_list = find_variables_in_line(line) try: variable_list.remove(variables[v].same_as) except ValueError: print v, variables[v].same_as raise append( (variable_list,line) ) elif type(line) == End_provider: varlist = [] append( ([],line) ) elif type(line) == Provide: l = line.lower.split()[1:] l = filter(lambda x: x not in varlist, l) for v in l: if v not in variables: error.fail(line,"Variable %s is unknown"%(v)) append( (l,Provide(line.i,"",line.filename)) ) append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) ) elif type(line) == NoDep: l = line.lower.split()[1:] for v in l: if v not in variables: error.fail(line,"Variable %s is unknown"%(v)) l = map(lambda x: "-%s"%(x), l) append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) ) elif type(line) in [ Touch, SoftTouch ]: vars = line.lower.split() if len(vars) < 2: error.fail(line,"Syntax error") vars = vars[1:] def fun(x): main = variables[x].same_as return main main_vars = make_single( map(fun, vars) ) check_touch(line,vars,main_vars) txt = " ".join(vars) append ( (vars,Simple_line(line.i,"!",line.filename)) ) append ( ([],Simple_line(line.i,"! >>> TOUCH %s"%(txt,),line.filename)) ) def fun(x): if x not in variables: error.fail(line,"Variable %s unknown"%(x,)) return [ ([],Simple_line(line.i," call touch_%s"%(x,),line.filename)), ([],Use(line.i," use %s"%(variables[x].fmodule), line.filename)) ] result += flatten(map( fun, main_vars )) def fun(x): if x not in variables: error.fail(line,"Variable %s unknown"%(x,)) return ([],Simple_line(line.i," %s_is_built = .True."%(x,),line.filename)) result += map( fun, main_vars[:-1] ) if type(line) == SoftTouch: append ( ([],Simple_line(line.i,"! <<< END TOUCH (Soft)",line.filename)) ) else: append ( ([],Provide_all(line.i,"! <<< END TOUCH",line.filename)) ) elif type(line) == Call: l = find_variables_in_line(line) l = filter(lambda x: x not in varlist, l) sub = find_subroutine_in_line(line) if sub not in subroutines: t = Simple_line append( (l,Simple_line(line.i,line.text,line.filename)) ) else: append( (l,line) ) if subroutines[sub].touches != []: append( ([],Provide_all(line.i,"",line.filename)) ) elif type(line) == Free: vars = line.lower.split() vars = vars[1:] append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) ) use = map(lambda x: " use %s"%(variables[x].fmodule),vars) for var in vars: result += map(lambda x: ([],Use(line.i,x,line.filename)), make_single(use)) result += map(lambda x: ([],Simple_line(line.i,x,line.filename)), variables[var].free) elif type(line) == Irp_read: append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) ) elif type(line) == Irp_write: append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) ) elif type(line) in [ Begin_doc, End_doc, Doc ]: pass else: l = find_variables_in_line(line) l = filter(lambda x: x not in varlist, l) append( (l,line) ) return result
def func(filename, text): result = [] append = result.append # 1st pass varlist = [] ifvars = [] elsevars = [] old_varlist = [] old_ifvars = [] old_elsevars = [] revtext = list(text) revtext.reverse() try: for vars,line in revtext: if type(line) in [ End_provider,End ]: varlist = [] append( ([],line) ) elif type(line) in [ Endif, End_select ]: old_ifvars.append( list(ifvars) ) old_elsevars.append( list(elsevars) ) old_varlist.append( list(varlist) ) varlist = [] append( ([],line) ) elif type(line) == Else: elsevars += list(varlist) append( (varlist,line) ) varlist = [] elif type(line) in [ Elseif, Case ]: ifvars += list(varlist) append( (varlist,line) ) if vars != []: varlist = old_varlist.pop() varlist += vars old_varlist.append( list(varlist) ) varlist = [] elif type(line) in [ If, Select ]: ifvars += list(varlist) append( (varlist,line) ) vars += filter(lambda x: x in elsevars, ifvars) ifvars = old_ifvars.pop() elsevars = old_elsevars.pop() varlist = old_varlist.pop() + vars elif type(line) in [ Begin_provider, Program, Subroutine, Function ]: varlist += vars append( (varlist,line) ) if old_varlist != [] \ or old_ifvars != [] \ or old_elsevars != []: error.fail(line,"End if missing") varlist = [] elif type(line) in (Provide,Provide_all): append( (vars,line) ) else: varlist += vars append( ([],line) ) except: error.fail(line,"Unable to parse file") result.reverse() # 2nd pass text = result result = [] append = result.append old_varlist = [] varlist = [] try: for vars,line in text: if vars != []: vars = make_single(vars) if type(line) in [ Begin_provider, Program, Subroutine, Function ]: varlist = list(vars) elif type(line) in [ If, Select ]: old_varlist.append(varlist) vars = filter(lambda x: x not in varlist,vars) varlist = make_single(varlist + vars) assert old_varlist is not varlist elif type(line) in [ Elseif, Else, Case ]: varlist = old_varlist.pop() old_varlist.append(varlist) vars = filter(lambda x: x not in varlist,vars) varlist = make_single(varlist + vars) assert old_varlist is not varlist elif type(line) in [ Endif, End_select ]: varlist = old_varlist.pop() elif type(line) == Provide_all: vars += varlist elif type(line) in [ End_provider, End ]: assert old_varlist == [] varlist = [] for v in vars[:]: if v[0] == '-': vars.remove(v) vars.remove(v[1:]) result.append( (vars,line) ) except: error.fail(line,"Unable to parse file") return result
def fun(x): if x not in variables: error.fail(line,"Variable %s unknown"%(x,)) return [ ([],Simple_line(line.i," call touch_%s"%(x,),line.filename)), ([],Use(line.i," use %s"%(variables[x].fmodule), line.filename)) ]
def fun(main_var): if main_var not in variables: error.fail(line, "Variable %s unknown" % (main_var, )) x = variables[main_var] return [main_var] + x.others
def fun(x): if x not in variables: error.fail(line,"Variable %s unknown"%(x,)) return ([],Simple_line(line.i," %s_is_built = .True."%(x,),line.filename))