summaryrefslogtreecommitdiff
path: root/numpy/f2py/lib/base_classes.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/f2py/lib/base_classes.py')
-rw-r--r--numpy/f2py/lib/base_classes.py152
1 files changed, 111 insertions, 41 deletions
diff --git a/numpy/f2py/lib/base_classes.py b/numpy/f2py/lib/base_classes.py
index 4f588ff32..b5be7d00a 100644
--- a/numpy/f2py/lib/base_classes.py
+++ b/numpy/f2py/lib/base_classes.py
@@ -20,8 +20,10 @@ class Statement:
self.reader = parent.reader
self.item = item
- # If statement instance is constructed by error, set isvalid to False
+ # when a statement instance is constructed by error, set isvalid to False
self.isvalid = True
+ # when a statement should be ignored, set ignore to True
+ self.ignore = False
self.process_item()
@@ -48,6 +50,11 @@ class Statement:
tab = c + s + colon + tab
return tab
+ def show_message(self, message):
+ print >> sys.stderr, message
+ sys.stderr.flush()
+ return
+
class BeginStatement(Statement):
""" <blocktype> <name>
@@ -82,14 +89,6 @@ class BeginStatement(Statement):
Statement.__init__(self, parent, item)
return
- def process_item(self):
- """ Process the line
- """
- item = self.item
- if item is None: return
- self.fill()
- return
-
def tostr(self):
return self.blocktype.upper() + ' '+ self.name
@@ -99,6 +98,41 @@ class BeginStatement(Statement):
l.append(str(c))
return '\n'.join(l)
+ def process_item(self):
+ """ Process the line
+ """
+ item = self.item
+ if item is None: return
+ self.fill()
+ return
+
+ def fill(self, end_flag = False):
+ """
+ Fills blocks content until the end of block statement.
+ """
+
+ mode = self.reader.mode
+ classes = self.get_classes()
+ self.classes = [cls for cls in classes if mode in cls.modes]
+ self.pyf_classes = [cls for cls in classes if 'pyf' in cls.modes]
+
+ item = self.get_item()
+ while item is not None:
+ if isinstance(item, Line):
+ if self.process_subitem(item):
+ end_flag = True
+ break
+ item = self.get_item()
+
+ if not end_flag:
+ message = self.item.reader.format_message(\
+ 'WARNING',
+ 'failed to find the end of block for %s'\
+ % (self.__class__.__name__),
+ self.item.span[0],self.item.span[1])
+ self.show_message(message)
+ return
+
def process_subitem(self, item):
"""
Check is item is blocks start statement, if it is, read the block.
@@ -115,15 +149,77 @@ class BeginStatement(Statement):
self.content.append(stmt)
return True
+ if item.is_f2py_directive:
+ classes = self.pyf_classes
+ else:
+ classes = self.classes
+
# Look for statement match
- for cls in self.classes:
+ for cls in classes:
if cls.match(line):
stmt = cls(self, item)
if stmt.isvalid:
- self.content.append(stmt)
+ if not stmt.ignore:
+ self.content.append(stmt)
return False
+ # item may be cloned that changes the items line:
+ line = item.get_line()
+
+ # Check if f77 code contains inline comments or other f90
+ # constructs that got undetected by get_source_info.
+ if item.reader.isfix77:
+ i = line.find('!')
+ if i != -1:
+ message = item.reader.format_message(\
+ 'WARNING',
+ 'no parse pattern found for "%s" in %r block'\
+ ' maybe due to inline comment.'\
+ ' Trying to remove the comment.'\
+ % (item.get_line(),self.__class__.__name__),
+ item.span[0], item.span[1])
+ # .. but at the expense of loosing the comment.
+ self.show_message(message)
+ newitem = item.copy(line[:i].rstrip())
+ return self.process_subitem(newitem)
+
+ # try fix90 statement classes
+ f77_classes = self.classes
+ classes = []
+ for cls in self.get_classes():
+ if 'fix90' in cls.modes and cls not in f77_classes:
+ classes.append(cls)
+ if classes:
+ message = item.reader.format_message(\
+ 'WARNING',
+ 'no parse pattern found for "%s" in %r block'\
+ ' maybe due to strict f77 mode.'\
+ ' Trying f90 fix mode patterns..'\
+ % (item.get_line(),self.__class__.__name__),
+ item.span[0], item.span[1])
+ self.show_message(message)
+
+ item.reader.set_mode(False, False)
+ self.classes = classes
+
+ r = BeginStatement.process_subitem(self, item)
+ if r is None:
+ # restore f77 fix mode
+ self.classes = f77_classes
+ item.reader.set_mode(False, True)
+ else:
+ message = item.reader.format_message(\
+ 'INFORMATION',
+ 'The f90 fix mode resolved the parse pattern issue.'\
+ ' Setting reader to f90 fix mode.',
+ item.span[0], item.span[1])
+ self.show_message(message)
+ # set f90 fix mode
+ self.classes = f77_classes + classes
+ self.reader.set_mode(False, False)
+ return r
+
self.handle_unknown_item(item)
- return False
+ return
def handle_unknown_item(self, item):
message = item.reader.format_message(\
@@ -131,37 +227,11 @@ class BeginStatement(Statement):
'no parse pattern found for "%s" in %r block.'\
% (item.get_line(),self.__class__.__name__),
item.span[0], item.span[1])
- print >> sys.stderr, message
- sys.stderr.flush()
+ self.show_message(message)
self.content.append(item)
+ #sys.exit()
return
- def fill(self, end_flag = False):
- """
- Fills blocks content until the end of block statement.
- """
-
- mode = self.reader.mode
- classes = self.get_classes()
- self.classes = [cls for cls in classes if mode in cls.modes]
-
- item = self.get_item()
- while item is not None:
- if isinstance(item, Line):
- if self.process_subitem(item):
- end_flag = True
- break
- item = self.get_item()
-
- if not end_flag:
- message = self.item.reader.format_message(\
- 'WARNING',
- 'failed to find the end of block for %s'\
- % (self.__class__.__name__),
- self.item.span[0],self.item.span[1])
- print >> sys.stderr, message
- sys.stderr.flush()
- return
class EndStatement(Statement):
"""
@@ -195,7 +265,7 @@ class EndStatement(Statement):
'expected the end of %r block but got end of %r, skipping.'\
% (self.parent.name, line),
item.span[0],item.span[1])
- print >> sys.stderr, message
+ self.show_message(message)
self.isvalid = False
self.name = self.parent.name