diff --git a/example/uvwt.irp.f b/example/uvwt.irp.f index f1c7a87..63655a1 100644 --- a/example/uvwt.irp.f +++ b/example/uvwt.irp.f @@ -13,6 +13,15 @@ END_PROVIDER BEGIN_PROVIDER [ integer, u1 ] integer :: fu u1 = fu(d1,d2) + integer :: n, m + n=3 + do i=1,n + print *, i + enddo + m=2 + do i=1,m + print *, i + enddo PROVIDE u2 END_PROVIDER diff --git a/src/command_line.py b/src/command_line.py index da43acb..b01ba7b 100644 --- a/src/command_line.py +++ b/src/command_line.py @@ -27,6 +27,7 @@ import getopt, sys from version import version +import re description = "IRPF90 Fortran preprocessor." options = {} @@ -42,6 +43,7 @@ options['t'] = [ 'touch' , 'Display which entities are touched', 1 ] options['m'] = [ 'memory' , 'Debug memory info', 0 ] options['z'] = [ 'openmp' , 'Automatic openMP tasks (may not work)', 0 ] options['l'] = [ 'align' , 'Align arrays using compiler directives', 1 ] +options['s'] = [ 'substitute' , 'Substitute values for loop max values', 1 ] options['r'] = [ 'no_directives', 'Ignore compiler directives !DEC$ and !DIR$', 0 ] class CommandLine(object): @@ -61,6 +63,17 @@ class CommandLine(object): return self._defined defined = property(fget=defined) + def substituted(self): + if '_substituted' not in self.__dict__: + self._substituted = {} + for o,a in self.opts: + if o in [ "-s", '--'+options['s'][0] ]: + k, v = a.split(':') + v_re = re.compile(r"(^.*[,| ]+)(%s)(\s*$)"%k.strip()) + self._substituted[k] = [v, v_re] + return self._substituted + substituted = property(fget=substituted) + def preprocessed(self): if '_preprocessed' not in self.__dict__: self._preprocessed = [] diff --git a/src/parsed_text.py b/src/parsed_text.py index 8902fe1..4a68f81 100644 --- a/src/parsed_text.py +++ b/src/parsed_text.py @@ -30,7 +30,7 @@ from irpf90_t import * from variables import variables from preprocessed_text import preprocessed_text from subroutines import subroutines -import regexps +import regexps, re import error vtuple = map(lambda v: (v, variables[v].same_as, variables[v].regexp), variables.keys()) @@ -505,10 +505,28 @@ def check_opt(): do_level -= 1 check_opt() +###################################################################### +def perform_loop_substitutions(): + main_result = [] + for filename, text in parsed_text: + result = [] + append = result.append + for vars,line in text: + if type(line) == Do: + for k,v in command_line.substituted.items(): + reg = v[1] + if reg.search(line.text) is not None: + line.text = re.sub(reg,r'\1%s\3', line.text)%v[0] + append( (vars,line) ) + main_result.append( (filename, result) ) + return main_result + +parsed_text = perform_loop_substitutions() + ###################################################################### if __name__ == '__main__': for i in range(len(parsed_text)): - if parsed_text[i][0] == 'psi.irp.f': +# if parsed_text[i][0] == 'psi.irp.f': print '!-------- %s -----------'%(parsed_text[i][0]) for line in parsed_text[i][1]: print line[1] diff --git a/src/version.py b/src/version.py index 2be6f8b..71115e0 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.2.2" +version = "1.2.3"