diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-01 11:49:23 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-01 11:49:23 +0000 |
commit | c3c53e6805beb164581f041a69c9f51c2740d344 (patch) | |
tree | 70d942460a7624996b6a7ee0dd5e25c014b9772f /numpy/f2py/lib/parser/parsefortran.py | |
parent | 6c52e6fc05f89f13871b79074ea8891c11092d35 (diff) | |
download | numpy-c3c53e6805beb164581f041a69c9f51c2740d344.tar.gz |
F2PY G3: Moved Fortran parser related code to subpackage parser.
Diffstat (limited to 'numpy/f2py/lib/parser/parsefortran.py')
-rw-r--r-- | numpy/f2py/lib/parser/parsefortran.py | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/numpy/f2py/lib/parser/parsefortran.py b/numpy/f2py/lib/parser/parsefortran.py new file mode 100644 index 000000000..ac3df3068 --- /dev/null +++ b/numpy/f2py/lib/parser/parsefortran.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python +""" +Defines FortranParser. + +Permission to use, modify, and distribute this software is given under the +terms of the NumPy License. See http://scipy.org. +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + +Author: Pearu Peterson <pearu@cens.ioc.ee> +Created: May 2006 +""" + +__all__ = ['FortranParser'] + +import re +import sys +import traceback +from numpy.distutils.misc_util import yellow_text, red_text + +from readfortran import FortranFileReader, FortranStringReader +from block_statements import BeginSource +from utils import AnalyzeError + +class FortranParser: + + cache = {} + + def __init__(self, reader): + """ + Parser of FortranReader structure. + Use .parse() method for parsing, parsing result is saved in .block attribute. + """ + self.reader = reader + if self.cache.has_key(reader.id): + parser = self.cache[reader.id] + self.block = parser.block + self.is_analyzed = parser.is_analyzed + self.block.show_message('using cached %s' % (reader.id)) + else: + self.cache[reader.id] = self + self.block = None + self.is_analyzed = False + return + + def get_item(self): + try: + return self.reader.next(ignore_comments = True) + except StopIteration: + pass + return + + def put_item(self, item): + self.reader.fifo_item.insert(0, item) + return + + def parse(self): + if self.block is not None: + return + try: + block = self.block = BeginSource(self) + except KeyboardInterrupt: + raise + except: + reader = self.reader + while reader is not None: + message = reader.format_message('FATAL ERROR', + 'while processing line', + reader.linecount, reader.linecount) + reader.show_message(message, sys.stdout) + reader = reader.reader + traceback.print_exc(file=sys.stdout) + self.reader.show_message(red_text('STOPPED PARSING'), sys.stdout) + return + return + + def analyze(self): + if self.is_analyzed: + return + if self.block is None: + self.reader.show_message('Nothing to analyze.') + return + + try: + self.block.analyze() + except AnalyzeError: + pass + except: + raise + self.is_analyzed = True + return + +def test_pyf(): + string = """ +python module foo + interface tere + subroutine bar + real r + end subroutine bar + end interface tere +end python module foo +""" + reader = FortranStringReader(string, True, True) + parser = FortranParser(reader) + block = parser.parse() + print block + +def test_free90(): + string = """ +module foo + + subroutine bar + real r + if ( pc_get_lun() .ne. 6) & + write ( pc_get_lun(), '( & + & /, a, /, " p=", i4, " stopping c_flag=", a, & + & /, " print unit=", i8)') & + trim(title), pcpsx_i_pel(), trim(c_flag), pc_get_lun() + if (.true.) then + call smth + end if + aaa : if (.false.) then + else if (a) then aaa + else aaa + end if aaa + hey = 1 + end subroutine bar + abstract interface + + end interface + +end module foo +""" + reader = FortranStringReader(string, True, False) + parser = FortranParser(reader) + block = parser.parse() + print block + +def test_f77(): + string = """\ + program foo + a = 3 + end + subroutine bar + end + pure function foo(a) + end + pure real*4 recursive function bar() + end +""" + reader = FortranStringReader(string, False, True) + parser = FortranParser(reader) + block = parser.parse() + print block + +def simple_main(): + import sys + if not sys.argv[1:]: + return parse_all_f() + for filename in sys.argv[1:]: + reader = FortranFileReader(filename) + print yellow_text('Processing '+filename+' (mode=%r)' % (reader.mode)) + parser = FortranParser(reader) + parser.parse() + parser.analyze() + print parser.block.torepr(4) + #print parser.block + +def profile_main(): + import hotshot, hotshot.stats + prof = hotshot.Profile("_parsefortran.prof") + prof.runcall(simple_main) + prof.close() + stats = hotshot.stats.load("_parsefortran.prof") + stats.strip_dirs() + stats.sort_stats('time', 'calls') + stats.print_stats(30) + +def parse_all_f(): + for filename in open('opt_all_f.txt'): + filename = filename.strip() + reader = FortranFileReader(filename) + print yellow_text('Processing '+filename+' (mode=%r)' % (reader.mode)) + parser = FortranParser(reader) + block = parser.parse() + print block + +if __name__ == "__main__": + #test_f77() + #test_free90() + #test_pyf() + simple_main() + #profile_main() + #parse_all_f() + |