Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"""
match = re.compile(r'equivalence\s*\(.*\)\Z', re.I).match
def process_item(self):
items = []
for s in self.item.get_line()[11:].lstrip().split(','):
s = s.strip()
assert s[0]+s[-1]=='()',repr((s,self.item.get_line()))
s = ', '.join(split_comma(s[1:-1], self.item))
items.append('('+s+')')
self.items = items
return
def tofortran(self, isfix=None):
return self.get_indent_tab(isfix=isfix) + 'EQUIVALENCE %s' % (', '.join(self.items))
def analyze(self): return
class Dimension(Statement):
"""
DIMENSION [ :: ] ( ) [ , ( ) ]...
"""
match = re.compile(r'dimension\b', re.I).match
def process_item(self):
line = self.item.get_line()[9:].lstrip()
if line.startswith('::'):
line = line[2:].lstrip()
self.items = split_comma(line, self.item)
return
def tofortran(self, isfix=None):
return self.get_indent_tab(isfix=isfix) + 'DIMENSION %s' % (', '.join(self.items))
def analyze(self):
for line in self.items:
i = line.find('(')
return self.get_indent_tab(isfix=isfix) + 'ENUMERATOR ' + ', '.join(self.items)
# F2PY specific statements
class FortranName(Statement):
"""
FORTRANNAME
"""
match = re.compile(r'fortranname\s*\w+\Z',re.I).match
def process_item(self):
self.value = self.item.get_line()[11:].lstrip()
return
def tofortran(self, isfix=None):
return self.get_indent_tab(isfix=isfix) + 'FORTRANNAME ' + self.value
class Threadsafe(Statement):
"""
THREADSAFE
"""
match = re.compile(r'threadsafe\Z',re.I).match
def process_item(self):
return
def tofortran(self, isfix=None):
return self.get_indent_tab(isfix=isfix) + 'THREADSAFE'
class Depend(Statement):
"""
DEPEND ( ) [ :: ]
"""
match = re.compile(r'depend\s*\(',re.I).match
def process_item(self):
lines.append('%s %s = %s(%s)' % (tab, args[0], self.name, ', '.join(self.args)))
#lines.append('%s print*,"%s=",%s' % (tab, args[0], args[0])) # debug line
lines.append('%sEND SUBROUTINE %s' % (tab, name))
return '\n'.join(lines)
def subroutine_wrapper(self):
code = self.subroutine_wrapper_code()
from .api import parse
block = parse(code) # XXX: set include_dirs
while len(block.content)==1:
block = block.content[0]
return block
# Handle subprogram prefixes
class SubprogramPrefix(Statement):
"""
...
"""
match = re.compile(r'(pure|elemental|recursive|\s)+\b',re.I).match
def process_item(self):
line = self.item.get_line()
m = self.match(line)
prefix = line[:m.end()].rstrip()
rest = self.item.get_line()[m.end():].lstrip()
if rest:
self.parent.put_item(self.item.copy(prefix))
self.item.clone(rest)
self.isvalid = False
return
if self.parent.__class__ not in [Function, Subroutine]:
self.isvalid = False
var.set_bounds(array_spec)
return
class Asynchronous(StatementWithNamelist):
"""
ASYNCHRONOUS [ :: ]
"""
match = re.compile(r'asynchronous\b',re.I).match
def analyze(self):
for name in self.items:
var = self.get_variable(name)
var.update('asynchronous')
return
class Bind(Statement):
"""
[ :: ]
= BIND ( C [ , NAME = ] )
= | / /
"""
match = re.compile(r'bind\s*\(.*\)',re.I).match
def process_item(self):
line = self.item.line
self.specs, line = parse_bind(line, self.item)
if line.startswith('::'):
line = line[2:].lstrip()
items = []
for item in split_comma(line, self.item):
if item.startswith('/'):
assert item.endswith('/'),repr(item)
item = '/ ' + item[1:-1].strip() + ' /'
items.append(item)
return
def tofortran(self,isfix=None):
if hasattr(self,'stmtname'):
clsname = self.stmtname.upper()
else:
clsname = self.__class__.__name__.upper()
s = ', '.join(self.items)
if s:
s = ' ' + s
return self.get_indent_tab(isfix=isfix) + clsname + s
# Execution statements
class GeneralAssignment(Statement):
"""
=
=>
"""
match = re.compile(r'\w[^=]*\s*=\>?').match
item_re = re.compile(r'(?P\w[^=]*)\s*(?P=\>?)\s*(?P.*)\Z',re.I).match
_repr_attr_names = ['variable','sign','expr'] + Statement._repr_attr_names
def process_item(self):
m = self.item_re(self.item.get_line())
if not m:
self.isvalid = False
return
self.sign = sign = m.group('sign')
if isinstance(self, Assignment) and sign != '=':
return
def tofortran(self, isfix=None):
return self.get_indent_tab(isfix=isfix) + 'TARGET %s' % (', '.join(self.items))
def analyze(self):
for line in self.items:
i = line.find('(')
assert i!=-1 and line.endswith(')'),repr(line)
name = line[:i].rstrip()
array_spec = split_comma(line[i+1:-1].strip(), self.item)
var = self.get_variable(name)
var.set_bounds(array_spec)
var.update('target')
return
class Pointer(Statement):
"""
POINTER [ :: ]
= [ ( ) ]
|
"""
match = re.compile(r'pointer\b',re.I).match
def process_item(self):
line = self.item.get_line()[7:].lstrip()
if line.startswith('::'):
line = line[2:].lstrip()
self.items = split_comma(line, self.item)
return
def tofortran(self, isfix=None):
return self.get_indent_tab(isfix=isfix) + 'POINTER %s' % (', '.join(self.items))
def analyze(self):
class Pause(Statement):
"""
PAUSE [ ]
"""
match = re.compile(r'pause\s*(\d+|\'\w*\'|"\w*"|)\Z', re.I).match
def process_item(self):
self.value = self.item.apply_map(self.item.get_line()[5:].lstrip())
return
def tofortran(self, isfix=None):
if self.value:
return self.get_indent_tab(isfix=isfix) + 'PAUSE ' + self.value
return self.get_indent_tab(isfix=isfix) + 'PAUSE'
def analyze(self): return
class Comment(Statement):
"""
Attributes
----------
content : str
Content of the comment.
is_blank : bool
When True then Comment represents blank line.
"""
match = lambda s: True
def process_item(self):
assert self.item.comment.count('\n')<=1,repr(self.item)
stripped = self.item.comment.lstrip()
self.is_blank = not stripped
self.content = stripped[1:] if stripped else ''
def tofortran(self, isfix=None):
def torepr(self, depth=-1, incrtab=''):
tab = incrtab + self.get_indent_tab()
ttab = tab + ' '
l=[Statement.torepr(self, depth=depth,incrtab=incrtab)]
if depth==0 or not self.content:
return '\n'.join(l)
l.append(ttab+'content:')
for c in self.content:
if isinstance(c,EndStatement):
l.append(c.torepr(depth-1,incrtab))
else:
l.append(c.torepr(depth-1,incrtab + ' '))
return '\n'.join(l)
self.item.get_line()[4:].lstrip()[1:-1], self.item)
return
def tofortran(self, isfix=None):
tab = self.get_indent_tab(isfix=isfix)
return tab + 'WAIT (%s)' % (', '.join(self.specs))
def analyze(self): return
class Contains(Statement):
"""
CONTAINS
"""
match = re.compile(r'contains\Z',re.I).match
def process_item(self): return
def tofortran(self, isfix=None): return self.get_indent_tab(isfix=isfix) + 'CONTAINS'
class Allocate(Statement):
"""
ALLOCATE ( [ :: ] [ , ] )
= STAT =
| ERRMSG =
| SOURCE =
= [ ( ) ]
"""
match = re.compile(r'allocate\s*\(.*\)\Z',re.I).match
def process_item(self):
line = self.item.get_line()[8:].lstrip()[1:-1].strip()
item2 = self.item.copy(line, True)
line2 = item2.get_line()
i = line2.find('::')
if i != -1:
spec = item2.apply_map(line2[:i].rstrip())
from .block_statements import type_spec
| ID =
| IOMSG =
| IOSTAT =
"""
match = re.compile(r'wait\s*\(.*\)\Z',re.I).match
def process_item(self):
self.specs = specs_split_comma(\
self.item.get_line()[4:].lstrip()[1:-1], self.item)
return
def tofortran(self, isfix=None):
tab = self.get_indent_tab(isfix=isfix)
return tab + 'WAIT (%s)' % (', '.join(self.specs))
def analyze(self): return
class Contains(Statement):
"""
CONTAINS
"""
match = re.compile(r'contains\Z',re.I).match
def process_item(self): return
def tofortran(self, isfix=None): return self.get_indent_tab(isfix=isfix) + 'CONTAINS'
class Allocate(Statement):
"""
ALLOCATE ( [ :: ] [ , ] )
= STAT =
| ERRMSG =
| SOURCE =
= [ ( ) ]
"""
match = re.compile(r'allocate\s*\(.*\)\Z',re.I).match