diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2006-11-03 21:57:11 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2006-11-03 21:57:11 +0000 |
commit | ed184cde3c12fc43049951a60434df296e5725f3 (patch) | |
tree | fd2dfbac256e8ddad45b6ffd6f95f57dd053c6a6 /numpy/f2py | |
parent | df18ca848af515b961d50167646404e0d8db5eb8 (diff) | |
download | numpy-ed184cde3c12fc43049951a60434df296e5725f3.tar.gz |
F2PY G3: continued F2003 parser implementation and unittesting.
Diffstat (limited to 'numpy/f2py')
-rw-r--r-- | numpy/f2py/lib/main.py | 37 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/Fortran2003.py | 1845 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/api.py | 2 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/base_classes.py | 2 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/pattern_tools.py | 22 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/test_Fortran2003.py | 1925 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/test_expressions.py | 1118 | ||||
-rw-r--r-- | numpy/f2py/lib/parser/test_statements2.py | 212 |
8 files changed, 3375 insertions, 1788 deletions
diff --git a/numpy/f2py/lib/main.py b/numpy/f2py/lib/main.py index 4f235d326..45fd09946 100644 --- a/numpy/f2py/lib/main.py +++ b/numpy/f2py/lib/main.py @@ -38,7 +38,7 @@ extension modules are built. Options ------- - --3g-numpy Use numpy.f2py.lib tool, the 3rd generation of F2PY, + --g3-numpy Use numpy.f2py.lib tool, the 3rd generation of F2PY, with NumPy support. --2d-numpy Use numpy.f2py tool with NumPy support. [DEFAULT] --2d-numeric Use f2py2e tool with Numeric support. @@ -48,6 +48,7 @@ Options file <modulename>module.c or extension module <modulename>. For wrapping Fortran 90 modules, f2py will use Fortran module names. + --parse Parse Fortran files and print result to stdout. Options effective only with -h @@ -98,6 +99,7 @@ Extra options effective only with -c import re import shutil +import parser.api from parser.api import parse, PythonModule, EndStatement, Module, Subroutine, Function def get_values(sys_argv, prefix='', suffix='', strip_prefix=False, strip_suffix=False): @@ -154,6 +156,33 @@ def get_option_value(sys_argv, option, default_value = None, default_return = No def get_signature_output(sys_argv): return get_option_value(sys_argv,'-h','stdout') + +def parse_files(sys_argv): + flag = 'file' + file_names = [] + only_names = [] + skip_names = [] + options = [] + for word in sys_argv: + if word=='': pass + elif word=='only:': flag = 'only' + elif word=='skip:': flag = 'skip' + elif word==':': flag = 'file' + elif word.startswith('--'): options.append(word) + else: + {'file': file_names,'only': only_names, 'skip': skip_names}[flag].append(word) + + if options: + sys.stderr.write('Unused options: %s\n' % (', '.join(options))) + for filename in file_names: + if not os.path.isfile(filename): + sys.stderr.write('No or not a file %r. Skipping.\n' % (filename)) + continue + sys.stderr.write('Parsing %r..\n' % (filename)) + reader = parser.api.get_reader(filename) + print parser.api.Fortran2003.Program(reader) + return + def dump_signature(sys_argv): """ Read Fortran files and dump the signatures to file or stdout. XXX: Not well tested. @@ -303,7 +332,7 @@ def build_extension(sys_argv, sources_only = False): clean_build_dir = True else: clean_build_dir = False - if not os.path.exists(build_dir): os.makedirs(build_dir) + if build_dir and not os.path.exists(build_dir): os.makedirs(build_dir) include_dirs = get_values(sys_argv,'-I',strip_prefix=True) library_dirs = get_values(sys_argv,'-L',strip_prefix=True) @@ -408,6 +437,10 @@ def main(sys_argv = None): sys_argv.remove('-c') build_extension(sys_argv) return + if '--parse' in sys_argv: + sys_argv.remove('--parse') + parse_files(sys_argv) + return if '-h' in sys_argv: dump_signature(sys_argv) return diff --git a/numpy/f2py/lib/parser/Fortran2003.py b/numpy/f2py/lib/parser/Fortran2003.py index 2e631c96c..aa8131f02 100644 --- a/numpy/f2py/lib/parser/Fortran2003.py +++ b/numpy/f2py/lib/parser/Fortran2003.py @@ -24,12 +24,26 @@ from readfortran import FortranReaderBase class NoMatchError(Exception): pass +class ParseError(Exception): + pass + class Base(object): - """ + """ Base class for Fortran 2003 syntax rules. + + All Base classes have the following attributes: + .string - original argument to construct a class instance, it's type + is either str or FortranReaderBase. + .item - Line instance (holds label) or None. """ subclasses = {} - def __new__(cls, string): + def __new__(cls, string, parent_cls = None): + """ + """ + if parent_cls is None: + parent_cls = [cls] + elif cls not in parent_cls: + parent_cls.append(cls) #print '__new__:',cls.__name__,`string` match = cls.__dict__.get('match', None) if isinstance(string, FortranReaderBase) and not issubclass(cls, BlockBase) \ @@ -38,41 +52,52 @@ class Base(object): item = reader.get_item() if item is None: return try: - obj = cls(item.line) + obj = cls(item.line, parent_cls = parent_cls) except NoMatchError: obj = None if obj is None: reader.put_item(item) return - obj._item = item + obj.item = item return obj + errmsg = '%s: %r' % (cls.__name__, string) if match is not None: - result = cls.match(string) + try: + result = cls.match(string) + except NoMatchError, msg: + if str(msg)==errmsg: # avoid recursion 1. + raise + result = None else: result = None + #print '__new__:result:',cls.__name__,`string,result` if isinstance(result, tuple): obj = object.__new__(cls) obj.string = string - if hasattr(cls, 'init'): - obj.init(*result) + obj.item = None + if hasattr(cls, 'init'): obj.init(*result) return obj elif isinstance(result, Base): return result elif result is None: for subcls in Base.subclasses.get(cls.__name__,[]): - #print cls.__name__,subcls.__name__,`string` + if subcls in parent_cls: # avoid recursion 2. + continue + #print '%s:%s: %r' % (cls.__name__,subcls.__name__,string) try: - return subcls(string) - except NoMatchError: - pass + obj = subcls(string, parent_cls = parent_cls) + except NoMatchError, msg: + obj = None + if obj is not None: + return obj else: raise AssertionError,`result` - raise NoMatchError,'%s: %r' % (cls.__name__, string) + raise NoMatchError,errmsg - def restore_reader(self): - self._item.reader.put_item(self._item) - return +## def restore_reader(self): +## self._item.reader.put_item(self._item) +## return def init_list(self, *items): self.items = items @@ -84,23 +109,19 @@ class Base(object): def torepr_list(self): return '%s(%s)' % (self.__class__.__name__,', '.join(map(repr,self.items))) - def __str__(self): - return self.tostr() - if self.__class__.__dict__.has_key('tostr'): - return self.tostr() - return repr(self) + def __str__(self): return self.tostr() - def __repr__(self): - return self.torepr() - if self.__class__.__dict__.has_key('torepr'): - return self.torepr() - return '%s(%r)' % (self.__class__.__name__, self.string) + def __repr__(self): return self.torepr() def __cmp__(self, other): if self is other: return 0 if not isinstance(other, self.__class__): return -1 return self.compare(other) + def tofortran(self, tab='', isfix=None): + return tab + str(self) + + class BlockBase(Base): """ <block-base> = [ <startcls> ] @@ -151,14 +172,19 @@ class BlockBase(Base): if item is not None: reader.error('failed to parse with %s, skipping.' % ('|'.join([c.__name__ for c in classes[i:]])), item) continue - reader.error('unexpected eof file while looking line for <%s>.' % (classes[-1].__name__.lower().replace('_','-'))) + if hasattr(content[0],'name'): + reader.error('unexpected eof file while looking line for <%s> of %s.'\ + % (classes[-1].__name__.lower().replace('_','-'), content[0].name)) + else: + reader.error('unexpected eof file while looking line for <%s>.'\ + % (classes[-1].__name__.lower().replace('_','-'))) break if not content: return if startcls is not None and endcls is not None: # check names of start and end statements: start_stmt = content[0] end_stmt = content[-1] - if isinstance(end_stmt, endcls) and hasattr(end_stmt, 'name'): + if isinstance(end_stmt, endcls) and hasattr(end_stmt, 'name') and hasattr(start_stmt, 'name'): if end_stmt.name is not None: if start_stmt.name != end_stmt.name: end_stmt._item.reader.error('expected <%s-name> is %s but got %s. Ignoring.'\ @@ -172,17 +198,31 @@ class BlockBase(Base): self.content = content return def tostr(self): - return '\n'.join(map(str, self.content)) + return self.tofortran() def torepr(self): return '%s(%s)' % (self.__class__.__name__,', '.join(map(repr, self.content))) - def restore_reader(self): - content = self.content[:] - content.reverse() - for obj in content: - obj.restore_reader() - return - + def tofortran(self, tab='', isfix=None): + l = [] + start = self.content[0] + end = self.content[-1] + extra_tab = '' + if isinstance(end, EndStmtBase): + extra_tab = ' ' + l.append(start.tofortran(tab=tab,isfix=isfix)) + for item in self.content[1:-1]: + l.append(item.tofortran(tab=tab+extra_tab,isfix=isfix)) + if len(self.content)>1: + l.append(end.tofortran(tab=tab,isfix=isfix)) + return '\n'.join(l) + +## def restore_reader(self): +## content = self.content[:] +## content.reverse() +## for obj in content: +## obj.restore_reader() +## return + class SequenceBase(Base): """ <sequence-base> = <obj>, <obj> [ , <obj> ]... @@ -245,15 +285,26 @@ class BinaryOpBase(Base): """ def match(lhs_cls, op_pattern, rhs_cls, string, right=True): line, repmap = string_replace_map(string) - if right: - t = op_pattern.rsplit(line) + if isinstance(op_pattern, str): + if right: + t = line.rsplit(op_pattern,1) + else: + t = line.split(op_pattern,1) + if len(t)!=2: return + lhs, rhs = t[0].rstrip(), t[1].lstrip() + op = op_pattern else: - t = op_pattern.lsplit(line) - if t is None or len(t)!=3: return - lhs, op, rhs = t + if right: + t = op_pattern.rsplit(line) + else: + t = op_pattern.lsplit(line) + if t is None or len(t)!=3: return + lhs, op, rhs = t + lhs = lhs.rstrip() + rhs = rhs.lstrip() + op = op.upper() if not lhs: return if not rhs: return - op = op.upper() lhs_obj = lhs_cls(repmap(lhs)) rhs_obj = rhs_cls(repmap(rhs)) return lhs_obj, op, rhs_obj @@ -270,25 +321,78 @@ class BinaryOpBase(Base): def compare(self, other): return cmp((self.op,self.lhs,self.rhs),(other.op,other.lhs,other.rhs)) -class SeparatorBase(BinaryOpBase): +class SeparatorBase(Base): """ - <shape-base> = <lhs> : <rhs> + <separator-base> = [ <lhs> ] : [ <rhs> ] """ - def init(self, lhs, rhs): - self.lhs = lhs - self.op = ':' - self.rhs = rhs + def match(lhs_cls, rhs_cls, string, require_lhs=False, require_rhs=False): + line, repmap = string_replace_map(string) + if ':' not in line: return + lhs,rhs = line.split(':',1) + lhs = lhs.rstrip() + rhs = rhs.lstrip() + lhs_obj, rhs_obj = None, None + if lhs: + if lhs_cls is None: return + lhs_obj = lhs_cls(repmap(lhs)) + elif require_lhs: + return + if rhs: + if rhs_cls is None: return + rhs_obj = rhs_cls(repmap(rhs)) + elif require_rhs: + return + return lhs_obj, rhs_obj + match = staticmethod(match) + def init(self, *args): + self.items = args return + def tostr(self): + s = '' + if self.items[0] is not None: + s += '%s :' % (self.items[0]) + else: + s += ':' + if self.items[1] is not None: + s += ' %s' % (self.items[1]) + return s + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) -class KeywordValueBase(BinaryOpBase): +class KeywordValueBase(Base): """ - <keyword-value-base> = <keyword> = <rhs> + <keyword-value-base> = [ <lhs> = ] <rhs> """ - def match(cls, string): - if '=' not in string: return + def match(lhs_cls, rhs_cls, string, require_lhs = True, upper_lhs = False): + if require_lhs and '=' not in string: return + if isinstance(lhs_cls, (list, tuple)): + for s in lhs_cls: + try: + obj = KeywordValueBase.match(s, rhs_cls, string, require_lhs=require_lhs, upper_lhs=upper_lhs) + except NoMatchError: + obj = None + if obj is not None: return obj + return obj lhs,rhs = string.split('=',1) - return Keyword(lhs.rstrip()),'=',cls(rhs.lstrip()) + lhs = lhs.rstrip() + rhs = rhs.lstrip() + if not rhs: return + if not lhs: + if require_lhs: return + return None, rhs_cls(rhs) + if isinstance(lhs_cls, str): + if upper_lhs: + lhs = lhs.upper() + if lhs_cls!=lhs: return + return lhs, rhs_cls(rhs) + return lhs_cls(lhs),rhs_cls(rhs) match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + if self.items[0] is None: return str(self.items[1]) + return '%s = %s' % tuple(self.items) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) class BracketBase(Base): """ @@ -317,8 +421,6 @@ class BracketBase(Base): def compare(self, other): return cmp((self.left,self.item,self.right),(other.left,other.item,other.right)) - - class NumberBase(Base): """ <number-base> = <number> [ _ <kind-param> ] @@ -344,7 +446,7 @@ class CallBase(Base): """ <call-base> = <lhs> ( [ <rhs> ] ) """ - def match(lhs_cls, rhs_cls, string): + def match(lhs_cls, rhs_cls, string, upper_lhs = False, require_rhs=False): if not string.endswith(')'): return line, repmap = string_replace_map(string) i = line.find('(') @@ -353,27 +455,54 @@ class CallBase(Base): if not lhs: return rhs = line[i+1:-1].strip() lhs = repmap(lhs) + if upper_lhs: + lhs = lhs.upper() + rhs = repmap(rhs) + if isinstance(lhs_cls, str): + if lhs_cls!=lhs: return + else: + lhs = lhs_cls(lhs) if rhs: - rhs = repmap(rhs) - return lhs_cls(lhs), rhs_cls(rhs) - return lhs_cls(lhs), None + if isinstance(rhs_cls, str): + if rhs_cls!=rhs: return + else: + rhs = rhs_cls(rhs) + return lhs, rhs + elif require_rhs: + return + return lhs, None match = staticmethod(match) - def init(self, lhs, rhs): - self.lhs = lhs - self.rhs = rhs + def init(self, *args): + self.items = args return def tostr(self): - if self.rhs is None: return '%s()' % (self.lhs) - return '%s(%s)' % (self.lhs, self.rhs) - def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.lhs, self.rhs) + if self.items[1] is None: return '%s()' % (self.items[0]) + return '%s(%s)' % (self.items[0], self.items[1]) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) def compare(self, other): - return cmp((self.lhs,self.rhs),(other.lhs,other.rhs)) + return cmp(self.items,other.items) + +class CALLBase(CallBase): + """ + <CALL-base> = <LHS> ( [ <rhs> ] ) + """ + def match(lhs_cls, rhs_cls, string, require_rhs = False): + return CallBase.match(lhs_cls, rhs_cls, string, upper_lhs=True, require_rhs = require_rhs) + match = staticmethod(match) class StringBase(Base): """ <string-base> = <xyz> """ def match(pattern, string): + if isinstance(pattern, (list,tuple)): + for p in pattern: + obj = StringBase.match(p, string) + if obj is not None: return obj + return + if isinstance(pattern, str): + if len(pattern)==len(string) and pattern==string: return string, + return if pattern.match(string): return string, return match = staticmethod(match) @@ -390,25 +519,60 @@ class STRINGBase(StringBase): <STRING-base> = <XYZ> """ match = staticmethod(StringBase.match) - def init(self, string): - self.string = string.upper() + def match(pattern, string): + if isinstance(pattern, (list,tuple)): + for p in pattern: + obj = STRINGBase.match(p, string) + if obj is not None: return obj + return + STRING = string.upper() + if isinstance(pattern, str): + if len(pattern)==len(string) and pattern==STRING: return STRING, + return + if pattern.match(STRING): return STRING, return + match = staticmethod(match) + +class StmtBase(Base): + """ + [ <label> ] <stmt> + """ + def tofortran(self, tab='', isfix=None): + label = None + if self.item is not None: label = self.item.label + if isfix: + colon = '' + c = ' ' + else: + colon = ':' + c = '' + if label: + t = c + label + colon + if isfix: + while len(t)<6: t += ' ' + else: + tab = tab[len(t):] or ' ' + else: + t = '' + return t + tab + str(self) -class EndStmtBase(Base): +class EndStmtBase(StmtBase): """ <end-stmt-base> = END [ <stmt> [ <stmt-name>] ] """ - def match(stmt_type, stmt_name, string): + def match(stmt_type, stmt_name, string, require_stmt_type=False): start = string[:3].upper() if start != 'END': return line = string[3:].lstrip() start = line[:len(stmt_type)].upper() if start: - if start != stmt_type: return + if start.replace(' ','') != stmt_type.replace(' ',''): return line = line[len(stmt_type):].lstrip() else: + if require_stmt_type: return line = '' if line: + if stmt_name is None: return return stmt_type, stmt_name(line) return stmt_type, None match = staticmethod(match) @@ -424,6 +588,59 @@ class EndStmtBase(Base): def compare(self, other): return cmp((self.type,self.name),(other.type,other.name)) +def _ensure_single_spaces(string): + return ' '.join([s for s in string.split(' ') if s]) + +class WORDClsBase(Base): + """ + <WORD-cls> = <WORD> [ [ :: ] <cls> ] + """ + def match(pattern, cls, string, check_colons=False, require_cls=False): + if isinstance(pattern, (tuple,list)): + for p in pattern: + try: + obj = WORDClsBase.match(p, cls, string, check_colons=check_colons, require_cls=require_cls) + except NoMatchError: + obj = None + if obj is not None: return obj + return + if isinstance(pattern, str): + if string[:len(pattern)].upper()!=pattern: return + line = string[len(pattern):] + if not line: return pattern, None + if 'a'<=line[0].lower()<='z' or line[0]=='_': return + line = line.lstrip() + if not line: + if require_cls: return + return pattern, None + if cls is None: return + return pattern, cls(line) + m = pattern.match(string) + if m is None: return + line = string[len(m.group()):] + if pattern.value is not None: + pattern_value = pattern.value + else: + pattern_value = m.group().upper() + if not line: return pattern_value, None + if 'a'<=line[0].lower()<='z' or line[0]=='_': return + line = line.lstrip() + if not line: + if require_cls: return + return pattern_value, None + if cls is None: return + return pattern_value, cls(line) + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + if self.items[1] is None: return str(self.items[0]) + s = str(self.items[1]) + if s and s[0] in '(*': + return '%s%s' % (self.items[0], s) + return '%s %s' % (self.items[0], s) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) ############################################################################### ############################### SECTION 1 #################################### @@ -512,7 +729,7 @@ class Declaration_Construct(Base): # R207 'Interface_Block', 'Parameter_Stmt', 'Procedure_Declaration_Stmt', 'Specification_Stmt', 'Type_Declaration_Stmt', 'Stmt_Function_Stmt'] -class Execution_Part(Base): # R208 +class Execution_Part(BlockBase): # R208 """ <execution-part> = <executable-construct> | [ <execution-part-construct> ]... @@ -520,7 +737,9 @@ class Execution_Part(Base): # R208 <execution-part> shall not contain <end-function-stmt>, <end-program-stmt>, <end-subroutine-stmt> """ subclass_names = [] - use_names = ['Executable_Construct', 'Execution_Part_Construct'] + use_names = ['Executable_Construct_C201', 'Execution_Part_Construct_C201'] + def match(string): return BlockBase.match(Executable_Construct_C201, [Execution_Part_Construct_C201], None, string) + match = staticmethod(match) class Execution_Part_Construct(Base): # R209 """ @@ -531,6 +750,9 @@ class Execution_Part_Construct(Base): # R209 """ subclass_names = ['Executable_Construct', 'Format_Stmt', 'Entry_Stmt', 'Data_Stmt'] +class Execution_Part_Construct_C201(Base): + subclass_names = ['Executable_Construct_C201', 'Format_Stmt', 'Entry_Stmt', 'Data_Stmt'] + class Internal_Subprogram_Part(Base): # R210 """ <internal-subprogram-part> = <contains-stmt> @@ -589,6 +811,11 @@ class Executable_Construct(Base):# R213 subclass_names = ['Action_Stmt', 'Associate_Stmt', 'Case_Construct', 'Do_Construct', 'Forall_Construct', 'If_Construct', 'Select_Type_Construct', 'Where_Construct'] +class Executable_Construct_C201(Base): + subclass_names = Executable_Construct.subclass_names[:] + subclass_names[subclass_names.index('Action_Stmt')] = 'Action_Stmt_C201' + + class Action_Stmt(Base):# R214 """ <action-stmt> = <allocate-stmt> @@ -631,6 +858,41 @@ class Action_Stmt(Base):# R214 'Read_Stmt', 'Return_Stmt', 'Rewind_Stmt', 'Stop_Stmt', 'Wait_Stmt', 'Where_Stmt', 'Write_Stmt', 'Arithmetic_If_Stmt', 'Computed_Goto_Stmt'] +class Action_Stmt_C201(Base): + """ + <action-stmt-c201> = <action-stmt> + C201 is applied. + """ + subclass_names = Action_Stmt.subclass_names[:] + subclass_names.remove('End_Function_Stmt') + subclass_names.remove('End_Subroutine_Stmt') + #subclass_names.remove('End_Program_Stmt') + +class Action_Stmt_C802(Base): + """ + <action-stmt-c802> = <action-stmt> + C802 is applied. + """ + subclass_names = Action_Stmt.subclass_names[:] + subclass_names.remove('End_Function_Stmt') + subclass_names.remove('End_Subroutine_Stmt') + subclass_names.remove('If_Stmt') + +class Action_Stmt_C824(Base): + """ + <action-stmt-c824> = <action-stmt> + C824 is applied. + """ + subclass_names = Action_Stmt.subclass_names[:] + subclass_names.remove('End_Function_Stmt') + subclass_names.remove('End_Subroutine_Stmt') + subclass_names.remove('Continue_Stmt') + subclass_names.remove('Goto_Stmt') + subclass_names.remove('Return_Stmt') + subclass_names.remove('Stop_Stmt') + subclass_names.remove('Exit_Stmt') + subclass_names.remove('Cycle_Stmt') + subclass_names.remove('Arithmetic_If_Stmt') class Keyword(Base): # R215 """ @@ -714,7 +976,7 @@ class Type_Spec(Base): # R401 """ subclass_names = ['Intrinsic_Type_Spec', 'Derived_Type_Spec'] -class Type_Param_Value(Base): # R402 +class Type_Param_Value(StringBase): # R402 """ <type-param-value> = <scalar-int-expr> | * @@ -722,15 +984,10 @@ class Type_Param_Value(Base): # R402 """ subclass_names = ['Scalar_Int_Expr'] use_names = [] - def match(string): - if string in ['*',':']: return string, - return + def match(string): return StringBase.match(['*',':'], string) match = staticmethod(match) - def init(self, value): self.value = value - def tostr(self): return str(self.value) - def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.value) -class Intrinsic_Type_Spec(Base): # R403 +class Intrinsic_Type_Spec(WORDClsBase): # R403 """ <intrinsic-type-spec> = INTEGER [ <kind-selector> ] | REAL [ <kind-selector> ] @@ -746,45 +1003,23 @@ class Intrinsic_Type_Spec(Base): # R403 use_names = ['Kind_Selector','Char_Selector'] def match(string): - if string[:7].upper()=='INTEGER': - t = string[:7].upper() - line = string[7:].lstrip() - if line: return t,Kind_Selector(line) - return t,None - elif string[:4].upper()=='REAL': - t = string[:4].upper() - line = string[4:].lstrip() - if line: return t,Kind_Selector(line) - return t,None - elif string[:7].upper()=='COMPLEX': - t = string[:7].upper() - line = string[7:].lstrip() - if line: return t,Kind_Selector(line) - return t,None - elif string[:7].upper()=='LOGICAL': - t = string[:7].upper() - line = string[7:].lstrip() - if line: return t,Kind_Selector(line) - return t,None - elif string[:9].upper()=='CHARACTER': - t = string[:9].upper() - line = string[9:].lstrip() - if line: return t,Char_Selector(line) - elif string[:6].upper()=='DOUBLE': - line = string[6:].lstrip().upper() - if line=='COMPLEX': - return 'DOUBLE COMPLEX',None - if line=='PRECISION': - return 'DOUBLE PRECISION',None - elif string.upper()=='BYTE': - return 'BYTE',None + for w,cls in [('INTEGER',Kind_Selector), + ('REAL',Kind_Selector), + ('COMPLEX',Kind_Selector), + ('LOGICAL',Kind_Selector), + ('CHARACTER',Char_Selector), + (pattern.abs_double_complex_name, None), + (pattern.abs_double_precision_name, None), + ('BYTE', None), + ]: + try: + obj = WORDClsBase.match(w,cls,string) + except NoMatchError: + obj = None + if obj is not None: return obj return match = staticmethod(match) - init = Base.init_list - def tostr(self): - if self.items[1] is None: return str(self.items[0]) - return '%s%s' % tuple(self.items) - def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.items[0], self.items[1]) + class Kind_Selector(Base): # R404 """ @@ -847,41 +1082,32 @@ class Boz_Literal_Constant(Base): # R411 """ subclass_names = ['Binary_Constant','Octal_Constant','Hex_Constant'] -class Binary_Constant(StringBase): # R412 +class Binary_Constant(STRINGBase): # R412 """ <binary-constant> = B ' <digit> [ <digit> ]... ' | B \" <digit> [ <digit> ]... \" """ subclass_names = [] - def match(string): return StringBase.match(pattern.abs_binary_constant, string) + def match(string): return STRINGBase.match(pattern.abs_binary_constant, string) match = staticmethod(match) - def init(self, string): - self.string = string.upper() - return -class Octal_Constant(StringBase): # R413 +class Octal_Constant(STRINGBase): # R413 """ <octal-constant> = O ' <digit> [ <digit> ]... ' | O \" <digit> [ <digit> ]... \" """ subclass_names = [] - def match(string): return StringBase.match(pattern.abs_octal_constant, string) + def match(string): return STRINGBase.match(pattern.abs_octal_constant, string) match = staticmethod(match) - def init(self, string): - self.string = string.upper() - return -class Hex_Constant(StringBase): # R414 +class Hex_Constant(STRINGBase): # R414 """ <hex-constant> = Z ' <digit> [ <digit> ]... ' | Z \" <digit> [ <digit> ]... \" """ subclass_names = [] - def match(string): return StringBase.match(pattern.abs_hex_constant, string) + def match(string): return STRINGBase.match(pattern.abs_hex_constant, string) match = staticmethod(match) - def init(self, string): - self.string = string.upper() - return #R415: <hex-digit> = <digit> | A | B | C | D | E | F @@ -913,7 +1139,7 @@ class Complex_Literal_Constant(Base): # R421 subclass_names = [] use_names = ['Real_Part','Imag_Part'] def match(string): - if string[0]+string[-1]!='()': return + if not string or string[0]+string[-1]!='()': return if not pattern.abs_complex_literal_constant.match(string): return r,i = string[1:-1].split(',') @@ -1092,12 +1318,43 @@ class Derived_Type_Def(Base): # R429 use_names = ['Derived_Type_Stmt', 'Type_Param_Def_Stmt', 'Private_Or_Sequence', 'Component_Part', 'Type_Bound_Procedure_Part', 'End_Type_Stmt'] -class Derived_Type_Stmt(Base): # R430 +class Derived_Type_Stmt(StmtBase): # R430 """ <derived-type-stmt> = TYPE [ [ , <type-attr-spec-list> ] :: ] <type-name> [ ( <type-param-name-list> ) ] """ subclass_names = [] use_names = ['Type_Attr_Spec_List', 'Type_Name', 'Type_Param_Name_List'] + def match(string): + if string[:4].upper()!='TYPE': return + line = string[4:].lstrip() + i = line.find('::') + attr_specs = None + if i!=-1: + if line.startswith(','): + l = line[1:i].strip() + if not l: return + attr_specs = Type_Attr_Spec_List(l) + line = line[i+2:].lstrip() + m = pattern.name.match(line) + if m is None: return + name = Type_Name(m.group()) + line = line[m.end():].lstrip() + if not line: return attr_specs, name, None + if line[0]+line[-1]!='()': return + return attr_specs, name, Type_Param_Name_List(line[1:-1].strip()) + match = staticmethod(match) + def init(self, *args): + self.items = args + def tostr(self): + s = 'TYPE' + if self.items[0] is not None: + s += ', %s :: %s' % (self.items[0], self.items[1]) + else: + s += ' :: %s' % (self.items[1]) + if self.items[2] is not None: + s += '(%s)' % (self.items[2]) + return s + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) class Type_Name(Name): # C424 """ @@ -1120,6 +1377,29 @@ class Type_Attr_Spec(Base): # R431 """ subclass_names = ['Access_Spec'] use_names = ['Parent_Type_Name'] + def match(string): + if len(string)==8 and string.upper()=='ABSTRACT': return 'ABSTRACT',None + if string[:4].upper()=='BIND': + line = string[4:].lstrip() + if not line: return + if line[0]+line[-1]!='()': return + if line[1:-1].strip().upper()=='C': return 'BIND','C' + return + if string[:7].upper()=='EXTENDS': + line = string[7:].lstrip() + if not line: return + if line[0]+line[-1]!='()': return + line = line[1:-1].strip() + if not line: return + return 'EXTENDS', Parent_Type_Name(line) + match = staticmethod(match) + def init(self,*args): + self.items = args + def tostr(self): + if self.items[1] is None: return str(self.items[0]) + return '%s(%s)' % tuple(self.items) + def torepr(self): + return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) class Private_Or_Sequence(Base): # R432 """ @@ -1128,52 +1408,109 @@ class Private_Or_Sequence(Base): # R432 """ subclass_names = ['Private_Components_Stmt', 'Sequence_Stmt'] -class End_Type_Stmt(Base): # R433 +class End_Type_Stmt(EndStmtBase): # R433 """ <end-type-stmt> = END TYPE [ <type-name> ] """ subclass_names = [] use_names = ['Type_Name'] - -class Sequence_Stmt(Base): # R434 + def match(string): return EndStmtBase.match('TYPE',Type_Name, string, require_stmt_type=True) + match = staticmethod(match) + +class Sequence_Stmt(STRINGBase): # R434 """ <sequence-stmt> = SEQUENCE """ subclass_names = [] - def match(string): - if len(string) != 8: return - start = string.upper() - if start=='SEQUENCE': return start, - return + def match(string): return STRINGBase.match('SEQUENCE', string) match = staticmethod(match) -class Type_Param_Def_Stmt(Base): # R435 +class Type_Param_Def_Stmt(StmtBase): # R435 """ <type-param-def-stmt> = INTEGER [ <kind-selector> ] , <type-param-attr-spec> :: <type-param-decl-list> """ subclass_names = [] use_names = ['Kind_Selector', 'Type_Param_Attr_Spec', 'Type_Param_Decl_List'] + def match(string): + if string[:7].upper()!='INTEGER': return + line, repmap = string_replace_map(string[7:].lstrip()) + if not line: return + i = line.find(',') + if i==-1: return + kind_selector = repmap(line[:i].rstrip()) or None + line = repmap(line[i+1:].lstrip()) + i = line.find('::') + if i==-1: return + l1 = line[:i].rstrip() + l2 = line[i+2:].lstrip() + if not l1 or not l2: return + if kind_selector: kind_selector = Kind_Selector(kind_selector) + return kind_selector, Type_Param_Attr_Spec(l1), Type_Param_Decl_List(l2) + match = staticmethod(match) + def init(self, *args): + self.items = args + def tostr(self): + s = 'INTEGER' + if self.items[0] is not None: + s += '%s, %s :: %s' % (self.items[0], self.items[1], self.items[2]) + else: + s += ', %s :: %s' % (self.items[1], self.items[2]) + return s + def torepr(self): + return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) + -class Type_Param_Decl(Base): # R436 +class Type_Param_Decl(BinaryOpBase): # R436 """ <type-param-decl> = <type-param-name> [ = <scalar-int-initialization-expr> ] """ - subclass_names = [] - use_names = ['Type_Param_Name', 'Scalar_Int_Initialization_Expr'] - -class Type_Param_Attr_Spec(Base): # R437 + subclass_names = ['Type_Param_Name'] + use_names = ['Scalar_Int_Initialization_Expr'] + def match(string): + if '=' not in string: return + lhs,rhs = string.split('=',1) + lhs = lhs.rstrip() + rhs = rhs.lstrip() + if not lhs or not rhs: return + return Type_Param_Name(lhs),'=',Scalar_Int_Initialization_Expr(rhs) + match = staticmethod(match) + +class Type_Param_Attr_Spec(STRINGBase): # R437 """ <type-param-attr-spec> = KIND | LEN """ subclass_names = [] + def match(string): return STRINGBase.match(['KIND', 'LEN'], string) + match = staticmethod(match) -class Component_Part(Base): # R438 + +class Component_Part(BlockBase): # R438 """ <component-part> = [ <component-def-stmt> ]... """ subclass_names = [] use_names = ['Component_Def_Stmt'] + def match(reader): + content = [] + while 1: + try: + obj = Component_Def_Stmt(reader) + except NoMatchError: + obj = None + if obj is None: + break + content.append(obj) + if content: + return content, + return + match = staticmethod(match) + + def tofortran(self, tab='', isfix=None): + l = [] + for item in self.content: + l.append(item.tofortran(tab=tab,isfix=isfix)) + return '\n'.join(l) class Component_Def_Stmt(Base): # R439 """ @@ -1182,22 +1519,33 @@ class Component_Def_Stmt(Base): # R439 """ subclass_names = ['Data_Component_Def_Stmt', 'Proc_Component_Def_Stmt'] -class Data_Component_Def_Stmt(Base): # R440 +class Data_Component_Def_Stmt(StmtBase): # R440 """ <data-component-def-stmt> = <declaration-type-spec> [ [ , <component-attr-spec-list> ] :: ] <component-decl-list> """ subclass_names = [] use_names = ['Declaration_Type_Spec', 'Component_Attr_Spec_List', 'Component_Decl_List'] -class Component_Attr_Spec(Base): # R441 +class Dimension_Component_Attr_Spec(CALLBase): + """ + <dimension-component-attr-spec> = DIMENSION ( <component-array-spec> ) + """ + subclass_names = [] + use_names = ['Component_Array_Spec'] + def match(string): return CALLBase.match('DIMENSION', Component_Array_Spec, string) + match = staticmethod(match) + +class Component_Attr_Spec(STRINGBase): # R441 """ <component-attr-spec> = POINTER | DIMENSION ( <component-array-spec> ) | ALLOCATABLE | <access-spec> """ - subclass_names = ['Access_Spec'] - use_names = ['Component_Array_Spec'] + subclass_names = ['Access_Spec', 'Dimension_Component_Attr_Spec'] + use_names = [] + def match(string): return STRINGBase.match(['POINTER', 'ALLOCATABLE'], string) + match = staticmethod(match) class Component_Decl(Base): # R442 """ @@ -1205,6 +1553,51 @@ class Component_Decl(Base): # R442 """ subclass_names = [] use_names = ['Component_Name', 'Component_Array_Spec', 'Char_Length', 'Component_Initialization'] + def match(string): + m = pattern.name.match(string) + if m is None: return + name = Component_Name(m.group()) + newline = string[m.end():].lstrip() + if not newline: return name, None, None, None + array_spec = None + char_length = None + init = None + if newline.startswith('('): + line, repmap = string_replace_map(newline) + i = line.find(')') + if i==-1: return + array_spec = Component_Array_Spec(repmap(line[1:i].strip())) + newline = repmap(line[i+1:].lstrip()) + if newline.startswith('*'): + line, repmap = string_replace_map(newline) + i = line.find('=') + if i!=-1: + char_length = repmap(line[1:i].strip()) + newline = repmap(newline[i:].lstrip()) + else: + char_length = repmap(newline[1:].strip()) + newline = '' + char_length = Char_Length(char_length) + if newline.startswith('='): + init = Component_Initialization(newline) + else: + assert newline=='',`newline` + return name, array_spec, char_length, init + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + s = str(self.items[0]) + if self.items[1] is not None: + s += '(' + str(self.items[1]) + ')' + if self.items[2] is not None: + s += '*' + str(self.items[2]) + if self.items[3] is not None: + s += ' ' + str(self.items[3]) + return s + def torepr(self): + return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) class Component_Array_Spec(Base): # R443 """ @@ -1220,8 +1613,21 @@ class Component_Initialization(Base): # R444 """ subclass_names = [] use_names = ['Initialization_Expr', 'Null_Init'] + def match(string): + if string.startswith('=>'): + return '=>', Null_Init(string[2:].lstrip()) + if string.startswith('='): + return '=', Initialization_Expr(string[2:].lstrip()) + return + match = staticmethod(match) + def init(self, op, rhs): + self.op = op + self.rhs = rhs + return + def tostr(self): return '%s %s' % (self.op, self.rhs) + def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.op, self.rhs) -class Proc_Component_Def_Stmt(Base): # R445 +class Proc_Component_Def_Stmt(StmtBase): # R445 """ <proc-component-def-stmt> = PROCEDURE ( [ <proc-interface> ] ) , <proc-component-attr-spec-list> :: <proc-decl-list> """ @@ -1238,7 +1644,7 @@ class Proc_Component_Attr_Spec(Base): # R446 subclass_names = [] use_names = ['Arg_Name', 'Access_Spec'] -class Private_Components_Stmt(Base): # R447 +class Private_Components_Stmt(StmtBase): # R447 """ <private-components-stmt> = PRIVATE """ @@ -1254,7 +1660,7 @@ class Type_Bound_Procedure_Part(Base): # R448 subclass_names = [] use_names = ['Contains_Stmt', 'Binding_Private_Stmt', 'Proc_Binding_Stmt'] -class Binding_Private_Stmt(Base): # R449 +class Binding_Private_Stmt(StmtBase): # R449 """ <binding-private-stmt> = PRIVATE """ @@ -1314,16 +1720,16 @@ class Type_Param_Spec(KeywordValueBase): # R456 """ subclass_names = ['Type_Param_Value'] use_names = ['Keyword'] - def match(string): return KeywordValueBase.match(Type_Param_Value, string) + def match(string): return KeywordValueBase.match(Keyword, Type_Param_Value, string) match = staticmethod(match) -class Structure_Constructor_2(KeywordValueBase): +class Structure_Constructor_2(KeywordValueBase): # R457.b """ <structure-constructor-2> = [ <keyword> = ] <component-data-source> """ subclass_names = ['Component_Data_Source'] use_names = ['Keyword'] - def match(string): return KeywordValueBase.match(Component_Data_Source, string) + def match(string): return KeywordValueBase.match(Keyword, Component_Data_Source, string) match = staticmethod(match) class Structure_Constructor(CallBase): # R457 @@ -1342,7 +1748,7 @@ class Component_Spec(KeywordValueBase): # R458 """ subclass_names = ['Component_Data_Source'] use_names = ['Keyword'] - def match(string): return KeywordValueBase.match(Component_Data_Source, string) + def match(string): return KeywordValueBase.match(Keyword, Component_Data_Source, string) match = staticmethod(match) class Component_Data_Source(Base): # R459 @@ -1363,13 +1769,13 @@ class Enum_Def(Base): # R460 subclass_names = [] use_names = ['Enum_Def_Stmt', 'Enumerator_Def_Stmt', 'End_Enum_Stmt'] -class Enum_Def_Stmt(Base): # R461 +class Enum_Def_Stmt(StmtBase): # R461 """ <enum-def-stmt> = ENUM, BIND(C) """ subclass_names = [] -class Enumerator_Def_Stmt(Base): # R462 +class Enumerator_Def_Stmt(StmtBase): # R462 """ <enumerator-def-stmt> = ENUMERATOR [ :: ] <enumerator-list> """ @@ -1388,13 +1794,15 @@ class Enumerator(BinaryOpBase): # R463 return Named_Constant(lhs.rstrip()),'=',Scalar_Int_Initialization_Expr(rhs.lstrip()) match = staticmethod(match) -class End_Enum_Stmt(Base): # R464 +class End_Enum_Stmt(EndStmtBase): # R464 """ <end-enum-stmt> = END ENUM """ subclass_names = [] + def match(string): return EndStmtBase.match('ENUM',None, string, requite_stmt_type=True) + match = staticmethod(match) -class Array_Constructor(BracketBase): # R469 +class Array_Constructor(BracketBase): # R465 """ <array-constructor> = (/ <ac-spec> /) | <left-square-bracket> <ac-spec> <right-square-bracket> @@ -1512,14 +1920,21 @@ class Type_Declaration_Stmt(Base): # R501 def match(string): line, repmap = string_replace_map(string) - i = line.find(',') - if i==-1: - i = line.find('::') - if i==-1: - m = re.search(r'\s[a-z_]',line,re.I) - if m is None: return - i = m.start() - type_spec = Declaration_Type_Spec(repmap(line[:i])) + i = line.find('::') + if i!=-1: + j = line[:i].find(',') + if j!=-1: + i = j + else: + if line[:6].upper()=='DOUBLE': + m = re.search(r'\s[a-z_]',line[6:].lstrip(),re.I) + if m is None: return + i = m.start() + len(line)-len(line[6:].lstrip()) + else: + m = re.search(r'\s[a-z_]',line,re.I) + if m is None: return + i = m.start() + type_spec = Declaration_Type_Spec(repmap(line[:i].rstrip())) if type_spec is None: return line = line[i:].lstrip() if line.startswith(','): @@ -1577,31 +1992,23 @@ class Declaration_Type_Spec(Base): # R502 def tostr(self): return '%s(%s)' % tuple(map(str,self.items)) def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.items[0], self.items[1]) -class Dimension_Attr_Spec(CallBase): +class Dimension_Attr_Spec(CALLBase): # R503.d """ <dimension-attr-spec> = DIMENSION ( <array-spec> ) """ subclass_names = [] use_names = ['Array_Spec'] - def match(string): return CallBase.match(pattern.abs_dimension, Array_Spec, string) + def match(string): return CALLBase.match('DIMENSION', Array_Spec, string) match = staticmethod(match) - def init(self, lhs, rhs): - self.lhs = lhs.upper() - self.rhs = rhs - return -class Intent_Attr_Spec(CallBase): +class Intent_Attr_Spec(CALLBase): # R503.f """ <intent-attr-spec> = INTENT ( <intent-spec> ) """ subclass_names = [] use_names = ['Intent_Spec'] - def match(string): return CallBase.match(pattern.abs_intent, Intent_Spec, string) + def match(string): return CALLBase.match('INTENT', Intent_Spec, string) match = staticmethod(match) - def init(self, lhs, rhs): - self.lhs = lhs.upper() - self.rhs = rhs - return class Attr_Spec(STRINGBase): # R503 """ @@ -1709,13 +2116,15 @@ class Initialization(Base): # R506 def tostr(self): return '%s %s' % (self.op, self.rhs) def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.op, self.rhs) -class Null_Init(Base): # R507 +class Null_Init(STRINGBase): # R507 """ <null-init> = <function-reference> <function-reference> shall be a reference to the NULL intrinsic function with no arguments. """ subclass_names = ['Function_Reference'] + def match(string): return STRINGBase.match('NULL', string) + match = staticmethod(match) class Access_Spec(STRINGBase): # R508 """ @@ -1723,7 +2132,7 @@ class Access_Spec(STRINGBase): # R508 | PRIVATE """ subclass_names = [] - def match(string): return STRINGBase.match(pattern.abs_access_spec, string) + def match(string): return STRINGBase.match(['PUBLIC','PRIVATE'], string) match = staticmethod(match) class Language_Binding_Spec(Base): # R509 @@ -1766,21 +2175,29 @@ class Array_Spec(Base): # R510 | <deferred-shape-spec-list> | <assumed-size-spec> """ - subclass_names = ['Explicit_Shape_Spec_List', 'Assumed_Shape_Spec_List', - 'Deferred_Shape_Spec_List', 'Assumed_Size_Spec'] + subclass_names = ['Assumed_Size_Spec', 'Explicit_Shape_Spec_List', 'Assumed_Shape_Spec_List', + 'Deferred_Shape_Spec_List'] class Explicit_Shape_Spec(SeparatorBase): # R511 """ <explicit-shape-spec> = [ <lower-bound> : ] <upper-bound> """ - subclass_names = ['Upper_Bound'] - use_names = ['Lower_Bound'] + subclass_names = [] + use_names = ['Lower_Bound', 'Upper_Bound'] def match(string): line, repmap = string_replace_map(string) - if ':' not in line: return + if ':' not in line: + return None, Upper_Bound(string) lower,upper = line.split(':',1) + lower = lower.rstrip() + upper = upper.lstrip() + if not upper: return + if not lower: return return Lower_Bound(repmap(lower)), Upper_Bound(repmap(upper)) match = staticmethod(match) + def tostr(self): + if self.items[0] is None: return str(self.items[1]) + return SeparatorBase.tostr(self) class Lower_Bound(Base): # R512 """ @@ -1794,18 +2211,24 @@ class Upper_Bound(Base): # R513 """ subclass_names = ['Specification_Expr'] -class Assumed_Shape_Spec(Base): # R514 +class Assumed_Shape_Spec(SeparatorBase): # R514 """ <assumed-shape-spec> = [ <lower-bound> ] : """ subclass_names = [] use_names = ['Lower_Bound'] + def match(string): return SeparatorBase.match(Lower_Bound, None, string) + match = staticmethod(match) -class Deferred_Shape_Spec(Base): # R515 +class Deferred_Shape_Spec(SeparatorBase): # R515 """ <deferred_shape_spec> = : """ subclass_names = [] + def match(string): + if string==':': return None,None + return + match = staticmethod(match) class Assumed_Size_Spec(Base): # R516 """ @@ -1813,7 +2236,33 @@ class Assumed_Size_Spec(Base): # R516 """ subclass_names = [] use_names = ['Explicit_Shape_Spec_List', 'Lower_Bound'] - + def match(string): + if not string.endswith('*'): return + line = string[:-1].rstrip() + if not line: return None,None + if line.endswith(':'): + line, repmap = string_replace_map(line[:-1].rstrip()) + i = line.rfind(',') + if i==-1: + return None, Lower_Bound(repmap(line)) + return Explicit_Shape_Spec_List(repmap(line[:i].rstrip())), Lower_Bound(repmap(line[i+1:].lstrip())) + if not line.endswith(','): return + line = line[:-1].rstrip() + return Explicit_Shape_Spec_List(line), None + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + s = '' + if self.items[0] is not None: + s += str(self.items[0]) + ', ' + if self.items[1] is not None: + s += str(self.items[1]) + ' : ' + s += '*' + return s + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) + class Intent_Spec(STRINGBase): # R517 """ <intent-spec> = IN @@ -1824,7 +2273,7 @@ class Intent_Spec(STRINGBase): # R517 def match(string): return STRINGBase.match(pattern.abs_intent_spec, string) match = staticmethod(match) -class Access_Stmt(Base): # R518 +class Access_Stmt(StmtBase): # R518 """ <access-stmt> = <access-spec> [ [ :: ] <access-id-list> ] """ @@ -1838,21 +2287,21 @@ class Access_Id(Base): # R519 """ subclass_names = ['Use_Name', 'Generic_Spec'] -class Allocatable_Stmt(Base): # R520 +class Allocatable_Stmt(StmtBase): # R520 """ <allocateble-stmt> = ALLOCATABLE [ :: ] <object-name> [ ( <deferred-shape-spec-list> ) ] [ , <object-name> [ ( <deferred-shape-spec-list> ) ] ]... """ subclass_names = [] use_names = ['Object_Name', 'Deferred_Shape_Spec_List'] -class Asynchronous_Stmt(Base): # R521 +class Asynchronous_Stmt(StmtBase): # R521 """ <asynchronous-stmt> = ASYNCHRONOUS [ :: ] <object-name-list> """ subclass_names = [] use_names = ['Object_Name_List'] -class Bind_Stmt(Base): # R522 +class Bind_Stmt(StmtBase): # R522 """ <bind-stmt> = <language-binding-spec> [ :: ] <bind-entity-list> """ @@ -1867,7 +2316,7 @@ class Bind_Entity(Base): # R523 subclass_names = ['Entity_Name'] use_names = ['Common_Block_Name'] -class Data_Stmt(Base): # R524 +class Data_Stmt(StmtBase): # R524 """ <data-stmt> = DATA <data-stmt-set> [ [ , ] <data-stmt-set> ]... """ @@ -1948,64 +2397,91 @@ class Constant_Subobject(Base): # R534 """ subclass_names = ['Designator'] -class Dimension_Stmt(Base): # R535 +class Dimension_Stmt(StmtBase): # R535 """ <dimension-stmt> = DIMENSION [ :: ] <array-name> ( <array-spec> ) [ , <array-name> ( <array-spec> ) ]... """ subclass_names = [] use_names = ['Array_Name', 'Array_Spec'] + def match(string): + if string[:9].upper()!='DIMENSION': return + line, repmap = string_replace_map(string[9:].lstrip()) + if line.startswith('::'): line = line[2:].lstrip() + decls = [] + for s in line.split(','): + s = s.strip() + if not s.endswith(')'): return + i = s.find('(') + if i==-1: return + decls.append((Array_Name(repmap(s[:i].rstrip())), Array_Spec(repmap(s[i+1:-1].strip())))) + if not decls: return + return decls, + match = staticmethod(match) + def init(self, items): + self.items = items + return + def tostr(self): + return 'DIMENSION :: ' + ', '.join(['%s(%s)' % ns for ns in self.items]) + def torepr(self): + return '%s(%r)' % (self.__class__.__name__, self.items) -class Intent_Stmt(Base): # R536 +class Intent_Stmt(StmtBase): # R536 """ <intent-stmt> = INTENT ( <intent-spec> ) [ :: ] <dummy-arg-name-list> """ subclass_names = [] use_names = ['Intent_Spec', 'Dummy_Arg_Name_List'] -class Optional_Stmt(Base): # R537 +class Optional_Stmt(StmtBase): # R537 """ <optional-stmt> = OPTIONAL [ :: ] <dummy-arg-name-list> """ subclass_names = [] use_names = ['Dummy_Arg_Name_List'] -class Parameter_Stmt(Base): # R538 +class Parameter_Stmt(StmtBase, CALLBase): # R538 """ <parameter-stmt> = PARAMETER ( <named-constant-def-list> ) """ subclass_names = [] use_names = ['Named_Constant_Def_List'] + def match(string): return CALLBase.match('PARAMETER', Named_Constant_Def_List, string, require_rhs=True) + match = staticmethod(match) -class Named_Constant_Def(Base): # R539 +class Named_Constant_Def(KeywordValueBase): # R539 """ <named-constant-def> = <named-constant> = <initialization-expr> """ subclass_names = [] use_names = ['Named_Constant', 'Initialization_Expr'] - -class Pointer_Stmt(Base): # R540 + def match(string): return KeywordValueBase.match(Named_Constant, Initialization_Expr, string) + match = staticmethod(match) + +class Pointer_Stmt(StmtBase): # R540 """ <pointer-stmt> = POINTER [ :: ] <pointer-decl-list> """ subclass_names = [] use_names = ['Pointer_Decl_List'] -class Pointer_Decl(Base): # R541 +class Pointer_Decl(CallBase): # R541 """ <pointer-decl> = <object-name> [ ( <deferred-shape-spec-list> ) ] | <proc-entity-name> """ - use_names = ['Object_Name', 'Deferred_Shape_Spec_List'] - subclass_names = ['Proc_Entity_Name'] + subclass_names = ['Proc_Entity_Name', 'Object_Name'] + use_names = ['Deferred_Shape_Spec_List'] + def match(string): return CallBase.match(Object_Name, Deferred_Shape_Spec_List, string, require_rhs=True) + match = staticmethod(match) -class Protected_Stmt(Base): # R542 +class Protected_Stmt(StmtBase): # R542 """ <protected-stmt> = PROTECTED [ :: ] <entity-name-list> """ subclass_names = [] use_names = ['Entity_Name_List'] -class Save_Stmt(Base): # R543 +class Save_Stmt(StmtBase): # R543 """ <save-stmt> = SAVE [ [ :: ] <saved-entity-list> ] """ @@ -2027,49 +2503,88 @@ class Proc_Pointer_Name(Base): # R545 """ subclass_names = ['Name'] -class Target_Stmt(Base): # R546 +class Target_Stmt(StmtBase): # R546 """ <target-stmt> = TARGET [ :: ] <object-name> [ ( <array-spec> ) ] [ , <object-name> [ ( <array-spec> ) ]] """ subclass_names = [] use_names = ['Object_Name', 'Array_Spec'] -class Value_Stmt(Base): # R547 +class Value_Stmt(StmtBase): # R547 """ <value-stmt> = VALUE [ :: ] <dummy-arg-name-list> """ subclass_names = [] use_names = ['Dummy_Arg_Name_List'] -class Volatile_Stmt(Base): # R548 +class Volatile_Stmt(StmtBase): # R548 """ <volatile-stmt> = VOLATILE [ :: ] <object-name-list> """ subclass_names = [] use_names = ['Object_Name_List'] -class Implicit_Stmt(Base): # R549 +class Implicit_Stmt(StmtBase, WORDClsBase): # R549 """ <implicit-stmt> = IMPLICIT <implicit-spec-list> | IMPLICIT NONE """ subclass_names = [] use_names = ['Implicit_Spec_List'] + def match(string): + for w,cls in [(pattern.abs_implicit_none, None), + ('IMPLICIT', Implicit_Spec_List)]: + try: + obj = WORDClsBase.match(w, cls, string) + except NoMatchError: + obj = None + if obj is not None: return obj + return + match = staticmethod(match) -class Implicit_Spec(Base): # R550 +class Implicit_Spec(CallBase): # R550 """ <implicit-spec> = <declaration-type-spec> ( <letter-spec-list> ) """ subclass_names = [] use_names = ['Declaration_Type_Spec', 'Letter_Spec_List'] + def match(string): + if not string.endswith(')'): return + i = string.rfind('(') + if i==-1: return + s1 = string[:i].rstrip() + s2 = string[i+1:-1].strip() + if not s1 or not s2: return + return Declaration_Type_Spec(s1), Letter_Spec_List(s2) + match = staticmethod(match) class Letter_Spec(Base): # R551 """ <letter-spec> = <letter> [ - <letter> ] """ subclass_names = [] + def match(string): + if len(string)==1: + lhs = string.upper() + if 'A'<=lhs<='Z': return lhs, None + return + if '-' not in string: return + lhs,rhs = string.split('-',1) + lhs = lhs.strip().upper() + rhs = rhs.strip().upper() + if not len(lhs)==len(rhs)==1: return + if not ('A'<=lhs<=rhs<='Z'): return + return lhs,rhs + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + if self.items[1] is None: return str(self.items[0]) + return '%s - %s' % tuple(self.items) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) -class Namelist_Stmt(Base): # R552 +class Namelist_Stmt(StmtBase): # R552 """ <namelist-stmt> = NAMELIST / <namelist-group-name> / <namelist-group-object-list> [ [ , ] / <namelist-group-name> / <namelist-group-object-list> ] """ @@ -2082,12 +2597,14 @@ class Namelist_Group_Object(Base): # R553 """ subclass_names = ['Variable_Name'] -class Equivalence_Stmt(Base): # R554 +class Equivalence_Stmt(StmtBase, WORDClsBase): # R554 """ <equivalence-stmt> = EQUIVALENCE <equivalence-set-list> """ subclass_names = [] use_names = ['Equivalence_Set_List'] + def match(string): return WORDClsBase.match('EQUIVALENCE', Equivalence_Set_List, string) + match = staticmethod(match) class Equivalence_Set(Base): # R555 """ @@ -2095,6 +2612,21 @@ class Equivalence_Set(Base): # R555 """ subclass_names = [] use_names = ['Equivalence_Object', 'Equivalence_Object_List'] + def match(string): + if not string or string[0]+string[-1]!='()': return + line = string[1:-1].strip() + if not line: return + l = Equivalence_Object_List(line) + obj = l.items[0] + l.items = l.items[1:] + if not l.items: return + return obj, l + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): return '(%s, %s)' % tuple(self.items) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) class Equivalence_Object(Base): # R556 """ @@ -2104,20 +2636,89 @@ class Equivalence_Object(Base): # R556 """ subclass_names = ['Variable_Name', 'Array_Element', 'Substring'] -class Common_Stmt(Base): # R557 +class Common_Stmt(StmtBase): # R557 """ <common-stmt> = COMMON [ / [ <common-block-name> ] / ] <common-block-object-list> [ [ , ] / [ <common-block-name> ] / <common-block-object-list> ]... """ subclass_names = [] use_names = ['Common_Block_Name', 'Common_Block_Object_List'] + def match(string): + if string[:6].upper()!='COMMON': return + line = string[6:] + if not line or 'A'<=line[0].upper()<='Z' or line[0]=='_': return + line, repmap = string_replace_map(line.lstrip()) + items = [] + if line.startswith('/'): + i = line.find('/',1) + if i==-1: return + name = line[1:i].strip() or None + if name is not None: name = Common_Block_Name(name) + line = line[i+1:].lstrip() + i = line.find('/') + if i==-1: + lst = Common_Block_Object_List(repmap(line)) + line = '' + else: + l = line[:i].rstrip() + if l.endswith(','): l = l[:-1].rstrip() + if not l: return + lst = Common_Block_Object_List(repmap(l)) + line = line[i:].lstrip() + else: + name = None + i = line.find('/') + if i==-1: + lst = Common_Block_Object_List(repmap(line)) + line = '' + else: + l = line[:i].rstrip() + if l.endswith(','): l = l[:-1].rstrip() + if not l: return + lst = Common_Block_Object_List(repmap(l)) + line = line[i:].lstrip() + items.append((name, lst)) + while line: + if line.startswith(','): line = line[1:].lstrip() + if not line.startswith('/'): return + i = line.find('/',1) + name = line[1:i].strip() or None + if name is not None: name = Common_Block_Name(name) + line = line[i+1:].lstrip() + i = line.find('/') + if i==-1: + lst = Common_Block_Object_List(repmap(line)) + line = '' + else: + l = line[:i].rstrip() + if l.endswith(','): l = l[:-1].rstrip() + if not l: return + lst = Common_Block_Object_List(repmap(l)) + line = line[i:].lstrip() + items.append((name, lst)) + return items, + match = staticmethod(match) + def init(self, items): + self.items = items + return + def tostr(self): + s = 'COMMON' + for (name, lst) in self.items: + if name is not None: + s += ' /%s/ %s' % (name, lst) + else: + s += ' // %s' % (lst) + return s + def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.items) -class Common_Block_Object(Base): # R558 +class Common_Block_Object(CallBase): # R558 """ <common-block-object> = <variable-name> [ ( <explicit-shape-spec-list> ) ] | <proc-pointer-name> """ - subclass_names = ['Proc_Pointer_Name'] + subclass_names = ['Proc_Pointer_Name','Variable_Name'] use_names = ['Variable_Name', 'Explicit_Shape_Spec_List'] + def match(string): return CallBase.match(Variable_Name, Explicit_Shape_Spec_List, string, require_rhs=True) + match = staticmethod(match) ############################################################################### ############################### SECTION 6 #################################### @@ -2183,11 +2784,11 @@ class Int_Variable(Base): # R608 class Substring(CallBase): # R609 """ - <substring> = <parent-string> ( <substring-range> ) + <substring> = <parent-string> ( <substring-range> ) """ subclass_names = [] use_names = ['Parent_String','Substring_Range'] - def match(string): return CallBase.match(Parent_String, Substring_Range, string) + def match(string): return CallBase.match(Parent_String, Substring_Range, string, require_rhs=True) match = staticmethod(match) class Parent_String(Base): # R610 @@ -2199,36 +2800,15 @@ class Parent_String(Base): # R610 """ subclass_names = ['Scalar_Variable_Name', 'Array_Element', 'Scalar_Structure_Component', 'Scalar_Constant'] -class Substring_Range(Base): # R611 +class Substring_Range(SeparatorBase): # R611 """ <substring-range> = [ <scalar-int-expr> ] : [ <scalar-int-expr> ] """ subclass_names = [] use_names = ['Scalar_Int_Expr'] def match(string): - line, repmap = string_replace_map(string) - if ':' not in line: return - lhs,rhs = line.split(':',1) - lhs = lhs.rstrip() - rhs = rhs.lstrip() - lhs_obj, rhs_obj = None, None - if lhs: - lhs_obj = Scalar_Int_Expr(repmap(lhs)) - if rhs: - rhs_obj = Scalar_Int_Expr(repmap(rhs)) - return lhs_obj, rhs_obj + return SeparatorBase.match(Scalar_Int_Expr, Scalar_Int_Expr, string) match = staticmethod(match) - def init(self, lhs, rhs): - self.lhs, self.rhs = lhs, rhs - return - def tostr(self): - if self.lhs is None: - if self.rhs is None: return ':' - return ': '+ str(self.rhs) - else: - if self.rhs is None: return str(self.lhs)+' :' - return str(self.lhs)+' : '+ str(self.rhs) - def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.lhs, self.rhs) class Data_Ref(SequenceBase): # R612 """ @@ -2236,7 +2816,7 @@ class Data_Ref(SequenceBase): # R612 """ subclass_names = ['Part_Ref'] use_names = [] - def match(string): return SequenceBase.match('%', Part_Ref, string) + def match(string): return SequenceBase.match(r'%', Part_Ref, string) match = staticmethod(match) class Part_Ref(CallBase): # R613 @@ -2245,7 +2825,8 @@ class Part_Ref(CallBase): # R613 """ subclass_names = ['Part_Name'] use_names = ['Section_Subscript_List'] - def match(string): return CallBase.match(Part_Name, Section_Subscript_List, string) + def match(string): + return CallBase.match(Part_Name, Section_Subscript_List, string, require_rhs=True) match = staticmethod(match) class Structure_Component(Base): # R614 @@ -2277,7 +2858,7 @@ class Array_Section(CallBase): # R617 """ subclass_names = ['Data_Ref'] use_names = ['Substring_Range'] - def match(string): return CallBase.match(Data_Ref, Substring_Range, string) + def match(string): return CallBase.match(Data_Ref, Substring_Range, string, require_rhs=True) match = staticmethod(match) class Subscript(Base): # R618 @@ -2346,22 +2927,34 @@ class Vector_Subscript(Base): # R622 """ subclass_names = ['Int_Expr'] -class Allocate_Stmt(Base): # R623 +class Allocate_Stmt(StmtBase): # R623 """ <allocate-stmt> = ALLOCATE ( [ <type-spec> :: ] <allocation-list> [ , <alloc-opt-list> ] ) """ subclass_names = [] use_names = ['Type_Spec', 'Allocation_List', 'Alloc_Opt_List'] -class Alloc_Opt(Base):# R624 +class Alloc_Opt(KeywordValueBase):# R624 """ <alloc-opt> = STAT = <stat-variable> | ERRMSG = <errmsg-variable> | SOURCE = <source-expr> """ subclass_names = [] - use_names = ['Stat_Variable', 'Errmsg_Variable', 'Source_Expr', - ] + use_names = ['Stat_Variable', 'Errmsg_Variable', 'Source_Expr'] + def match(string): + for (k,v) in [('STAT', Stat_Variable), + ('ERRMSG', Errmsg_Variable), + ('SOURCE', Source_Expr) + ]: + try: + obj = KeywordValueBase.match(k, v, string, upper_lhs = True) + except NoMatchError: + obj = None + if obj is not None: return obj + return + match = staticmethod(match) + class Stat_Variable(Base):# R625 """ @@ -2396,12 +2989,26 @@ class Allocate_Object(Base): # R629 """ subclass_names = ['Variable_Name', 'Structure_Component'] -class Allocate_Shape_Spec(Base): # R630 +class Allocate_Shape_Spec(SeparatorBase): # R630 """ <allocate-shape-spec> = [ <lower-bound-expr> : ] <upper-bound-expr> """ subclass_names = [] use_names = ['Lower_Bound_Expr', 'Upper_Bound_Expr'] + def match(string): + line, repmap = string_replace_map(string) + if ':' not in line: return None, Upper_Bound_Expr(string) + lower,upper = line.split(':',1) + lower = lower.rstrip() + upper = upper.lstrip() + if not upper: return + if not lower: return + return Lower_Bound_Expr(repmap(lower)), Upper_Bound_Expr(repmap(upper)) + match = staticmethod(match) + def tostr(self): + if self.items[0] is None: return str(self.items[1]) + return SeparatorBase.tostr(self) + class Lower_Bound_Expr(Base): # R631 """ @@ -2415,13 +3022,15 @@ class Upper_Bound_Expr(Base): # R632 """ subclass_names = ['Scalar_Int_Expr'] -class Nullify_Stmt(Base): # R633 +class Nullify_Stmt(StmtBase, CALLBase): # R633 """ <nullify-stmt> = NULLIFY ( <pointer-object-list> ) """ subclass_names = [] use_names = ['Pointer_Object_List'] - + def match(string): return CALLBase.match('NULLIFY', Pointer_Object_List, string, require_rhs=True) + match = staticmethod(match) + class Pointer_Object(Base): # R634 """ <pointer-object> = <variable-name> @@ -2430,21 +3039,31 @@ class Pointer_Object(Base): # R634 """ subclass_names = ['Variable_Name', 'Structure_Component', 'Proc_Pointer_Name'] -class Deallocate_Stmt(Base): # R635 +class Deallocate_Stmt(StmtBase): # R635 """ <deallocate-stmt> = DEALLOCATE ( <allocate-object-list> [ , <dealloc-opt-list> ] ) """ subclass_names = [] use_names = ['Allocate_Object_List', 'Dealloc_Opt_List'] -class Dealloc_Opt(Base): # R636 +class Dealloc_Opt(KeywordValueBase): # R636 """ <dealloc-opt> = STAT = <stat-variable> | ERRMSG = <errmsg-variable> """ subclass_names = [] use_names = ['Stat_Variable', 'Errmsg_Variable'] - + def match(string): + for (k,v) in [('STAT', Stat_Variable), + ('ERRMSG', Errmsg_Variable), + ]: + try: + obj = KeywordValueBase.match(k, v, string, upper_lhs = True) + except NoMatchError: + obj = None + if obj is not None: return obj + return + match = staticmethod(match) class Scalar_Char_Initialization_Expr(Base): subclass_names = ['Char_Initialization_Expr'] @@ -2469,7 +3088,7 @@ class Primary(Base): # R701 'Function_Reference', 'Type_Param_Inquiry', 'Type_Param_Name', ] -class Parenthesis(BracketBase): +class Parenthesis(BracketBase): # R701.h """ <parenthesis> = ( <expr> ) """ @@ -2487,7 +3106,7 @@ class Level_1_Expr(UnaryOpBase): # R702 use_names = [] def match(string): if pattern.non_defined_binary_op.match(string): - raise NoMatchError,`string` + raise NoMatchError,'%s: %r' % (Level_1_Expr.__name__, string) return UnaryOpBase.match(\ pattern.defined_unary_op.named(),Primary,string) match = staticmethod(match) @@ -2515,8 +3134,7 @@ class Add_Operand(BinaryOpBase): # R705 subclass_names = ['Mult_Operand'] use_names = ['Add_Operand','Mult_Operand'] def match(string): - return BinaryOpBase.match(\ - Add_Operand,pattern.mult_op.named(),Mult_Operand,string) + return BinaryOpBase.match(Add_Operand,pattern.mult_op.named(),Mult_Operand,string) match = staticmethod(match) class Level_2_Expr(BinaryOpBase): # R706 @@ -2534,7 +3152,7 @@ class Level_2_Expr(BinaryOpBase): # R706 Level_2_Expr,pattern.add_op.named(),Add_Operand,string) match = staticmethod(match) -class Level_2_Unary_Expr(UnaryOpBase): +class Level_2_Unary_Expr(UnaryOpBase): # R706.c """ <level-2-unary-expr> = [ <add-op> ] <add-operand> """ @@ -2705,14 +3323,17 @@ class Logical_Initialization_Expr(Base): # R733 """ subclass_names = ['Logical_Expr'] -class Assignment_Stmt(Base): # R734 +class Assignment_Stmt(StmtBase, BinaryOpBase): # R734 """ <assignment-stmt> = <variable> = <expr> """ subclass_names = [] use_names = ['Variable', 'Expr'] - -class Pointer_Assignment_Stmt(Base): # R735 + def match(string): + return BinaryOpBase.match(Variable, '=', Expr, string, right=False) + match = staticmethod(match) + +class Pointer_Assignment_Stmt(StmtBase): # R735 """ <pointer-assignment-stmt> = <data-pointer-object> [ ( <bounds-spec-list> ) ] => <data-target> | <data-pointer-object> ( <bounds-remapping-list> ) => <data-target> @@ -2730,19 +3351,23 @@ class Data_Pointer_Object(Base): # R736 subclass_names = ['Variable_Name'] use_names = ['Variable', 'Data_Pointer_Component_Name'] -class Bounds_Spec(Base): # R737 +class Bounds_Spec(SeparatorBase): # R737 """ <bounds-spec> = <lower-bound-expr> : """ subclass_names = [] use_names = ['Lower_Bound_Expr'] + def match(string): return SeparatorBase.match(Lower_Bound_Expr, None, string, require_lhs=True) + match = staticmethod(match) -class Bounds_Remapping(Base): # R738 +class Bounds_Remapping(SeparatorBase): # R738 """ <bounds-remapping> = <lower-bound-expr> : <upper-bound-expr> """ subclass_names = [] use_classes = ['Lower_Bound_Expr', 'Upper_Bound_Expr'] + def match(string): return SeparatorBase.match(Lower_Bound_Expr, Upper_Bound_Expr, string, require_lhs=True, require_rhs=True) + match = staticmethod(match) class Data_Target(Base): # R739 """ @@ -2765,8 +3390,7 @@ class Proc_Component_Ref(BinaryOpBase): # R741 subclass_names = [] use_names = ['Variable','Procedure_Component_Name'] def match(string): - return BinaryOpBase.match(\ - Variable, pattern.percent_op.named(), Procedure_Component_Name, string) + return BinaryOpBase.match(Variable, r'%', Procedure_Component_Name, string) match = staticmethod(match) class Proc_Target(Base): # R742 @@ -2778,7 +3402,7 @@ class Proc_Target(Base): # R742 subclass_names = ['Proc_Component_Ref', 'Procedure_Name', 'Expr'] -class Where_Stmt(Base): # R743 +class Where_Stmt(StmtBase): # R743 """ <where-stmt> = WHERE ( <mask-expr> ) <where-assignment-stmt> """ @@ -2801,7 +3425,7 @@ class Where_Construct(Base): # R744 'Elsewhere_Stmt', 'End_Where_Stmt' ] -class Where_Construct_Stmt(Base): # R745 +class Where_Construct_Stmt(StmtBase): # R745 """ <where-construct-stmt> = [ <where-construct-name> : ] WHERE ( <mask-expr> ) """ @@ -2828,26 +3452,29 @@ class Mask_Expr(Base): # R748 """ subclass_names = ['Logical_Expr'] -class Masked_Elsewhere_Stmt(Base): # R749 +class Masked_Elsewhere_Stmt(StmtBase): # R749 """ <masked-elsewhere-stmt> = ELSEWHERE ( <mask-expr> ) [ <where-construct-name> ] """ subclass_names = [] use_names = ['Mask_Expr', 'Where_Construct_Name'] -class Elsewhere_Stmt(Base): # R750 +class Elsewhere_Stmt(StmtBase): # R750 """ <elsewhere-stmt> = ELSEWHERE [ <where-construct-name> ] """ subclass_names = [] use_names = ['Where_Construct_Name'] -class End_Where_Stmt(Base): # R751 +class End_Where_Stmt(EndStmtBase): # R751 """ <end-where-stmt> = END WHERE [ <where-construct-name> ] """ subclass_names = [] use_names = ['Where_Construct_Name'] + def match(string): return EndStmtBase.match('WHERE',Where_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) + class Forall_Construct(Base): # R752 """ @@ -2858,7 +3485,7 @@ class Forall_Construct(Base): # R752 subclass_names = [] use_names = ['Forall_Construct_Stmt', 'Forall_Body_Construct', 'End_Forall_Stmt'] -class Forall_Construct_Stmt(Base): # R753 +class Forall_Construct_Stmt(StmtBase): # R753 """ <forall-construct-stmt> = [ <forall-construct-name> : ] FORALL <forall-header> """ @@ -2897,14 +3524,16 @@ class Forall_Assignment_Stmt(Base): # R757 """ subclass_names = ['Assignment_Stmt', 'Pointer_Assignment_Stmt'] -class End_Forall_Stmt(Base): # R758 +class End_Forall_Stmt(EndStmtBase): # R758 """ <end-forall-stmt> = END FORALL [ <forall-construct-name> ] """ subclass_names = [] use_names = ['Forall_Construct_Name'] + def match(string): return EndStmtBase.match('FORALL',Forall_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) -class Forall_Stmt(Base): # R759 +class Forall_Stmt(StmtBase): # R759 """ <forall-stmt> = FORALL <forall-header> <forall-assignment-stmt> """ @@ -2915,14 +3544,16 @@ class Forall_Stmt(Base): # R759 ############################### SECTION 8 #################################### ############################################################################### -class Block(Base): # R801 +class Block(BlockBase): # R801 """ block = [ <execution-part-construct> ]... """ subclass_names = [] use_names = ['Execution_Part_Construct'] + def match(string): return BlockBase.match(None, [Execution_Part_Construct], None, string) + match = staticmethod(match) -class If_Construct(Base): # R802 +class If_Construct(BlockBase): # R802 """ <if-construct> = <if-then-stmt> <block> @@ -2937,41 +3568,165 @@ class If_Construct(Base): # R802 subclass_names = [] use_names = ['If_Then_Stmt', 'Block', 'Else_If_Stmt', 'Else_Stmt', 'End_If_Stmt'] -class If_Then_Stmt(Base): # R803 + def match(reader): + content = [] + try: + obj = If_Then_Stmt(reader) + except NoMatchError: + obj = None + if obj is None: return + content.append(obj) + obj = Block(reader) + if obj is None: return # todo: restore reader + content.append(obj) + while 1: + try: + obj = Else_If_Stmt(reader) + except NoMatchError: + obj = None + if obj is not None: + content.append(obj) + obj = Block(reader) + if obj is None: return # todo: restore reader + content.append(obj) + continue + try: + obj = Else_Stmt(reader) + except NoMatchError: + obj = None + if obj is not None: + content.append(obj) + obj = Block(reader) + if obj is None: return # todo: restore reader + content.append(obj) + break + try: + obj = End_If_Stmt(reader) + except NoMatchError: + obj = None + if obj is None: return # todo: restore reader + content.append(obj) + return content, + match = staticmethod(match) + + def tofortran(self, tab='', isfix=None): + l = [] + start = self.content[0] + end = self.content[-1] + l.append(start.tofortran(tab=tab,isfix=isfix)) + for item in self.content[1:-1]: + if isinstance(item, (Else_If_Stmt, Else_Stmt)): + l.append(item.tofortran(tab=tab,isfix=isfix)) + else: + l.append(item.tofortran(tab=tab+' ',isfix=isfix)) + l.append(end.tofortran(tab=tab,isfix=isfix)) + return '\n'.join(l) + + +class If_Then_Stmt(StmtBase): # R803 """ <if-then-stmt> = [ <if-construct-name> : ] IF ( <scalar-logical-expr> ) THEN """ subclass_names = [] use_names = ['If_Construct_Name', 'Scalar_Logical_Expr'] + def match(string): + if string[:2].upper()!='IF': return + if string[-4:].upper()!='THEN': return + line = string[2:-4].strip() + if not line: return + if line[0]+line[-1]!='()': return + return Scalar_Logical_Expr(line[1:-1].strip()), + match = staticmethod(match) + def init(self, expr): + self.expr = expr + return + def tostr(self): return 'IF (%s) THEN' % (self.expr) + def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.expr) -class Else_If_Stmt(Base): # R804 +class Else_If_Stmt(StmtBase): # R804 """ <else-if-stmt> = ELSE IF ( <scalar-logical-expr> ) THEN [ <if-construct-name> ] """ subclass_names = [] use_names = ['Scalar_Logical_Expr', 'If_Construct_Name'] -class Else_Stmt(Base): # R805 + def match(string): + if string[:4].upper()!='ELSE': return + line = string[4:].lstrip() + if line[:2].upper()!='IF': return + line = line[2:].lstrip() + if not line.startswith('('): return + i = line.rfind(')') + if i==-1: return + expr = line[1:i].strip() + line = line[i+1:].lstrip() + if line[:4].upper()!='THEN': return + line = line[4:].lstrip() + if line: return Scalar_Logical_Expr(expr), If_Construct_Name(line) + return Scalar_Logical_Expr(expr), None + match = staticmethod(match) + def init(self, *args): + self.expr, self.iflabel = args + return + def tostr(self): + if self.iflabel is None: + return 'ELSE IF (%s) THEN' % (self.expr) + return 'ELSE IF (%s) THEN %s' % (self.expr, self.iflabel) + def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.expr, self.iflabel) + +class Else_Stmt(StmtBase): # R805 """ <else-stmt> = ELSE [ <if-construct-name> ] """ subclass_names = [] use_names = ['If_Construct_Name'] + def match(string): + if string[:4].upper()!='ELSE': return + line = string[4:].lstrip() + if line: return If_Construct_Name(line), + return None, + match = staticmethod(match) + def init(self, iflabel): + self.iflabel = iflabel + return + def tostr(self): + if self.iflabel is None: + return 'ELSE' + return 'ELSE %s' % (self.expr, self.iflabel) + def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.iflabel) -class End_If_Stmt(Base): # R806 +class End_If_Stmt(EndStmtBase): # R806 """ <end-if-stmt> = END IF [ <if-construct-name> ] """ subclass_names = [] use_names = ['If_Construct_Name'] + def match(string): return EndStmtBase.match('IF',If_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) -class If_Stmt(Base): # R807 +class If_Stmt(StmtBase): # R807 """ <if-stmt> = IF ( <scalar-logical-expr> ) <action-stmt> """ subclass_names = [] - use_names = ['Scalar_Logical_Expr', 'Action_Stmt'] - + use_names = ['Scalar_Logical_Expr', 'Action_Stmt_C802'] + def match(string): + if string[:2].upper() != 'IF': return + line, repmap = string_replace_map(string) + line = line[2:].lstrip() + if not line.startswith('('): return + i = line.find(')') + if i==-1: return + expr = repmap(line[1:i].strip()) + stmt = repmap(line[i+1:].lstrip()) + return Scalar_Logical_Expr(expr), Action_Stmt_C802(stmt) + match = staticmethod(match) + def init(self, *args): + self.expr, self.stmt = args + return + def tostr(self): return 'IF (%s) %s' % (self.expr, self.stmt) + def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.expr, self.stmt) + class Case_Construct(Base): # R808 """ <case-construct> = <select-case-stmt> @@ -2983,26 +3738,28 @@ class Case_Construct(Base): # R808 subclass_names = [] use_names = ['Select_Case_Stmt', 'Case_Stmt', 'End_Select_Stmt'] -class Select_Case_Stmt(Base): # R809 +class Select_Case_Stmt(StmtBase): # R809 """ <select-case-stmt> = [ <case-construct-name> : ] SELECT CASE ( <case-expr> ) """ subclass_names = [] use_names = ['Case_Construct_Name', 'Case_Expr'] -class Case_Stmt(Base): # R810 +class Case_Stmt(StmtBase): # R810 """ <case-stmt> = CASE <case-selector> [ <case-construct-name> ] """ subclass_names = [] use_names = ['Case_Selector', 'Case_Construct_Name'] -class End_Select_Stmt(Base): # R811 +class End_Select_Stmt(EndStmtBase): # R811 """ <end-select-stmt> = END SELECT [ <case-construct-name> ] """ subclass_names = [] use_names = ['Case_Construct_Name'] + def match(string): return EndStmtBase.match('SELECT',Case_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) class Case_Expr(Base): # R812 """ @@ -3021,7 +3778,7 @@ class Case_Selector(Base): # R813 subclass_names = [] use_names = ['Case_Value_Range_List'] -class Case_Value_Range(Base): # R814 +class Case_Value_Range(SeparatorBase): # R814 """ <case-value-range> = <case-value> | <case-value> : @@ -3029,6 +3786,8 @@ class Case_Value_Range(Base): # R814 | <case-value> : <case-value> """ subclass_names = ['Case_Value'] + def match(string): return SeparatorBase.match(Case_Value, Case_Value, string) + match = staticmethod(match) class Case_Value(Base): # R815 """ @@ -3048,19 +3807,21 @@ class Associate_Construct(Base): # R816 subclass_names = [] use_names = ['Associate_Stmt', 'Block', 'End_Associate_Stmt'] -class Associate_Stmt(Base): # R817 +class Associate_Stmt(StmtBase): # R817 """ <associate-stmt> = [ <associate-construct-name> : ] ASSOCIATE ( <association-list> ) """ subclass_names = [] use_names = ['Associate_Construct_Name', 'Association_List'] -class Association(Base): # R818 +class Association(BinaryOpBase): # R818 """ <association> = <associate-name> => <selector> """ subclass_names = [] use_names = ['Associate_Name', 'Selector'] + def match(string): return BinaryOpBase.match(Assiciate_Name, '=>', Selector, string) + match = staticmethod(match) class Selector(Base): # R819 """ @@ -3069,12 +3830,14 @@ class Selector(Base): # R819 """ subclass_names = ['Expr', 'Variable'] -class End_Associate_Stmt(Base): # R820 +class End_Associate_Stmt(EndStmtBase): # R820 """ <end-associate-stmt> = END ASSOCIATE [ <associate-construct-name> ] """ subclass_names = [] use_names = ['Associate_Construct_Name'] + def match(string): return EndStmtBase.match('ASSOCIATE',Associate_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) class Select_Type_Construct(Base): # R821 """ @@ -3087,14 +3850,14 @@ class Select_Type_Construct(Base): # R821 subclass_names = [] use_names = ['Select_Type_Stmt', 'Type_Guard_Stmt', 'Block', 'End_Select_Type_Stmt'] -class Select_Type_Stmt(Base): # R822 +class Select_Type_Stmt(StmtBase): # R822 """ <select-type-stmt> = [ <select-construct-name> : ] SELECT TYPE ( [ <associate-name> => ] <selector> ) """ subclass_names = [] use_names = ['Select_Construct_Name', 'Associate_Name', 'Selector'] -class Type_Guard_Stmt(Base): # R823 +class Type_Guard_Stmt(StmtBase): # R823 """ <type-guard-stmt> = TYPE IS ( <type-spec> ) [ <select-construct-name> ] | CLASS IS ( <type-spec> ) [ <select-construct-name> ] @@ -3103,12 +3866,14 @@ class Type_Guard_Stmt(Base): # R823 subclass_names = [] use_names = ['Type_Spec', 'Select_Construct_Name'] -class End_Select_Type_Stmt(Base): # R824 +class End_Select_Type_Stmt(EndStmtBase): # R824 """ <end-select-type-stmt> = END SELECT [ <select-construct-name> ] """ subclass_names = [] use_names = ['Select_Construct_Name'] + def match(string): return EndStmtBase.match('SELECT',Select_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) class Do_Construct(Base): # R825 """ @@ -3117,7 +3882,7 @@ class Do_Construct(Base): # R825 """ subclass_names = ['Block_Do_Construct', 'Nonblock_Do_Construct'] -class Block_Do_Construct(Base): # R826 +class Block_Do_Construct(BlockBase): # R826 """ <block-do-construct> = <do-stmt> <do-block> @@ -3125,6 +3890,48 @@ class Block_Do_Construct(Base): # R826 """ subclass_names = [] use_names = ['Do_Stmt', 'Do_Block', 'End_Do'] + def match(reader): + assert isinstance(reader,FortranReaderBase),`reader` + content = [] + try: + obj = Do_Stmt(reader) + except NoMatchError: + obj = None + if obj is None: return + content.append(obj) + if isinstance(obj, Label_Do_Stmt): + label = str(obj.dolabel) + while 1: + try: + obj = Execution_Part_Construct(reader) + except NoMatchError: + obj = None + if obj is None: break + content.append(obj) + if isinstance(obj, Continue_Stmt) and obj.item.label==label: + return content, + return + raise RuntimeError,'Expected continue stmt with specified label' + else: + obj = End_Do(reader) + content.append(obj) + raise NotImplementedError + return content, + match = staticmethod(match) + + def tofortran(self, tab='', isfix=None): + if not isinstance(self.content[0], Label_Do_Stmt): + return BlockBase.tofortran(tab, isfix) + l = [] + start = self.content[0] + end = self.content[-1] + extra_tab = ' ' + l.append(start.tofortran(tab=tab,isfix=isfix)) + for item in self.content[1:-1]: + l.append(item.tofortran(tab=tab+extra_tab,isfix=isfix)) + if len(self.content)>1: + l.append(end.tofortran(tab=tab,isfix=isfix)) + return '\n'.join(l) class Do_Stmt(Base): # R827 """ @@ -3133,14 +3940,29 @@ class Do_Stmt(Base): # R827 """ subclass_names = ['Label_Do_Stmt', 'Nonlabel_Do_Stmt'] -class Label_Do_Stmt(Base): # R828 +class Label_Do_Stmt(StmtBase): # R828 """ <label-do-stmt> = [ <do-construct-name> : ] DO <label> [ <loop-control> ] """ subclass_names = [] use_names = ['Do_Construct_Name', 'Label', 'Loop_Control'] - -class Nonlabel_Do_Stmt(Base): # R829 + def match(string): + if string[:2].upper()!='DO': return + line = string[2:].lstrip() + m = pattern.label.match(line) + if m is None: return + label = m.group() + line = line[m.end():].lstrip() + if line: return Label(label), Loop_Control(line) + return Label(label), None + match = staticmethod(match) + def init(self,*args): + self.dolabel, self.loop_control = args + def tostr(self): + if self.loop_control is None: return 'DO %s' % (self.dolabel) + return 'DO %s %s' % (self.dolabel, self.loop_control) + +class Nonlabel_Do_Stmt(StmtBase): # R829 """ <nonlabel-do-stmt> = [ <do-construct-name> : ] DO [ <loop-control> ] """ @@ -3154,7 +3976,31 @@ class Loop_Control(Base): # R830 """ subclass_names = [] use_names = ['Do_Variable', 'Scalar_Int_Expr', 'Scalar_Logical_Expr'] - + def match(string): + if string.startswith(','): + line, repmap = string_replace_map(string[1:].lstrip()) + else: + line, repmap = string_replace_map(string) + if line[:5].upper()=='WHILE' and line[5:].lstrip().startswith('('): + l = line[5:].lstrip() + i = l.find(')') + if i!=-1 and i==len(l)-1: + return Scalar_Logical_Expr(repmap(l[1:i].strip())), + if line.count('=')!=1: return + var,rhs = line.split('=') + rhs = [s.strip() for s in rhs.lstrip().split(',')] + if not 2<=len(rhs)<=3: return + return Variable(repmap(var.rstrip())),map(Scalar_Int_Expr, map(repmap,rhs)) + match = staticmethod(match) + def init(self, *args): + self.items = args + def tostr(self): + if len(self.items)==1: return ', WHILE (%s)' % (self.items[0]) + return ', %s = %s' % (self.items[0], ', '.join(map(str,self.items[1]))) + def torepr(self): + if len(self.items)==1: return '%s(%r)' % (self.__class__.__name__, self.items[0]) + return '%s(%r, %r)' % (self.__class__.__name__, self.items[0], self.items[1]) + class Do_Variable(Base): # R831 """ <do-variable> = <scalar-int-variable> @@ -3174,12 +4020,14 @@ class End_Do(Base): # R833 """ subclass_names = ['End_Do_Stmt', 'Continue_Stmt'] -class End_Do_Stmt(Base): # R834 +class End_Do_Stmt(EndStmtBase): # R834 """ <end-do-stmt> = END DO [ <do-construct-name> ] """ subclass_names = [] use_names = ['Do_Construct_Name'] + def match(string): return EndStmtBase.match('DO',Do_Construct_Name, string, require_stmt_type=True) + match = staticmethod(match) class Nonblock_Do_Construct(Base): # R835 """ @@ -3188,7 +4036,7 @@ class Nonblock_Do_Construct(Base): # R835 """ subclass_names = ['Action_Term_Do_Construct', 'Outer_Shared_Do_Construct'] -class Action_Term_Do_Construct(Base): # R836 +class Action_Term_Do_Construct(BlockBase): # R836 """ <action-term-do-construct> = <label-do-stmt> <do-body> @@ -3196,24 +4044,35 @@ class Action_Term_Do_Construct(Base): # R836 """ subclass_names = [] use_names = ['Label_Do_Stmt', 'Do_Body', 'Do_Term_Action_Stmt'] + def match(reader): + content = [] + for cls in [Label_Do_Stmt, Do_Body, Do_Term_Action_Stmt]: + obj = cls(reader) + if obj is None: # todo: restore reader + return + content.append(obj) + return content, + match = staticmethod(match) -class Do_Body(Base): # R837 +class Do_Body(BlockBase): # R837 """ <do-body> = [ <execution-part-construct> ]... """ subclass_names = [] use_names = ['Execution_Part_Construct'] + def match(string): return BlockBase.match(None, [Execution_Part_Construct], None, string) + match = staticmethod(match) -class Do_Term_Action_Stmt(Base): # R838 +class Do_Term_Action_Stmt(StmtBase): # R838 """ <do-term-action-stmt> = <action-stmt> C824: <do-term-action-stmt> shall not be <continue-stmt>, <goto-stmt>, <return-stmt>, <stop-stmt>, <exit-stmt>, <cycle-stmt>, <end-function-stmt>, <end-subroutine-stmt>, <end-program-stmt>, <arithmetic-if-stmt> """ - subclass_names = ['Action_Stmt'] + subclass_names = ['Action_Stmt_C824'] -class Outer_Shared_Do_Construct(Base): # R839 +class Outer_Shared_Do_Construct(BlockBase): # R839 """ <outer-shared-do-construct> = <label-do-stmt> <do-body> @@ -3221,6 +4080,15 @@ class Outer_Shared_Do_Construct(Base): # R839 """ subclass_names = [] use_names = ['Label_Do_Stmt', 'Do_Body', 'Shared_Term_Do_Construct'] + def match(reader): + content = [] + for cls in [Label_Do_Stmt, Do_Body, Shared_Term_Do_Construct]: + obj = cls(reader) + if obj is None: # todo: restore reader + return + content.append(obj) + return content, + match = staticmethod(match) class Shared_Term_Do_Construct(Base): # R840 """ @@ -3229,7 +4097,7 @@ class Shared_Term_Do_Construct(Base): # R840 """ subclass_names = ['Outer_Shared_Do_Construct', 'Inner_Shared_Do_Construct'] -class Inner_Shared_Do_Construct(Base): # R841 +class Inner_Shared_Do_Construct(BlockBase): # R841 """ <inner-shared-do-construct> = <label-do-stmt> <do-body> @@ -3238,60 +4106,104 @@ class Inner_Shared_Do_Construct(Base): # R841 subclass_names = [] use_names = ['Label_Do_Stmt', 'Do_Body', 'Do_Term_Shared_Stmt'] -class Do_Term_Shared_Stmt(Base): # R842 + def match(reader): + content = [] + for cls in [Label_Do_Stmt, Do_Body, Do_Term_Shared_Stmt]: + obj = cls(reader) + if obj is None: # todo: restore reader + return + content.append(obj) + return content, + match = staticmethod(match) + +class Do_Term_Shared_Stmt(StmtBase): # R842 """ <do-term-shared-stmt> = <action-stmt> C826: see C824 above. """ subclass_names = ['Action_Stmt'] -class Cycle_Stmt(Base): # R843 +class Cycle_Stmt(StmtBase, WORDClsBase): # R843 """ <cycle-stmt> = CYCLE [ <do-construct-name> ] """ subclass_names = [] use_names = ['Do_Construct_Name'] + def match(string): return WORDClsBase.match('CYCLE', Do_Construct_Name, string) + match = staticmethod(match) -class Exit_Stmt(Base): # R844 +class Exit_Stmt(StmtBase, WORDClsBase): # R844 """ <exit-stmt> = EXIT [ <do-construct-name> ] """ subclass_names = [] use_names = ['Do_Construct_Name'] + def match(string): return WORDClsBase.match('EXIT', Do_Construct_Name, string) + match = staticmethod(match) -class Goto_Stmt(Base): # R845 +class Goto_Stmt(StmtBase): # R845 """ <goto-stmt> = GO TO <label> """ subclass_names = [] use_names = ['Label'] + def match(string): + if string[:2].upper() != 'GO': return + line = string[2:].lstrip() + if line[:2].upper() != 'TO': return + return Label(line[2:].lstrip()), + match = staticmethod(match) + def init(self, value): self.value = value + def tostr(self): return 'GO TO %s' % (self.value) + def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.value) -class Computed_Goto_Stmt(Base): # R846 +class Computed_Goto_Stmt(StmtBase): # R846 """ <computed-goto-stmt> = GO TO ( <label-list> ) [ , ] <scalar-int-expr> """ subclass_names = [] use_names = ['Label_List', 'Scalar_Int_Expr'] -class Arithmetic_If_Stmt(Base): # R847 +class Arithmetic_If_Stmt(StmtBase): # R847 """ <arithmetic-if-stmt> = IF ( <scalar-numeric-expr> ) <label> , <label> , <label> """ subclass_names = [] use_names = ['Scalar_Numeric_Expr', 'Label'] + def match(string): + if string[:2].upper() != 'IF': return + line = string[2:].lstrip() + if not line.startswith('('): return + i = line.rfind(')') + if i==-1: return + labels = line[i+1:].lstrip().split(',') + if len(labels) != 3: return + labels = [Label(l.strip()) for l in labels] + return Scalar_Numeric_Expr(line[1:i].strip()), labels + match = staticmethod(match) + def init(self, *args): + self.expr, self.labels = args + return + def tostr(self): return 'IF (%s) %s' % (self.expr, ', '.join(map(str,self.labels))) + def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.expr, ', '.join(map(repr,self.labels))) -class Continue_Stmt(Base): # R848 +class Continue_Stmt(StmtBase, STRINGBase): # R848 """ <continue-stmt> = CONTINUE """ subclass_names = [] - -class Stop_Stmt(Base): # R849 + def match(string): return STRINGBase.match('CONTINUE', string) + match = staticmethod(match) + + +class Stop_Stmt(StmtBase, WORDClsBase): # R849 """ <stop-stmt> = STOP [ <stop-code> ] """ subclass_names = [] use_names = ['Stop_Code'] + def match(string): return WORDClsBase.match('STOP', Stop_Code, string) + match = staticmethod(match) class Stop_Code(StringBase): # R850 """ @@ -3307,13 +4219,15 @@ class Stop_Code(StringBase): # R850 ############################### SECTION 9 #################################### ############################################################################### -class Io_Unit(Base): # R901 +class Io_Unit(StringBase): # R901 """ <io-unit> = <file-unit-number> | * | <internal-file-variable> """ subclass_names = ['File_Unit_Number', 'Internal_File_Variable'] + def match(string): return StringBase.match('*', string) + match = staticmethod(match) class File_Unit_Number(Base): # R902 """ @@ -3328,7 +4242,7 @@ class Internal_File_Variable(Base): # R903 """ subclass_names = ['Char_Variable'] -class Open_Stmt(Base): # R904 +class Open_Stmt(StmtBase): # R904 """ <open-stmt> = OPEN ( <connect-spec-list> ) """ @@ -3373,7 +4287,7 @@ class Iomsg_Variable(Base): # R907 """ subclass_names = ['Scalar_Default_Char_Variable'] -class Close_Stmt(Base): # R908 +class Close_Stmt(StmtBase): # R908 """ <close-stmt> = CLOSE ( <close-spec-list> ) """ @@ -3392,7 +4306,7 @@ class Close_Spec(Base): # R909 use_names = ['File_Unit_Number', 'Scalar_Default_Char_Expr', 'Label', 'Iomsg_Variable', 'Scalar_Int_Variable'] -class Read_Stmt(Base): # R910 +class Read_Stmt(StmtBase): # R910 """ <read-stmt> = READ ( <io-control-spec-list> ) [ <input-item-list> ] | READ <format> [ , <input-item-list> ] @@ -3400,21 +4314,95 @@ class Read_Stmt(Base): # R910 subclass_names = [] use_names = ['Io_Control_Spec_List', 'Input_Item_List', 'Format'] -class Write_Stmt(Base): # R911 +class Write_Stmt(StmtBase): # R911 """ <write-stmt> = WRITE ( <io-control-spec-list> ) [ <output-item-list> ] """ subclass_names = [] use_names = ['Io_Control_Spec_List', 'Output_Item_List'] - -class Print_Stmt(Base): # R912 + def match(string): + if string[:5].upper()!='WRITE': return + line = string[5:].lstrip() + if not line.startswith('('): return + line, repmap = string_replace_map(line) + i = line.find(')') + if i==-1: return + l = line[1:i].strip() + if not l: return + l = repmap(l) + if i==len(line)-1: + return Io_Control_Spec_List(l),None + return Io_Control_Spec_List(l), Output_Item_List(repmap(line[i+1:].lstrip())) + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + if self.items[1] is None: return 'WRITE(%s)' % (self.items[0]) + return 'WRITE(%s) %s' % tuple(self.items) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) + +class Print_Stmt(StmtBase): # R912 """ <print-stmt> = PRINT <format> [ , <output-item-list> ] """ subclass_names = [] use_names = ['Format', 'Output_Item_List'] + def match(string): + if string[:5].upper()!='PRINT': return + line = string[5:] + if not line: return + c = line[0].upper() + if 'A'<=c<='Z' or c=='_' or '0'<=c<='9': return + line, repmap = string_replace_map(line.lstrip()) + i = line.find(',') + if i==-1: return Format(repmap(line)), None + l = repmap(line[i+1:].lstrip()) + if not l: return + return Format(repmap(line[:i].rstrip())), Output_Item_List(l) + match = staticmethod(match) + def init(self, *args): + self.items = args + return + def tostr(self): + if self.items[1] is None: return 'PRINT %s' % (self.items[0]) + return 'PRINT %s, %s' % tuple(self.items) + def torepr(self): return '%s(%s)' % (self.__class__.__name__, ', '.join(map(repr,self.items))) + +class Io_Control_Spec_List(SequenceBase): # R913-list + """ + <io-control-spec-list> is a list taking into account C910, C917, C918 + """ + subclass_names = [] + use_names = ['Io_Control_Spec'] + def match(string): + line, repmap = string_replace_map(string) + splitted = line.split(',') + if not splitted: return + lst = [] + for i in range(len(splitted)): + p = splitted[i].strip() + if i==0: + if '=' not in p: p = 'UNIT=%s' % (repmap(p)) + else: p = repmap(p) + elif i==1: + if '=' not in p: + p = repmap(p) + try: + f = Format(p) + # todo: make sure that f is char-expr, if not, raise NoMatchError + p = 'FMT=%s' % (Format(p)) + except NoMatchError: + p = 'NML=%s' % (Namelist_Group_Name(p)) + else: + p = repmap(p) + else: + p = repmap(p) + lst.append(Io_Control_Spec(p)) + return ',', tuple(lst) + match = staticmethod(match) -class Io_Control_Spec(Base): # R913 +class Io_Control_Spec(KeywordValueBase): # R913 """ <io-control-spec> = [ UNIT = ] <io-unit> | [ FMT = ] <format> @@ -3441,14 +4429,35 @@ class Io_Control_Spec(Base): # R913 use_names = ['Io_Unit', 'Format', 'Namelist_Group_Name', 'Scalar_Default_Char_Expr', 'Scalar_Char_Initialization_Expr', 'Label', 'Scalar_Int_Variable', 'Iomsg_Variable', 'Scalar_Int_Expr'] + def match(string): + for (k,v) in [\ + (['ADVANCE', 'BLANK', 'DECIMAL', 'DELIM', 'PAD', 'ROUND', 'SIGN'], Scalar_Default_Char_Expr), + ('ASYNCHRONOUS', Scalar_Char_Initialization_Expr), + (['END','EOR','ERR'], Label), + (['ID','IOSTAT','SIZE'], Scalar_Int_Variable), + ('IOMSG', Iomsg_Variable), + (['POS', 'REC'], Scalar_Int_Expr), + ('UNIT', Io_Unit), + ('FMT', Format), + ('NML', Namelist_Group_Name) + ]: + try: + obj = KeywordValueBase.match(k, v, string, upper_lhs = True) + except NoMatchError: + obj = None + if obj is not None: return obj + return + match = staticmethod(match) -class Format(Base): # R914 +class Format(StringBase): # R914 """ <format> = <default-char-expr> | <label> | * """ - subclass_names = ['Default_Char_Expr', 'Label'] + subclass_names = ['Label', 'Default_Char_Expr'] + def match(string): return StringBase.match('*', string) + match = staticmethod(match) class Input_Item(Base): # R915 """ @@ -3493,14 +4502,16 @@ class Dtv_Type_Spec(Base): # R920 subclass_names = [] use_names = ['Derived_Type_Spec'] -class Wait_Stmt(Base): # R921 +class Wait_Stmt(StmtBase, CALLBase): # R921 """ <wait-stmt> = WAIT ( <wait-spec-list> ) """ subclass_names = [] use_names = ['Wait_Spec_List'] + def match(string): return CALLBase.match('WAIT', Wait_Spec_List, string, require_rhs=True) + match = staticmethod(match) -class Wait_Spec(Base): # R922 +class Wait_Spec(KeywordValueBase): # R922 """ <wait-spec> = [ UNIT = ] <file-unit-number> | END = <label> @@ -3512,8 +4523,24 @@ class Wait_Spec(Base): # R922 """ subclass_names = [] use_names = ['File_Unit_Number', 'Label', 'Scalar_Int_Expr', 'Iomsg_Variable', 'Scalar_Int_Variable'] + def match(string): + for (k,v) in [\ + (['END','EOR','ERR'], Label), + ('IOSTAT', Scalar_Int_Variable), + ('IOMSG', Iomsg_Variable), + ('ID', Scalar_Int_Expr), + ('UNIT', File_Unit_Number), + ]: + try: + obj = KeywordValueBase.match(k, v, string, upper_lhs = True) + except NoMatchError: + obj = None + if obj is not None: return obj + return 'UNIT', File_Unit_Number(string) -class Backspace_Stmt(Base): # R923 + match = staticmethod(match) + +class Backspace_Stmt(StmtBase): # R923 """ <backspace-stmt> = BACKSPACE <file-unit-number> | BACKSPACE ( <position-spec-list> ) @@ -3521,7 +4548,7 @@ class Backspace_Stmt(Base): # R923 subclass_names = [] use_names = ['File_Unit_Number', 'Position_Spec_List'] -class Endfile_Stmt(Base): # R924 +class Endfile_Stmt(StmtBase): # R924 """ <endfile-stmt> = ENDFILE <file-unit-number> | ENDFILE ( <position-spec-list> ) @@ -3529,7 +4556,7 @@ class Endfile_Stmt(Base): # R924 subclass_names = [] use_names = ['File_Unit_Number', 'Position_Spec_List'] -class Rewind_Stmt(Base): # R925 +class Rewind_Stmt(StmtBase): # R925 """ <rewind-stmt> = REWIND <file-unit-number> | REWIND ( <position-spec-list> ) @@ -3547,7 +4574,7 @@ class Position_Spec(Base): # R926 subclass_names = [] use_names = ['File_Unit_Number', 'Iomsg_Variable', 'Scalar_Int_Variable', 'Label'] -class Flush_Stmt(Base): # R927 +class Flush_Stmt(StmtBase): # R927 """ <flush-stmt> = FLUSH <file-unit-number> | FLUSH ( <position-spec-list> ) @@ -3565,7 +4592,7 @@ class Flush_Spec(Base): # R928 subclass_names = [] use_names = ['File_Unit_Number', 'Iomsg_Variable', 'Scalar_Int_Variable', 'Label'] -class Inquire_Stmt(Base): # R929 +class Inquire_Stmt(StmtBase): # R929 """ <inquire-stmt> = INQUIRE ( <inquire-spec-list> ) | INQUIRE ( IOLENGTH = <scalar-int-variable> ) <output-item-list> @@ -3622,7 +4649,7 @@ class Inquire_Spec(Base): # R930 ############################### SECTION 10 #################################### ############################################################################### -class Format_Stmt(Base): # R1001 +class Format_Stmt(StmtBase): # R1001 """ <format-stmt> = FORMAT <format-specification> """ @@ -3739,22 +4766,26 @@ class N(Base): # R1014 """ subclass_names = ['Int_Literal_Constant'] -class Sign_Edit_Desc(Base): # R1015 +class Sign_Edit_Desc(STRINGBase): # R1015 """ <sign-edit-desc> = SS | SP | S """ subclass_names = [] + def match(string): return STRINGBase.match(['SS','SP','S'], string) + match = staticmethod(match) -class Blank_Interp_Edit_Desc(Base): # R1016 +class Blank_Interp_Edit_Desc(STRINGBase): # R1016 """ <blank-interp-edit-desc> = BN | BZ """ subclass_names = [] - -class Round_Edit_Desc(Base): # R1017 + def match(string): return STRINGBase.match(['BN','BZ',], string) + match = staticmethod(match) + +class Round_Edit_Desc(STRINGBase): # R1017 """ <round-edit-desc> = RU | RD @@ -3764,14 +4795,18 @@ class Round_Edit_Desc(Base): # R1017 | RP """ subclass_names = [] - -class Decimal_Edit_Desc(Base): # R1018 + def match(string): return STRINGBase.match(['RU','RD','RZ','RN','RC','RP'], string) + match = staticmethod(match) + +class Decimal_Edit_Desc(STRINGBase): # R1018 """ <decimal-edit-desc> = DC | DP """ subclass_names = [] - + def match(string): return STRINGBase.match(['DC','DP'], string) + match = staticmethod(match) + class Char_String_Edit_Desc(Base): # R1019 """ <char-string-edit-desc> = <char-literal-constant> @@ -3794,20 +4829,22 @@ class Main_Program(Base): # R1101 use_names = ['Program_Stmt', 'Specification_Part', 'Execution_Part', 'Internal_Subprogram_Part', 'End_Program_Stmt'] -class Program_Stmt(Base): # R1102 +class Program_Stmt(StmtBase): # R1102 """ <program-stmt> = PROGRAM <program-name> """ subclass_names = [] use_names = ['Program_Name'] -class End_Program_Stmt(Base): # R1103 +class End_Program_Stmt(EndStmtBase): # R1103 """ <end-program-stmt> = END [ PROGRAM [ <program-name> ] ] """ subclass_names = [] use_names = ['Program_Name'] - + def match(string): return EndStmtBase.match('PROGRAM',Program_Name, string) + match = staticmethod(match) + class Module(Base): # R1104 """ <module> = <module-stmt> @@ -3818,19 +4855,21 @@ class Module(Base): # R1104 subclass_names = [] use_names = ['Module_Stmt', 'Specification_Part', 'Module_Subprogram_Part', 'End_Module_Stmt'] -class Module_Stmt(Base): # R1105 +class Module_Stmt(StmtBase): # R1105 """ <module-stmt> = MODULE <module-name> """ subclass_names = [] use_names = ['Module_Name'] -class End_Module_Stmt(Base): # R1106 +class End_Module_Stmt(EndStmtBase): # R1106 """ <end-module-stmt> = END [ MODULE [ <module-name> ] ] """ subclass_names = [] use_names = ['Module_Name'] + def match(string): return EndStmtBase.match('MODULE',Module_Name, string, require_stmt_type=True) + match = staticmethod(match) class Module_Subprogram_Part(Base): # R1107 """ @@ -3848,7 +4887,7 @@ class Module_Subprogram(Base): # R1108 """ subclass_names = ['Function_Subprogram', 'Subroutine_Subprogram'] -class Use_Stmt(Base): # R1109 +class Use_Stmt(StmtBase): # R1109 """ <use-stmt> = USE [ [ , <module-nature> ] :: ] <module-name> [ , <rename-list> ] | USE [ [ , <module-nature> ] :: ] <module-name> , ONLY: [ <only-list> ] @@ -3856,13 +4895,15 @@ class Use_Stmt(Base): # R1109 subclass_names = [] use_names = ['Module_Nature', 'Module_Name', 'Rename_List', 'Only_List'] -class Module_Nature(Base): # R1110 +class Module_Nature(STRINGBase): # R1110 """ <module-nature> = INTRINSIC | NON_INTRINSIC """ subclass_names = [] - + def match(string): return STRINGBase.match(['INTRINSIC','NON_INTRINSIC'], string) + match = staticmethod(match) + class Rename(Base): # R1111 """ <rename> = <local-name> => <use-name> @@ -3908,19 +4949,21 @@ class Block_Data(Base): # R1116 subclass_names = [] use_names = ['Block_Data_Stmt', 'Specification_Part', 'End_Block_Data_Stmt'] -class Block_Data_Stmt(Base): # R1117 +class Block_Data_Stmt(StmtBase): # R1117 """ <block-data-stmt> = BLOCK DATA [ <block-data-name> ] """ subclass_names = [] use_names = ['Block_Data_Name'] -class End_Block_Data_Stmt(Base): # R1118 +class End_Block_Data_Stmt(EndStmtBase): # R1118 """ <end-block-data-stmt> = END [ BLOCK DATA [ <block-data-name> ] ] """ subclass_names = [] use_names = ['Block_Data_Name'] + def match(string): return EndStmtBase.match('BLOCK DATA',Block_Data_Name, string) + match = staticmethod(match) ############################################################################### ############################### SECTION 12 #################################### @@ -3943,7 +4986,7 @@ class Interface_Specification(Base): # R1202 """ subclass_names = ['Interface_Body', 'Procedure_Stmt'] -class Interface_Stmt(Base): # R1203 +class Interface_Stmt(StmtBase): # R1203 """ <interface-stmt> = INTERFACE [ <generic-spec> ] | ABSTRACT INTERFACE @@ -3951,12 +4994,14 @@ class Interface_Stmt(Base): # R1203 subclass_names = [] use_names = ['Generic_Spec'] -class End_Interface_Stmt(Base): # R1204 +class End_Interface_Stmt(EndStmtBase): # R1204 """ <end-interface-stmt> = END INTERFACE [ <generic-spec> ] """ subclass_names = [] use_names = ['Generic_Spec'] + def match(string): return EndStmtBase.match('INTERFACE',Generic_Spec, string, require_stmt_type=True) + match = staticmethod(match) class Interface_Body(Base): # R1205 """ @@ -3970,7 +5015,7 @@ class Interface_Body(Base): # R1205 subclass_names = [] use_names = ['Function_Stmt', 'Specification_Part', 'Subroutine_Stmt', 'End_Function_Stmt', 'End_Subroutine_Stmt'] -class Procedure_Stmt(Base): # R1206 +class Procedure_Stmt(StmtBase): # R1206 """ <procedure-stmt> = [ MODULE ] PROCEDURE <procedure-name-list> """ @@ -3996,7 +5041,7 @@ class Dtio_Generic_Spec(Base): # R1208 """ subclass_names = [] -class Import_Stmt(Base): # R1209 +class Import_Stmt(StmtBase): # R1209 """ <import-stmt> = IMPORT [ :: ] <import-name-list> """ @@ -4016,14 +5061,25 @@ class Import_Stmt(Base): # R1209 def tostr(self): return 'IMPORT :: %s' % (self.names) def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.names) -class External_Stmt(Base): # R1210 +class External_Stmt(StmtBase): # R1210 """ <external-stmt> = EXTERNAL [ :: ] <external-name-list> """ subclass_names = [] use_names = ['External_Name_List'] + def match(string): + if string[:8].upper() != 'EXTERNAL': return + line = string[8:].lstrip() + if line.startswith('::'): line = line[2:].lstrip() + return External_Name_List(line), + match = staticmethod(match) + def init(self, names): + self.names = names + return + def tostr(self): return 'EXTERNAL :: %s' % (self.names) + def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.names) -class Procedure_Declaration_Stmt(Base): # R1211 +class Procedure_Declaration_Stmt(StmtBase): # R1211 """ <procedure-declaration-stmt> = PROCEDURE ( [ <proc-interface> ] ) [ [ , <proc-attr-spec> ]... :: ] <proc-decl-list> """ @@ -4061,7 +5117,7 @@ class Interface_Name(Base): # R1215 """ subclass_names = ['Name'] -class Intrinsic_Stmt(Base): # R1216 +class Intrinsic_Stmt(StmtBase): # R1216 """ <intrinsic-stmt> = INTRINSIC [ :: ] <intrinsic-procedure-name-list> """ @@ -4078,12 +5134,30 @@ class Function_Reference(CallBase): # R1217 return CallBase.match(Procedure_Designator, Actual_Arg_Spec_List, string) match = staticmethod(match) -class Call_Stmt(Base): # R1218 +class Call_Stmt(StmtBase): # R1218 """ <call-stmt> = CALL <procedure-designator> [ ( [ <actual-arg-spec-list> ] ) ] """ subclass_names = [] use_names = ['Procedure_Designator', 'Actual_Arg_Spec_List'] + def match(string): + if string[:4].upper()!='CALL': return + line, repmap = string_replace_map(string[4:].lstrip()) + if line.endswith(')'): + i = line.rfind('(') + if i==-1: return + args = repmap(line[i+1:-1].strip()) + if args: + return Procedure_Designator(repmap(line[:i].rstrip())),Actual_Arg_Spec_List(args) + return Procedure_Designator(repmap(line[:i].rstrip())),None + return Procedure_Designator(string[4:].lstrip()),None + match = staticmethod(match) + def init(self, *args): + self.designator, self.args = args + def tostr(self): + if self.args is None: return 'CALL %s' % (self.designator) + return 'CALL %s(%s)' % (self.designator, self.args) + def torepr(self): return '%s(%r, %r)' % (self.__class__.__name__, self.designator, self.args) class Procedure_Designator(BinaryOpBase): # R1219 """ @@ -4104,7 +5178,7 @@ class Actual_Arg_Spec(KeywordValueBase): # R1220 """ subclass_names = ['Actual_Arg'] use_names = ['Keyword'] - def match(string): return KeywordValueBase.match(Actual_Arg, string) + def match(string): return KeywordValueBase.match(Keyword, Actual_Arg, string) match = staticmethod(match) class Actual_Arg(Base): # R1221 @@ -4150,7 +5224,7 @@ class Function_Subprogram(BlockBase): # R1223 return BlockBase.match(Function_Stmt, [Specification_Part, Execution_Part, Internal_Subprogram_Part], End_Function_Stmt, reader) match = staticmethod(match) -class Function_Stmt(Base): # R1224 +class Function_Stmt(StmtBase): # R1224 """ <function-stmt> = [ <prefix> ] FUNCTION <function-name> ( [ <dummy-arg-name-list> ] ) [ <suffix> ] """ @@ -4178,7 +5252,7 @@ class Prefix(SequenceBase): # R1227 def match(string): return SequenceBase.match(Prefix._separator, Prefix_Spec, string) match = staticmethod(match) -class Prefix_Spec(StringBase): # R1228 +class Prefix_Spec(STRINGBase): # R1228 """ <prefix-spec> = <declaration-type-spec> | RECURSIVE @@ -4187,13 +5261,7 @@ class Prefix_Spec(StringBase): # R1228 """ subclass_names = ['Declaration_Type_Spec'] def match(string): - if len(string)==9: - upper = string.upper() - if upper in ['RECURSIVE', 'ELEMENTAL']: return upper, - elif len(string)==4: - upper = string.upper() - if upper=='PURE': return upper, - return None + return STRINGBase.match(['RECURSIVE', 'PURE', 'ELEMENTAL'], string) match = staticmethod(match) class Suffix(Base): # R1229 @@ -4210,8 +5278,7 @@ class End_Function_Stmt(EndStmtBase): # R1230 """ subclass_names = [] use_names = ['Function_Name'] - def match(string): - return EndStmtBase.match('FUNCTION',Function_Name, string) + def match(string): return EndStmtBase.match('FUNCTION',Function_Name, string) match = staticmethod(match) class Subroutine_Subprogram(BlockBase): # R1231 @@ -4229,7 +5296,7 @@ class Subroutine_Subprogram(BlockBase): # R1231 return BlockBase.match(Subroutine_Stmt, [Specification_Part, Execution_Part, Internal_Subprogram_Part], End_Subroutine_Stmt, reader) match = staticmethod(match) -class Subroutine_Stmt(Base): # R1232 +class Subroutine_Stmt(StmtBase): # R1232 """ <subroutine-stmt> = [ <prefix> ] SUBROUTINE <subroutine-name> [ ( [ <dummy-arg-list> ] ) [ <proc-language-binding-spec> ] ] """ @@ -4238,6 +5305,7 @@ class Subroutine_Stmt(Base): # R1232 def match(string): line, repmap = string_replace_map(string) m = pattern.subroutine.search(line) + if m is None: return prefix = line[:m.start()].rstrip() or None if prefix is not None: prefix = Prefix(repmap(prefix)) @@ -4282,9 +5350,7 @@ class Dummy_Arg(StringBase): # R1233 | * """ subclass_names = ['Dummy_Arg_Name'] - def match(string): - if string=='*': return '*', - return + def match(string): return StringBase.match('*', string) match = staticmethod(match) class End_Subroutine_Stmt(EndStmtBase): # R1234 @@ -4296,27 +5362,42 @@ class End_Subroutine_Stmt(EndStmtBase): # R1234 def match(string): return EndStmtBase.match('SUBROUTINE', Subroutine_Name, string) match = staticmethod(match) -class Entry_Stmt(Base): # R1235 +class Entry_Stmt(StmtBase): # R1235 """ <entry-stmt> = ENTRY <entry-name> [ ( [ <dummy-arg-list> ] ) [ <suffix> ] ] """ subclass_names = [] use_names = ['Entry_Name', 'Dummy_Arg_List', 'Suffix'] -class Return_Stmt(Base): # R1236 +class Return_Stmt(StmtBase): # R1236 """ <return-stmt> = RETURN [ <scalar-int-expr> ] """ subclass_names = [] use_names = ['Scalar_Int_Expr'] + def match(string): + start = string[:6].upper() + if start!='RETURN': return + if len(string)==6: return None, + return Scalar_Int_Expr(string[6:].lstrip()), + match = staticmethod(match) + def init(self, value): + self.value = value + return + def tostr(self): + if self.value is None: return 'RETURN' + return 'RETURN %s' % (self.value) + def torepr(self): return '%s(%r)' % (self.__class__.__name__, self.value) -class Contains_Stmt(Base): # R1237 +class Contains_Stmt(StmtBase, STRINGBase): # R1237 """ <contains-stmt> = CONTAINS """ subclass_names = [] + def match(string): return STRINGBase.match('CONTAINS',string) + match = staticmethod(match) -class Stmt_Function_Stmt(Base): # R1238 +class Stmt_Function_Stmt(StmtBase): # R1238 """ <stmt-function-stmt> = <function-name> ( [ <dummy-arg-name-list> ] ) = Scalar_Expr """ diff --git a/numpy/f2py/lib/parser/api.py b/numpy/f2py/lib/parser/api.py index bc99f94d7..476c142e5 100644 --- a/numpy/f2py/lib/parser/api.py +++ b/numpy/f2py/lib/parser/api.py @@ -11,6 +11,7 @@ Created: Oct 2006 ----- """ +import Fortran2003 # import all Statement classes: from base_classes import EndStatement from block_statements import * @@ -64,6 +65,7 @@ def parse(input, isfree=None, isstrict=None, include_dirs = None): Default contains current working directory and the directory of file name. """ + from parsefortran import FortranParser reader = get_reader(input, isfree, isstrict, include_dirs) parser = FortranParser(reader) parser.parse() diff --git a/numpy/f2py/lib/parser/base_classes.py b/numpy/f2py/lib/parser/base_classes.py index 4274d587d..b2fa3511c 100644 --- a/numpy/f2py/lib/parser/base_classes.py +++ b/numpy/f2py/lib/parser/base_classes.py @@ -399,7 +399,7 @@ class Variable: self.rank = len(array_spec) if self.is_deferred_shape_array(): # a(:,:) pass - elif self.is_explict_shape_array(self): + elif self.is_explicit_shape_array(): shape = [] for spec in array_spec: if len(spec)==1: diff --git a/numpy/f2py/lib/parser/pattern_tools.py b/numpy/f2py/lib/parser/pattern_tools.py index caf1ffc7f..c90e68401 100644 --- a/numpy/f2py/lib/parser/pattern_tools.py +++ b/numpy/f2py/lib/parser/pattern_tools.py @@ -47,18 +47,19 @@ class Pattern: '=': '[=]' } - def __init__(self, label, pattern, optional=0, flags=0): + def __init__(self, label, pattern, optional=0, flags=0, value=None): self.label = label self.pattern = pattern self.optional = optional self._flags = flags + self.value = value return def flags(self, *flags): f = self._flags for f1 in flags: f = f | f1 - return Pattern(self.label, self.pattern, optional=self.optional, flags=f) + return Pattern(self.label, self.pattern, optional=self.optional, flags=f, value=self.value) def get_compiled(self): try: @@ -83,6 +84,7 @@ class Pattern: compiled = self.get_compiled() t = compiled.split(string) if len(t) < 3: return + if '' in t[1:-1]: return rhs = t[-1].strip() pattern_match = t[-2].strip() assert abs(self).match(pattern_match),`self,string,t,pattern_match` @@ -106,7 +108,7 @@ class Pattern: return lhs, pattern_match, rhs def __abs__(self): - return Pattern(self.label, r'\A' + self.pattern+ r'\Z',flags=self._flags) + return Pattern(self.label, r'\A' + self.pattern+ r'\Z',flags=self._flags, value=self.value) def __repr__(self): return '%s(%r, %r)' % (self.__class__.__name__, self.label, self.pattern) @@ -178,16 +180,17 @@ class Pattern: else: label = '<%s>' % (name) pattern = '(?P%s%s)' % (label.replace('-','_'), self.pattern) - return Pattern(label, pattern, flags=self._flags) + return Pattern(label, pattern, flags=self._flags, value= self.value) def rename(self, label): if label[0]+label[-1]!='<>': label = '<%s>' % (label) - return Pattern(label, self.pattern, optional=self.optional, flags=self._flags) + return Pattern(label, self.pattern, optional=self.optional, flags=self._flags, value=self.value) def __call__(self, string): m = self.match(string) if m is None: return + if self.value is not None: return self.value return m.group() # Predefined patterns @@ -259,7 +262,7 @@ data_ref = part_ref + ~~~(r'[%]' + part_ref) primary = constant | name | data_ref | (r'[(]' + name + r'[)]') power_op = Pattern('<power-op>','[*]{2}') -mult_op = Pattern('<mult-op>','[*/]') +mult_op = Pattern('<mult-op>',r'[/*]') add_op = Pattern('<add-op>',r'[+-]') concat_op = Pattern('<concat-op>',r'[/]{2}') rel_op = Pattern('<rel-op>','[.]EQ[.]|[.]NE[.]|[.]LT[.]|[.]LE[.]|[.]GT[.]|[.]GE[.]|[=]{2}|/[=]|[<][=]|[<]|[>][=]|[>]',flags=re.I) @@ -311,10 +314,17 @@ abs_hex_constant = abs(hex_constant) intrinsic_type_name = Pattern('<intrinsic-type-name>',r'(INTEGER|REAL|COMPLEX|LOGICAL|CHARACTER|DOUBLE\s*COMPLEX|DOUBLE\s*PRECISION|BYTE)',flags=re.I) abs_intrinsic_type_name = abs(intrinsic_type_name) +double_complex_name = Pattern('<double-complex-name>','DOUBLE\s*COMPLEX', flags=re.I, value='DOUBLE COMPLEX') +double_precision_name = Pattern('<double-precision-name>','DOUBLE\s*PRECISION', flags=re.I, value='DOUBLE PRECISION') +abs_double_complex_name = abs(double_complex_name) +abs_double_precision_name = abs(double_precision_name) access_spec = Pattern('<access-spec>',r'PUBLIC|PRIVATE',flags=re.I) abs_access_spec = abs(access_spec) +implicit_none = Pattern('<implicit-none>',r'IMPLICIT\s*NONE',flags=re.I, value='IMPLICIT NONE') +abs_implicit_none = abs(implicit_none) + attr_spec = Pattern('<attr-spec>',r'ALLOCATABLE|ASYNCHRONOUS|EXTERNAL|INTENT|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|SAVE|TARGET|VALUE|VOLATILE',flags=re.I) abs_attr_spec = abs(attr_spec) diff --git a/numpy/f2py/lib/parser/test_Fortran2003.py b/numpy/f2py/lib/parser/test_Fortran2003.py index e8bd0859c..43bee8d4e 100644 --- a/numpy/f2py/lib/parser/test_Fortran2003.py +++ b/numpy/f2py/lib/parser/test_Fortran2003.py @@ -3,7 +3,11 @@ from numpy.testing import * from Fortran2003 import * from api import get_reader -class test_Program(NumpyTestCase): +############################################################################### +############################### SECTION 2 #################################### +############################################################################### + +class test_Program(NumpyTestCase): # R201 def check_simple(self): reader = get_reader('''\ @@ -14,22 +18,821 @@ class test_Program(NumpyTestCase): ''') cls = Program a = cls(reader) - print a + assert isinstance(a, cls),`a` + assert_equal(str(a), 'SUBROUTINE foo\nEND SUBROUTINE foo\nSUBROUTINE bar\nEND SUBROUTINE bar') -class test_Declaration_Type_Spec(NumpyTestCase): +class test_Specification_Part(NumpyTestCase): # R204 def check_simple(self): - cls = Declaration_Type_Spec + from api import get_reader + reader = get_reader('''\ + integer a''') + cls = Specification_Part + a = cls(reader) + assert isinstance(a, cls),`a` + assert_equal(str(a),'INTEGER :: a') + assert_equal(repr(a), "Specification_Part(Type_Declaration_Stmt(Intrinsic_Type_Spec('INTEGER', None), None, Entity_Decl(Name('a'), None, None, None)))") + +############################################################################### +############################### SECTION 3 #################################### +############################################################################### + +class test_Name(NumpyTestCase): # R304 + + def check_name(self): + a = Name('a') + assert isinstance(a,Name),`a` + a = Name('a2') + assert isinstance(a,Name),`a` + a = Designator('a') + assert isinstance(a,Name),`a` + a = Constant('a') + assert isinstance(a,Name),`a` + a = Expr('a') + assert isinstance(a,Name),`a` + +############################################################################### +############################### SECTION 4 #################################### +############################################################################### + +class test_Type_Param_Value(NumpyTestCase): # 402 + + def check_type_param_value(self): + cls = Type_Param_Value + a = cls('*') + assert isinstance(a,cls),`a` + assert_equal(str(a),'*') + assert_equal(repr(a),"Type_Param_Value('*')") + + a = cls(':') + assert isinstance(a,cls),`a` + assert_equal(str(a),':') + + a = cls('1+2') + assert isinstance(a,Level_2_Expr),`a` + assert_equal(str(a),'1 + 2') + +class test_Intrinsic_Type_Spec(NumpyTestCase): # R403 + + def check_intrinsic_type_spec(self): + cls = Intrinsic_Type_Spec + a = cls('INTEGER') + assert isinstance(a,cls),`a` + assert_equal(str(a),'INTEGER') + assert_equal(repr(a), "Intrinsic_Type_Spec('INTEGER', None)") + a = cls('Integer*2') - assert isinstance(a, Intrinsic_Type_Spec),`a` - assert_equal(str(a), 'INTEGER*2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'INTEGER*2') + + a = cls('real*2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'REAL*2') + + a = cls('logical*2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'LOGICAL*2') + + a = cls('complex*2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'COMPLEX*2') + + a = cls('character*2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'CHARACTER*2') + + a = cls('double complex') + assert isinstance(a,cls),`a` + assert_equal(str(a),'DOUBLE COMPLEX') + + a = cls('double precision') + assert isinstance(a,cls),`a` + assert_equal(str(a),'DOUBLE PRECISION') + +class test_Kind_Selector(NumpyTestCase): # R404 + + def check_kind_selector(self): + cls = Kind_Selector + a = cls('(1)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(KIND = 1)') + assert_equal(repr(a),"Kind_Selector('(', Int_Literal_Constant('1', None), ')')") + + a = cls('(kind=1+2)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(KIND = 1 + 2)') + + a = cls('* 1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'*1') + +class test_Signed_Int_Literal_Constant(NumpyTestCase): # R405 + + def check_int_literal_constant(self): + cls = Signed_Int_Literal_Constant + a = cls('1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1') + assert_equal(repr(a),"%s('1', None)" % (cls.__name__)) + + a = cls('+ 21_2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+ 21_2') + assert_equal(repr(a),"%s('+ 21', '2')" % (cls.__name__)) + + a = cls('-21_SHORT') + assert isinstance(a,cls),`a` + assert_equal(str(a),'-21_SHORT') + + a = cls('21_short') + assert isinstance(a,cls),`a` + assert_equal(str(a),'21_short') + + a = cls('+1976354279568241_8') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+1976354279568241_8') + +class test_Int_Literal_Constant(NumpyTestCase): # R406 + + def check_int_literal_constant(self): + cls = Int_Literal_Constant + a = cls('1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1') + assert_equal(repr(a),"%s('1', None)" % (cls.__name__)) + + a = cls('21_2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'21_2') + assert_equal(repr(a),"%s('21', '2')" % (cls.__name__)) + + a = cls('21_SHORT') + assert isinstance(a,cls),`a` + assert_equal(str(a),'21_SHORT') + + a = cls('21_short') + assert isinstance(a,cls),`a` + assert_equal(str(a),'21_short') + + a = cls('1976354279568241_8') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1976354279568241_8') + +class test_Binary_Constant(NumpyTestCase): # R412 + + def check_boz_literal_constant(self): + cls = Boz_Literal_Constant + bcls = Binary_Constant + a = cls('B"01"') + assert isinstance(a,bcls),`a` + assert_equal(str(a),'B"01"') + assert_equal(repr(a),"%s('B\"01\"')" % (bcls.__name__)) + +class test_Octal_Constant(NumpyTestCase): # R413 + + def check_boz_literal_constant(self): + cls = Boz_Literal_Constant + ocls = Octal_Constant + a = cls('O"017"') + assert isinstance(a,ocls),`a` + assert_equal(str(a),'O"017"') + assert_equal(repr(a),"%s('O\"017\"')" % (ocls.__name__)) + +class test_Hex_Constant(NumpyTestCase): # R414 + + def check_boz_literal_constant(self): + cls = Boz_Literal_Constant + zcls = Hex_Constant + a = cls('Z"01A"') + assert isinstance(a,zcls),`a` + assert_equal(str(a),'Z"01A"') + assert_equal(repr(a),"%s('Z\"01A\"')" % (zcls.__name__)) + +class test_Signed_Real_Literal_Constant(NumpyTestCase): # R416 + + def check_signed_real_literal_constant(self): + cls = Signed_Real_Literal_Constant + a = cls('12.78') + assert isinstance(a,cls),`a` + assert_equal(str(a),'12.78') + assert_equal(repr(a),"%s('12.78', None)" % (cls.__name__)) + + a = cls('+12.78_8') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+12.78_8') + assert_equal(repr(a),"%s('+12.78', '8')" % (cls.__name__)) + + a = cls('- 12.') + assert isinstance(a,cls),`a` + assert_equal(str(a),'- 12.') + + a = cls('1.6E3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E3') + + a = cls('+1.6E3_8') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+1.6E3_8') + + a = cls('1.6D3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6D3') + + a = cls('-1.6E-3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'-1.6E-3') + a = cls('1.6E+3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E+3') + + a = cls('3E4') + assert isinstance(a,cls),`a` + assert_equal(str(a),'3E4') + + a = cls('.123') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.123') + + a = cls('+1.6E-3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+1.6E-3') + + a = cls('10.9E7_QUAD') + assert isinstance(a,cls),`a` + assert_equal(str(a),'10.9E7_QUAD') + + a = cls('-10.9e-17_quad') + assert isinstance(a,cls),`a` + assert_equal(str(a),'-10.9E-17_quad') + +class test_Real_Literal_Constant(NumpyTestCase): # R417 + + def check_real_literal_constant(self): + cls = Real_Literal_Constant + a = cls('12.78') + assert isinstance(a,cls),`a` + assert_equal(str(a),'12.78') + assert_equal(repr(a),"%s('12.78', None)" % (cls.__name__)) + + a = cls('12.78_8') + assert isinstance(a,cls),`a` + assert_equal(str(a),'12.78_8') + assert_equal(repr(a),"%s('12.78', '8')" % (cls.__name__)) + + a = cls('12.') + assert isinstance(a,cls),`a` + assert_equal(str(a),'12.') + + a = cls('1.6E3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E3') + + a = cls('1.6E3_8') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E3_8') + + a = cls('1.6D3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6D3') + + a = cls('1.6E-3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E-3') + a = cls('1.6E+3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E+3') + + a = cls('3E4') + assert isinstance(a,cls),`a` + assert_equal(str(a),'3E4') + + a = cls('.123') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.123') + + a = cls('1.6E-3') + assert isinstance(a,cls),`a` + assert_equal(str(a),'1.6E-3') + + a = cls('10.9E7_QUAD') + assert isinstance(a,cls),`a` + assert_equal(str(a),'10.9E7_QUAD') + + a = cls('10.9e-17_quad') + assert isinstance(a,cls),`a` + assert_equal(str(a),'10.9E-17_quad') + + a = cls('0.0D+0') + assert isinstance(a,cls),`a` + assert_equal(str(a),'0.0D+0') - a = cls('type(foo)') +class test_Char_Selector(NumpyTestCase): # R424 + + def check_char_selector(self): + cls = Char_Selector + a = cls('(len=2, kind=8)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(LEN = 2, KIND = 8)') + assert_equal(repr(a),"Char_Selector(Int_Literal_Constant('2', None), Int_Literal_Constant('8', None))") + + + a = cls('(2, kind=8)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(LEN = 2, KIND = 8)') + + a = cls('(2, 8)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(LEN = 2, KIND = 8)') + + a = cls('(kind=8)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(KIND = 8)') + + a = cls('(kind=8,len=2)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(LEN = 2, KIND = 8)') + +class test_Complex_Literal_Constant(NumpyTestCase): # R421 + + def check_complex_literal_constant(self): + cls = Complex_Literal_Constant + a = cls('(1.0, -1.0)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(1.0, -1.0)') + assert_equal(repr(a),"Complex_Literal_Constant(Signed_Real_Literal_Constant('1.0', None), Signed_Real_Literal_Constant('-1.0', None))") + + a = cls('(3,3.1E6)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(3, 3.1E6)') + + a = cls('(4.0_4, 3.6E7_8)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(4.0_4, 3.6E7_8)') + + a = cls('( 0., PI)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(0., PI)') + + +class test_Type_Name(NumpyTestCase): # C424 + + def check_simple(self): + cls = Type_Name + a = cls('a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a') + assert_equal(repr(a),"Type_Name('a')") + + self.assertRaises(NoMatchError,cls,'integer') + self.assertRaises(NoMatchError,cls,'doubleprecision') + +class test_Length_Selector(NumpyTestCase): # R425 + + def check_length_selector(self): + cls = Length_Selector + a = cls('( len = *)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(LEN = *)') + assert_equal(repr(a),"Length_Selector('(', Type_Param_Value('*'), ')')") + + a = cls('*2,') + assert isinstance(a,cls),`a` + assert_equal(str(a),'*2') + +class test_Char_Length(NumpyTestCase): # R426 + + def check_char_length(self): + cls = Char_Length + a = cls('(1)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(1)') + assert_equal(repr(a),"Char_Length('(', Int_Literal_Constant('1', None), ')')") + + a = cls('1') + assert isinstance(a,Int_Literal_Constant),`a` + assert_equal(str(a),'1') + + a = cls('(*)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(*)') + + a = cls('(:)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(:)') + +class test_Char_Literal_Constant(NumpyTestCase): # R427 + + def check_char_literal_constant(self): + cls = Char_Literal_Constant + a = cls('NIH_"DO"') + assert isinstance(a,cls),`a` + assert_equal(str(a),'NIH_"DO"') + assert_equal(repr(a),'Char_Literal_Constant(\'"DO"\', \'NIH\')') + + a = cls("'DO'") + assert isinstance(a,cls),`a` + assert_equal(str(a),"'DO'") + assert_equal(repr(a),'Char_Literal_Constant("\'DO\'", None)') + + a = cls("'DON''T'") + assert isinstance(a,cls),`a` + assert_equal(str(a),"'DON''T'") + + a = cls('"DON\'T"') + assert isinstance(a,cls),`a` + assert_equal(str(a),'"DON\'T"') + + a = cls('""') + assert isinstance(a,cls),`a` + assert_equal(str(a),'""') + + a = cls("''") + assert isinstance(a,cls),`a` + assert_equal(str(a),"''") + + a = cls('"hey ha(ada)\t"') + assert isinstance(a,cls),`a` + assert_equal(str(a),'"hey ha(ada)\t"') + +class test_Logical_Literal_Constant(NumpyTestCase): # R428 + + def check_logical_literal_constant(self): + cls = Logical_Literal_Constant + a = cls('.TRUE.') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.TRUE.') + assert_equal(repr(a),"%s('.TRUE.', None)" % (cls.__name__)) + + a = cls('.True.') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.TRUE.') + + a = cls('.FALSE.') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.FALSE.') + + a = cls('.TRUE._HA') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.TRUE._HA') + +class test_Derived_Type_Stmt(NumpyTestCase): # R430 + + def check_simple(self): + cls = Derived_Type_Stmt + a = cls('type a') assert isinstance(a, cls),`a` - assert_equal(str(a), 'TYPE(foo)') - assert_equal(repr(a), "Declaration_Type_Spec('TYPE', Type_Name('foo'))") + assert_equal(str(a),'TYPE :: a') + assert_equal(repr(a),"Derived_Type_Stmt(None, Type_Name('a'), None)") + + a = cls('type ::a(b,c)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'TYPE :: a(b, c)') + + a = cls('type, private, abstract::a(b,c)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'TYPE, PRIVATE, ABSTRACT :: a(b, c)') -class test_Type_Declaration_Stmt(NumpyTestCase): +class test_Type_Name(NumpyTestCase): # C423 + + def check_simple(self): + cls = Type_Name + a = cls('a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a') + assert_equal(repr(a),"Type_Name('a')") + +class test_Type_Attr_Spec(NumpyTestCase): # R431 + + def check_simple(self): + cls = Type_Attr_Spec + a = cls('abstract') + assert isinstance(a, cls),`a` + assert_equal(str(a),'ABSTRACT') + assert_equal(repr(a),"Type_Attr_Spec('ABSTRACT', None)") + + a = cls('bind (c )') + assert isinstance(a, cls),`a` + assert_equal(str(a),'BIND(C)') + + a = cls('extends(a)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'EXTENDS(a)') + + a = cls('private') + assert isinstance(a, Access_Spec),`a` + assert_equal(str(a),'PRIVATE') + + +class test_End_Type_Stmt(NumpyTestCase): # R433 + + def check_simple(self): + cls = End_Type_Stmt + a = cls('end type') + assert isinstance(a, cls),`a` + assert_equal(str(a),'END TYPE') + assert_equal(repr(a),"End_Type_Stmt('TYPE', None)") + + a = cls('end type a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'END TYPE a') + +class test_Sequence_Stmt(NumpyTestCase): # R434 + + def check_simple(self): + cls = Sequence_Stmt + a = cls('sequence') + assert isinstance(a, cls),`a` + assert_equal(str(a),'SEQUENCE') + assert_equal(repr(a),"Sequence_Stmt('SEQUENCE')") + +class test_Type_Param_Def_Stmt(NumpyTestCase): # R435 + + def check_simple(self): + cls = Type_Param_Def_Stmt + a = cls('integer ,kind :: a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'INTEGER, KIND :: a') + assert_equal(repr(a),"Type_Param_Def_Stmt(None, Type_Param_Attr_Spec('KIND'), Name('a'))") + + a = cls('integer*2 ,len :: a=3, b=2+c') + assert isinstance(a, cls),`a` + assert_equal(str(a),'INTEGER*2, LEN :: a = 3, b = 2 + c') + +class test_Type_Param_Decl(NumpyTestCase): # R436 + + def check_simple(self): + cls = Type_Param_Decl + a = cls('a=2') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a = 2') + assert_equal(repr(a),"Type_Param_Decl(Name('a'), '=', Int_Literal_Constant('2', None))") + + a = cls('a') + assert isinstance(a, Name),`a` + assert_equal(str(a),'a') + +class test_Type_Param_Attr_Spec(NumpyTestCase): # R437 + + def check_simple(self): + cls = Type_Param_Attr_Spec + a = cls('kind') + assert isinstance(a, cls),`a` + assert_equal(str(a),'KIND') + assert_equal(repr(a),"Type_Param_Attr_Spec('KIND')") + + a = cls('len') + assert isinstance(a, cls),`a` + assert_equal(str(a),'LEN') + +class test_Component_Attr_Spec(NumpyTestCase): # R441 + + def check_simple(self): + cls = Component_Attr_Spec + a = cls('pointer') + assert isinstance(a, cls),`a` + assert_equal(str(a),'POINTER') + assert_equal(repr(a),"Component_Attr_Spec('POINTER')") + + a = cls('allocatable') + assert isinstance(a, cls),`a` + assert_equal(str(a),'ALLOCATABLE') + + a = cls('dimension(a)') + assert isinstance(a, Dimension_Component_Attr_Spec),`a` + assert_equal(str(a),'DIMENSION(a)') + + a = cls('private') + assert isinstance(a, Access_Spec),`a` + assert_equal(str(a),'PRIVATE') + +class test_Component_Decl(NumpyTestCase): # R442 + + def check_simple(self): + cls = Component_Decl + a = cls('a(1)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1)') + assert_equal(repr(a),"Component_Decl(Name('a'), Explicit_Shape_Spec(None, Int_Literal_Constant('1', None)), None, None)") + + a = cls('a(1)*(3)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1)*(3)') + + a = cls('a(1)*(3) = 2') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1)*(3) = 2') + + a = cls('a(1) => NULL') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1) => NULL') + +class test_Derived_Type_Spec(NumpyTestCase): # R455 + + def check_simple(self): + cls = Derived_Type_Spec + a = cls('a(b)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a(b)') + assert_equal(repr(a),"Derived_Type_Spec(Type_Name('a'), Name('b'))") + + a = cls('a(b,c,g=1)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a(b, c, g = 1)') + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + + a = cls('a()') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a()') + +class test_Type_Param_Spec(NumpyTestCase): # R456 + + def check_type_param_spec(self): + cls = Type_Param_Spec + a = cls('a=1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a = 1') + assert_equal(repr(a),"Type_Param_Spec(Name('a'), Int_Literal_Constant('1', None))") + + a = cls('k=a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a') + + a = cls('k=:') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = :') + +class test_Type_Param_Spec_List(NumpyTestCase): # R456-list + + def check_type_param_spec_list(self): + cls = Type_Param_Spec_List + + a = cls('a,b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a, b') + assert_equal(repr(a),"Type_Param_Spec_List(',', (Name('a'), Name('b')))") + + a = cls('a') + assert isinstance(a,Name),`a` + + a = cls('k=a,c,g=1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a, c, g = 1') + +class test_Structure_Constructor_2(NumpyTestCase): # R457.b + + def check_simple(self): + cls = Structure_Constructor_2 + a = cls('k=a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a') + assert_equal(repr(a),"Structure_Constructor_2(Name('k'), Name('a'))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + +class test_Structure_Constructor(NumpyTestCase): # R457 + + def check_structure_constructor(self): + cls = Structure_Constructor + a = cls('t()') + assert isinstance(a,cls),`a` + assert_equal(str(a),'t()') + assert_equal(repr(a),"Structure_Constructor(Type_Name('t'), None)") + + a = cls('t(s=1, a)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'t(s = 1, a)') + + a = cls('a=k') + assert isinstance(a,Structure_Constructor_2),`a` + assert_equal(str(a),'a = k') + assert_equal(repr(a),"Structure_Constructor_2(Name('a'), Name('k'))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + +class test_Component_Spec(NumpyTestCase): # R458 + + def check_simple(self): + cls = Component_Spec + a = cls('k=a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a') + assert_equal(repr(a),"Component_Spec(Name('k'), Name('a'))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + + a = cls('a % b') + assert isinstance(a, Proc_Component_Ref),`a` + assert_equal(str(a),'a % b') + + a = cls('s =a % b') + assert isinstance(a, Component_Spec),`a` + assert_equal(str(a),'s = a % b') + +class test_Component_Spec_List(NumpyTestCase): # R458-list + + def check_simple(self): + cls = Component_Spec_List + a = cls('k=a, b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a, b') + assert_equal(repr(a),"Component_Spec_List(',', (Component_Spec(Name('k'), Name('a')), Name('b')))") + + a = cls('k=a, c') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a, c') + +class test_Array_Constructor(NumpyTestCase): # R465 + + def check_simple(self): + cls = Array_Constructor + a = cls('(/a/)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(/a/)') + assert_equal(repr(a),"Array_Constructor('(/', Name('a'), '/)')") + + a = cls('[a]') + assert isinstance(a,cls),`a` + assert_equal(str(a),'[a]') + assert_equal(repr(a),"Array_Constructor('[', Name('a'), ']')") + + a = cls('[integer::a]') + assert isinstance(a,cls),`a` + assert_equal(str(a),'[INTEGER :: a]') + + a = cls('[integer::a,b]') + assert isinstance(a,cls),`a` + assert_equal(str(a),'[INTEGER :: a, b]') + +class test_Ac_Spec(NumpyTestCase): # R466 + + def check_ac_spec(self): + cls = Ac_Spec + a = cls('integer ::') + assert isinstance(a,cls),`a` + assert_equal(str(a),'INTEGER ::') + assert_equal(repr(a),"Ac_Spec(Intrinsic_Type_Spec('INTEGER', None), None)") + + a = cls('integer :: a,b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'INTEGER :: a, b') + + a = cls('a,b') + assert isinstance(a,Ac_Value_List),`a` + assert_equal(str(a),'a, b') + + a = cls('integer :: a, (a, b, n = 1, 5)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'INTEGER :: a, (a, b, n = 1, 5)') + +class test_Ac_Value_List(NumpyTestCase): # R469-list + + def check_ac_value_list(self): + cls = Ac_Value_List + a = cls('a, b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a, b') + assert_equal(repr(a),"Ac_Value_List(',', (Name('a'), Name('b')))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + +class test_Ac_Implied_Do(NumpyTestCase): # R470 + + def check_ac_implied_do(self): + cls = Ac_Implied_Do + a = cls('( a, b, n = 1, 5 )') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(a, b, n = 1, 5)') + assert_equal(repr(a),"Ac_Implied_Do(Ac_Value_List(',', (Name('a'), Name('b'))), Ac_Implied_Do_Control(Name('n'), [Int_Literal_Constant('1', None), Int_Literal_Constant('5', None)]))") + +class test_Ac_Implied_Do_Control(NumpyTestCase): # R471 + + def check_ac_implied_do_control(self): + cls = Ac_Implied_Do_Control + a = cls('n = 3, 5') + assert isinstance(a,cls),`a` + assert_equal(str(a),'n = 3, 5') + assert_equal(repr(a),"Ac_Implied_Do_Control(Name('n'), [Int_Literal_Constant('3', None), Int_Literal_Constant('5', None)])") + + a = cls('n = 3+1, 5, 1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'n = 3 + 1, 5, 1') + +############################################################################### +############################### SECTION 5 #################################### +############################################################################### + +class test_Type_Declaration_Stmt(NumpyTestCase): # R501 def check_simple(self): cls = Type_Declaration_Stmt @@ -42,20 +845,31 @@ class test_Type_Declaration_Stmt(NumpyTestCase): assert isinstance(a, cls),`a` assert_equal(str(a), 'INTEGER, DIMENSION(2) :: a*3') -class test_Access_Spec(NumpyTestCase): + a = cls('real a') + assert isinstance(a, cls),`a` + assert_equal(str(a), 'REAL :: a') + assert_equal(repr(a), "Type_Declaration_Stmt(Intrinsic_Type_Spec('REAL', None), None, Entity_Decl(Name('a'), None, None, None))") - def check_simple(self): - cls = Access_Spec - a = cls('private') + a = cls('REAL A( LDA, * ), B( LDB, * )') assert isinstance(a, cls),`a` - assert_equal(str(a), 'PRIVATE') - assert_equal(repr(a), "Access_Spec('PRIVATE')") - a = cls('public') + a = cls('DOUBLE PRECISION ALPHA, BETA') assert isinstance(a, cls),`a` - assert_equal(str(a), 'PUBLIC') -class test_Attr_Spec(NumpyTestCase): +class test_Declaration_Type_Spec(NumpyTestCase): # R502 + + def check_simple(self): + cls = Declaration_Type_Spec + a = cls('Integer*2') + assert isinstance(a, Intrinsic_Type_Spec),`a` + assert_equal(str(a), 'INTEGER*2') + + a = cls('type(foo)') + assert isinstance(a, cls),`a` + assert_equal(str(a), 'TYPE(foo)') + assert_equal(repr(a), "Declaration_Type_Spec('TYPE', Type_Name('foo'))") + +class test_Attr_Spec(NumpyTestCase): # R503 def check_simple(self): cls = Attr_Spec @@ -67,16 +881,16 @@ class test_Attr_Spec(NumpyTestCase): assert isinstance(a, Dimension_Attr_Spec),`a` assert_equal(str(a),'DIMENSION(a)') -class test_Dimension_Attr_Spec(NumpyTestCase): +class test_Dimension_Attr_Spec(NumpyTestCase): # R503.d def check_simple(self): cls = Dimension_Attr_Spec a = cls('dimension(a)') assert isinstance(a, cls),`a` assert_equal(str(a),'DIMENSION(a)') - assert_equal(repr(a),"Dimension_Attr_Spec('DIMENSION', Name('a'))") + assert_equal(repr(a),"Dimension_Attr_Spec('DIMENSION', Explicit_Shape_Spec(None, Name('a')))") -class test_Intent_Attr_Spec(NumpyTestCase): +class test_Intent_Attr_Spec(NumpyTestCase): # R503.f def check_simple(self): cls = Intent_Attr_Spec @@ -85,7 +899,37 @@ class test_Intent_Attr_Spec(NumpyTestCase): assert_equal(str(a),'INTENT(IN)') assert_equal(repr(a),"Intent_Attr_Spec('INTENT', Intent_Spec('IN'))") -class test_Language_Binding_Spec(NumpyTestCase): +class test_Entity_Decl(NumpyTestCase): # 504 + + def check_simple(self): + cls = Entity_Decl + a = cls('a(1)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1)') + assert_equal(repr(a),"Entity_Decl(Name('a'), Explicit_Shape_Spec(None, Int_Literal_Constant('1', None)), None, None)") + + a = cls('a(1)*(3)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1)*(3)') + + a = cls('a(1)*(3) = 2') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(1)*(3) = 2') + +class test_Access_Spec(NumpyTestCase): # R508 + + def check_simple(self): + cls = Access_Spec + a = cls('private') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PRIVATE') + assert_equal(repr(a),"Access_Spec('PRIVATE')") + + a = cls('public') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PUBLIC') + +class test_Language_Binding_Spec(NumpyTestCase): # R509 def check_simple(self): cls = Language_Binding_Spec @@ -98,24 +942,953 @@ class test_Language_Binding_Spec(NumpyTestCase): assert isinstance(a, cls),`a` assert_equal(str(a),'BIND(C, NAME = "hey")') -class test_Entity_Decl(NumpyTestCase): +class test_Explicit_Shape_Spec(NumpyTestCase): # R511 def check_simple(self): - cls = Entity_Decl - a = cls('a(1)') + cls = Explicit_Shape_Spec + a = cls('a:b') assert isinstance(a, cls),`a` - assert_equal(str(a),'a(1)') - assert_equal(repr(a),"Entity_Decl(Name('a'), Int_Literal_Constant('1', None), None, None)") + assert_equal(str(a),'a : b') + assert_equal(repr(a),"Explicit_Shape_Spec(Name('a'), Name('b'))") - a = cls('a(1)*(3)') + a = cls('a') assert isinstance(a, cls),`a` - assert_equal(str(a),'a(1)*(3)') + assert_equal(str(a),'a') - a = cls('a(1)*(3) = 2') +class test_Upper_Bound(NumpyTestCase): # R513 + + def check_simple(self): + cls = Upper_Bound + a = cls('a') + assert isinstance(a, Name),`a` + assert_equal(str(a),'a') + + self.assertRaises(NoMatchError,cls,'*') + +class test_Assumed_Shape_Spec(NumpyTestCase): # R514 + + def check_simple(self): + cls = Assumed_Shape_Spec + a = cls(':') assert isinstance(a, cls),`a` - assert_equal(str(a),'a(1)*(3) = 2') + assert_equal(str(a),':') + assert_equal(repr(a),'Assumed_Shape_Spec(None, None)') + + a = cls('a :') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a :') + +class test_Deferred_Shape_Spec(NumpyTestCase): # R515 + + def check_simple(self): + cls = Deferred_Shape_Spec + a = cls(':') + assert isinstance(a, cls),`a` + assert_equal(str(a),':') + assert_equal(repr(a),'Deferred_Shape_Spec(None, None)') + + +class test_Assumed_Size_Spec(NumpyTestCase): # R516 + + def check_simple(self): + cls = Assumed_Size_Spec + a = cls('*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'*') + assert_equal(repr(a),'Assumed_Size_Spec(None, None)') + + a = cls('1:*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'1 : *') -class test_Prefix_Spec(NumpyTestCase): + a = cls('a,1:*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a, 1 : *') + + a = cls('a:b,1:*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a : b, 1 : *') + + +class test_Parameter_Stmt(NumpyTestCase): # R538 + + def check_simple(self): + cls = Parameter_Stmt + a = cls('parameter(a=1)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PARAMETER(a = 1)') + assert_equal(repr(a),"Parameter_Stmt('PARAMETER', Named_Constant_Def(Name('a'), Int_Literal_Constant('1', None)))") + + a = cls('parameter(a=1, b=a+2)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PARAMETER(a = 1, b = a + 2)') + + a = cls('PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PARAMETER(ONE = 1.0D+0, ZERO = 0.0D+0)') + +class test_Named_Constant_Def(NumpyTestCase): # R539 + + def check_simple(self): + cls = Named_Constant_Def + a = cls('a=1') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a = 1') + assert_equal(repr(a),"Named_Constant_Def(Name('a'), Int_Literal_Constant('1', None))") + +class test_Pointer_Decl(NumpyTestCase): # R541 + + def check_simple(self): + cls = Pointer_Decl + a = cls('a(:)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(:)') + assert_equal(repr(a),"Pointer_Decl(Name('a'), Deferred_Shape_Spec(None, None))") + + a = cls('a(:,:)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(:, :)') + +class test_Implicit_Stmt(NumpyTestCase): # R549 + + def check_simple(self): + cls = Implicit_Stmt + a = cls('implicitnone') + assert isinstance(a, cls),`a` + assert_equal(str(a),'IMPLICIT NONE') + assert_equal(repr(a),"Implicit_Stmt('IMPLICIT NONE', None)") + + a = cls('implicit real(a-d), double precision(r-t,x), type(a) (y-z)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'IMPLICIT REAL(A - D), DOUBLE PRECISION(R - T, X), TYPE(a)(Y - Z)') + +class test_Implicit_Spec(NumpyTestCase): # R550 + + def check_simple(self): + cls = Implicit_Spec + a = cls('integer (a-z)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'INTEGER(A - Z)') + assert_equal(repr(a),"Implicit_Spec(Intrinsic_Type_Spec('INTEGER', None), Letter_Spec('A', 'Z'))") + + a = cls('double complex (r,d-g)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'DOUBLE COMPLEX(R, D - G)') + +class test_Letter_Spec(NumpyTestCase): # R551 + + def check_simple(self): + cls = Letter_Spec + a = cls('a-z') + assert isinstance(a, cls),`a` + assert_equal(str(a),'A - Z') + assert_equal(repr(a),"Letter_Spec('A', 'Z')") + + a = cls('d') + assert isinstance(a, cls),`a` + assert_equal(str(a),'D') + +class test_Equivalence_Stmt(NumpyTestCase): # R554 + + def check_simple(self): + cls = Equivalence_Stmt + a = cls('equivalence (a, b ,z)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'EQUIVALENCE(a, b, z)') + assert_equal(repr(a),"Equivalence_Stmt('EQUIVALENCE', Equivalence_Set(Name('a'), Equivalence_Object_List(',', (Name('b'), Name('z')))))") + + a = cls('equivalence (a, b ,z),(b,l)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'EQUIVALENCE(a, b, z), (b, l)') + +class test_Common_Stmt(NumpyTestCase): # R557 + + def check_simple(self): + cls = Common_Stmt + a = cls('common a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'COMMON // a') + assert_equal(repr(a),"Common_Stmt([(None, Name('a'))])") + + a = cls('common // a,b') + assert isinstance(a, cls),`a` + assert_equal(str(a),'COMMON // a, b') + + a = cls('common /name/ a,b') + assert isinstance(a, cls),`a` + assert_equal(str(a),'COMMON /name/ a, b') + + a = cls('common /name/ a,b(4,5) // c, /ljuks/ g(2)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'COMMON /name/ a, b(4, 5) // c /ljuks/ g(2)') + +class test_Common_Block_Object(NumpyTestCase): # R558 + + def check_simple(self): + cls = Common_Block_Object + a = cls('a(2)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(2)') + assert_equal(repr(a),"Common_Block_Object(Name('a'), Explicit_Shape_Spec(None, Int_Literal_Constant('2', None)))") + + a = cls('a') + assert isinstance(a, Name),`a` + assert_equal(str(a),'a') + + +############################################################################### +############################### SECTION 6 #################################### +############################################################################### + +class test_Substring(NumpyTestCase): # R609 + + def check_simple(self): + cls = Substring + a = cls('a(:)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(:)') + assert_equal(repr(a),"Substring(Name('a'), Substring_Range(None, None))") + + a = cls('a(1:2)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a(1 : 2)') + assert_equal(repr(a),"Substring(Name('a'), Substring_Range(Int_Literal_Constant('1', None), Int_Literal_Constant('2', None)))") + + +class test_Substring_Range(NumpyTestCase): # R611 + + def check_simple(self): + cls = Substring_Range + a = cls(':') + assert isinstance(a, cls),`a` + assert_equal(str(a),':') + assert_equal(repr(a),"Substring_Range(None, None)") + + a = cls('a+1:') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a + 1 :') + + a = cls('a+1: c/foo(g)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a + 1 : c / foo(g)') + + a = cls('a:b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a : b') + assert_equal(repr(a),"Substring_Range(Name('a'), Name('b'))") + + a = cls('a:') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a :') + + a = cls(':b') + assert isinstance(a,cls),`a` + assert_equal(str(a),': b') + + +class test_Data_Ref(NumpyTestCase): # R612 + + def check_data_ref(self): + cls = Data_Ref + a = cls('a%b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a % b') + assert_equal(repr(a),"Data_Ref('%', (Name('a'), Name('b')))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + +class test_Part_Ref(NumpyTestCase): # R613 + + def check_part_ref(self): + cls = Part_Ref + a = cls('a') + assert isinstance(a, Name),`a` + assert_equal(str(a),'a') + +class test_Type_Param_Inquiry(NumpyTestCase): # R615 + + def check_simple(self): + cls = Type_Param_Inquiry + a = cls('a % b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a % b') + assert_equal(repr(a),"Type_Param_Inquiry(Name('a'), '%', Name('b'))") + + +class test_Array_Section(NumpyTestCase): # R617 + + def check_array_section(self): + cls = Array_Section + a = cls('a(:)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a(:)') + assert_equal(repr(a),"Array_Section(Name('a'), Substring_Range(None, None))") + + a = cls('a(2:)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a(2 :)') + + +class test_Section_Subscript(NumpyTestCase): # R619 + + def check_simple(self): + cls = Section_Subscript + + a = cls('1:2') + assert isinstance(a, Subscript_Triplet),`a` + assert_equal(str(a),'1 : 2') + + a = cls('zzz') + assert isinstance(a, Name),`a` + assert_equal(str(a),'zzz') + +class test_Section_Subscript_List(NumpyTestCase): # R619-list + + def check_simple(self): + cls = Section_Subscript_List + a = cls('a,2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a, 2') + assert_equal(repr(a),"Section_Subscript_List(',', (Name('a'), Int_Literal_Constant('2', None)))") + + a = cls('::1') + assert isinstance(a,Subscript_Triplet),`a` + assert_equal(str(a),': : 1') + + a = cls('::1, 3') + assert isinstance(a,cls),`a` + assert_equal(str(a),': : 1, 3') + +class test_Subscript_Triplet(NumpyTestCase): # R620 + + def check_simple(self): + cls = Subscript_Triplet + a = cls('a:b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a : b') + assert_equal(repr(a),"Subscript_Triplet(Name('a'), Name('b'), None)") + + a = cls('a:b:1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a : b : 1') + + a = cls(':') + assert isinstance(a,cls),`a` + assert_equal(str(a),':') + + a = cls('::5') + assert isinstance(a,cls),`a` + assert_equal(str(a),': : 5') + + a = cls(':5') + assert isinstance(a,cls),`a` + assert_equal(str(a),': 5') + + a = cls('a+1 :') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a + 1 :') + +class test_Alloc_Opt(NumpyTestCase): # R624 + + def check_simple(self): + cls = Alloc_Opt + a = cls('stat=a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'STAT = a') + assert_equal(repr(a),"Alloc_Opt('STAT', Name('a'))") + +class test_Nullify_Stmt(NumpyTestCase): # R633 + + def check_simple(self): + cls = Nullify_Stmt + a = cls('nullify (a)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'NULLIFY(a)') + assert_equal(repr(a),"Nullify_Stmt('NULLIFY', Name('a'))") + + a = cls('nullify (a,c)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'NULLIFY(a, c)') + +############################################################################### +############################### SECTION 7 #################################### +############################################################################### + +class test_Primary(NumpyTestCase): # R701 + + def check_simple(self): + cls = Primary + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + + a = cls('(a)') + assert isinstance(a,Parenthesis),`a` + assert_equal(str(a),'(a)') + + a = cls('1') + assert isinstance(a,Int_Literal_Constant),`a` + assert_equal(str(a),'1') + + a = cls('1.') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'1.') + + a = cls('(1, n)') + assert isinstance(a,Complex_Literal_Constant),`a` + assert_equal(str(a),'(1, n)') + + a = cls('.true.') + assert isinstance(a,Logical_Literal_Constant),`a` + assert_equal(str(a),'.TRUE.') + + a = cls('"hey a()c"') + assert isinstance(a,Char_Literal_Constant),`a` + assert_equal(str(a),'"hey a()c"') + + a = cls('b"0101"') + assert isinstance(a,Binary_Constant),`a` + assert_equal(str(a),'B"0101"') + + a = cls('o"0107"') + assert isinstance(a,Octal_Constant),`a` + assert_equal(str(a),'O"0107"') + + a = cls('z"a107"') + assert isinstance(a,Hex_Constant),`a` + assert_equal(str(a),'Z"A107"') + + a = cls('a % b') + assert isinstance(a,Data_Ref),`a` + assert_equal(str(a),'a % b') + + a = cls('a(:)') + assert isinstance(a,Array_Section),`a` + assert_equal(str(a),'a(:)') + + a = cls('0.0E-1') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'0.0E-1') + +class test_Parenthesis(NumpyTestCase): # R701.h + + def check_simple(self): + cls = Parenthesis + a = cls('(a)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(a)') + assert_equal(repr(a),"Parenthesis('(', Name('a'), ')')") + + a = cls('(a+1)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(a + 1)') + + a = cls('((a))') + assert isinstance(a,cls),`a` + assert_equal(str(a),'((a))') + + a = cls('(a+(a+c))') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(a + (a + c))') + +class test_Level_1_Expr(NumpyTestCase): # R702 + + def check_simple(self): + cls = Level_1_Expr + a = cls('.hey. a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.HEY. a') + assert_equal(repr(a),"Level_1_Expr('.HEY.', Name('a'))") + + self.assertRaises(NoMatchError,cls,'.not. a') + +class test_Mult_Operand(NumpyTestCase): # R704 + + def check_simple(self): + cls = Mult_Operand + a = cls('a**b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a ** b') + assert_equal(repr(a),"Mult_Operand(Name('a'), '**', Name('b'))") + + a = cls('a**2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a ** 2') + + a = cls('(a+b)**2') + assert isinstance(a,cls),`a` + assert_equal(str(a),'(a + b) ** 2') + + a = cls('0.0E-1') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'0.0E-1') + +class test_Add_Operand(NumpyTestCase): # R705 + + def check_simple(self): + cls = Add_Operand + a = cls('a*b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a * b') + assert_equal(repr(a),"Add_Operand(Name('a'), '*', Name('b'))") + + a = cls('a/b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a / b') + + a = cls('a**b') + assert isinstance(a,Mult_Operand),`a` + assert_equal(str(a),'a ** b') + + a = cls('0.0E-1') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'0.0E-1') + +class test_Level_2_Expr(NumpyTestCase): # R706 + + def check_simple(self): + cls = Level_2_Expr + a = cls('a+b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a + b') + assert_equal(repr(a),"Level_2_Expr(Name('a'), '+', Name('b'))") + + a = cls('a-b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a - b') + + a = cls('a+b+c') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a + b + c') + + a = cls('+a') + assert isinstance(a,Level_2_Unary_Expr),`a` + assert_equal(str(a),'+ a') + + a = cls('+1') + assert isinstance(a,Level_2_Unary_Expr),`a` + assert_equal(str(a),'+ 1') + + a = cls('+a+b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+ a + b') + + a = cls('0.0E-1') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'0.0E-1') + + +class test_Level_2_Unary_Expr(NumpyTestCase): + + def check_simple(self): + cls = Level_2_Unary_Expr + a = cls('+a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+ a') + assert_equal(repr(a),"Level_2_Unary_Expr('+', Name('a'))") + + a = cls('-a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'- a') + + a = cls('+1') + assert isinstance(a,cls),`a` + assert_equal(str(a),'+ 1') + + a = cls('0.0E-1') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'0.0E-1') + + +class test_Level_3_Expr(NumpyTestCase): # R710 + + def check_simple(self): + cls = Level_3_Expr + a = cls('a//b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a // b') + assert_equal(repr(a),"Level_3_Expr(Name('a'), '//', Name('b'))") + + a = cls('"a"//"b"') + assert isinstance(a,cls),`a` + assert_equal(str(a),'"a" // "b"') + +class test_Level_4_Expr(NumpyTestCase): # R712 + + def check_simple(self): + cls = Level_4_Expr + a = cls('a.eq.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .EQ. b') + assert_equal(repr(a),"Level_4_Expr(Name('a'), '.EQ.', Name('b'))") + + a = cls('a.ne.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .NE. b') + + a = cls('a.lt.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .LT. b') + + a = cls('a.gt.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .GT. b') + + a = cls('a.ge.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .GE. b') + + a = cls('a==b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a == b') + + a = cls('a/=b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a /= b') + + a = cls('a<b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a < b') + + a = cls('a<=b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a <= b') + + a = cls('a>=b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a >= b') + + a = cls('a>b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a > b') + +class test_And_Operand(NumpyTestCase): # R714 + + def check_simple(self): + cls = And_Operand + a = cls('.not.a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'.NOT. a') + assert_equal(repr(a),"And_Operand('.NOT.', Name('a'))") + +class test_Or_Operand(NumpyTestCase): # R715 + + def check_simple(self): + cls = Or_Operand + a = cls('a.and.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .AND. b') + assert_equal(repr(a),"Or_Operand(Name('a'), '.AND.', Name('b'))") + + +class test_Equiv_Operand(NumpyTestCase): # R716 + + def check_simple(self): + cls = Equiv_Operand + a = cls('a.or.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .OR. b') + assert_equal(repr(a),"Equiv_Operand(Name('a'), '.OR.', Name('b'))") + + +class test_Level_5_Expr(NumpyTestCase): # R717 + + def check_simple(self): + cls = Level_5_Expr + a = cls('a.eqv.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .EQV. b') + assert_equal(repr(a),"Level_5_Expr(Name('a'), '.EQV.', Name('b'))") + + a = cls('a.neqv.b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .NEQV. b') + + a = cls('a.eq.b') + assert isinstance(a,Level_4_Expr),`a` + assert_equal(str(a),'a .EQ. b') + +class test_Expr(NumpyTestCase): # R722 + + def check_simple(self): + cls = Expr + a = cls('a .op. b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a .OP. b') + assert_equal(repr(a),"Expr(Name('a'), '.OP.', Name('b'))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + + a = cls('3.e2') + assert isinstance(a,Real_Literal_Constant),`a` + + a = cls('0.0E-1') + assert isinstance(a,Real_Literal_Constant),`a` + assert_equal(str(a),'0.0E-1') + + self.assertRaises(NoMatchError,Scalar_Int_Expr,'a,b') + +class test_Assignment_Stmt(NumpyTestCase): # R734 + + def check_simple(self): + cls = Assignment_Stmt + a = cls('a = b') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a = b') + assert_equal(repr(a),"Assignment_Stmt(Name('a'), '=', Name('b'))") + + a = cls('a(3:4) = b+c') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a(3 : 4) = b + c') + + a = cls('a%c = b+c') + assert isinstance(a, cls),`a` + assert_equal(str(a),'a % c = b + c') + +class test_Proc_Component_Ref(NumpyTestCase): # R741 + + def check_proc_component_ref(self): + cls = Proc_Component_Ref + a = cls('a % b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a % b') + assert_equal(repr(a),"Proc_Component_Ref(Name('a'), '%', Name('b'))") + +############################################################################### +############################### SECTION 8 #################################### +############################################################################### + +class test_Continue_Stmt(NumpyTestCase): # R848 + + def check_simple(self): + cls = Continue_Stmt + a = cls('continue') + assert isinstance(a, cls),`a` + assert_equal(str(a),'CONTINUE') + assert_equal(repr(a),"Continue_Stmt('CONTINUE')") + +############################################################################### +############################### SECTION 9 #################################### +############################################################################### + +class test_Io_Unit(NumpyTestCase): # R901 + + def check_simple(self): + cls = Io_Unit + a = cls('*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'*') + + a = cls('a') + assert isinstance(a, Name),`a` + assert_equal(str(a),'a') + +class test_Write_Stmt(NumpyTestCase): # R911 + + def check_simple(self): + cls = Write_Stmt + a = cls('write (123)"hey"') + assert isinstance(a, cls),`a` + assert_equal(str(a),'WRITE(UNIT = 123) "hey"') + assert_equal(repr(a),'Write_Stmt(Io_Control_Spec_List(\',\', (Io_Control_Spec(\'UNIT\', Int_Literal_Constant(\'123\', None)),)), Char_Literal_Constant(\'"hey"\', None))') + +class test_Print_Stmt(NumpyTestCase): # R912 + + def check_simple(self): + cls = Print_Stmt + a = cls('print 123') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PRINT 123') + assert_equal(repr(a),"Print_Stmt(Label('123'), None)") + + a = cls('print *,"a=",a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PRINT *, "a=", a') + +class test_Io_Control_Spec(NumpyTestCase): # R913 + + def check_simple(self): + cls = Io_Control_Spec + a = cls('end=123') + assert isinstance(a, cls),`a` + assert_equal(str(a),'END = 123') + assert_equal(repr(a),"Io_Control_Spec('END', Label('123'))") + +class test_Io_Control_Spec_List(NumpyTestCase): # R913-list + + def check_simple(self): + cls = Io_Control_Spec_List + a = cls('end=123') + assert isinstance(a, cls),`a` + assert_equal(str(a),'END = 123') + assert_equal(repr(a),"Io_Control_Spec_List(',', (Io_Control_Spec('END', Label('123')),))") + + a = cls('123') + assert isinstance(a, cls),`a` + assert_equal(str(a),'UNIT = 123') + + a = cls('123,*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'UNIT = 123, FMT = *') + + a = cls('123,fmt=a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'UNIT = 123, FMT = a') + + if 0: + # see todo note in Io_Control_Spec_List + a = cls('123,a') + assert isinstance(a, cls),`a` + assert_equal(str(a),'UNIT = 123, NML = a') + +class test_Format(NumpyTestCase): # R914 + + def check_simple(self): + cls = Format + a = cls('*') + assert isinstance(a, cls),`a` + assert_equal(str(a),'*') + assert_equal(repr(a),"Format('*')") + + a = cls('a') + assert isinstance(a, Name),`a` + assert_equal(str(a),'a') + + a = cls('123') + assert isinstance(a, Label),`a` + assert_equal(str(a),'123') + +class test_Wait_Stmt(NumpyTestCase): # R921 + + def check_simple(self): + cls = Wait_Stmt + a = cls('wait (123)') + assert isinstance(a, cls),`a` + assert_equal(str(a),'WAIT(UNIT = 123)') + +class test_Wait_Spec(NumpyTestCase): # R922 + + def check_simple(self): + cls = Wait_Spec + a = cls('123') + assert isinstance(a, cls),`a` + assert_equal(str(a),'UNIT = 123') + assert_equal(repr(a),"Wait_Spec('UNIT', Int_Literal_Constant('123', None))") + + a = cls('err=1') + assert isinstance(a, cls),`a` + assert_equal(str(a),'ERR = 1') + +############################################################################### +############################### SECTION 10 #################################### +############################################################################### + + +############################################################################### +############################### SECTION 11 #################################### +############################################################################### + +class test_Module_Nature(NumpyTestCase): # R1110 + + def check_simple(self): + cls = Module_Nature + a = cls('intrinsic') + assert isinstance(a, cls),`a` + assert_equal(str(a),'INTRINSIC') + assert_equal(repr(a),"Module_Nature('INTRINSIC')") + + a = cls('non_intrinsic') + assert isinstance(a, cls),`a` + assert_equal(str(a),'NON_INTRINSIC') + +############################################################################### +############################### SECTION 12 #################################### +############################################################################### + +class test_Function_Reference(NumpyTestCase): # R1217 + + def check_simple(self): + cls = Function_Reference + a = cls('f()') + assert isinstance(a,cls),`a` + assert_equal(str(a),'f()') + assert_equal(repr(a),"Function_Reference(Name('f'), None)") + + a = cls('f(2,k=1,a)') + assert isinstance(a,cls),`a` + assert_equal(str(a),'f(2, k = 1, a)') + + +class test_Procedure_Designator(NumpyTestCase): # R1219 + + def check_procedure_designator(self): + cls = Procedure_Designator + a = cls('a%b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a % b') + assert_equal(repr(a),"Procedure_Designator(Name('a'), '%', Name('b'))") + +class test_Actual_Arg_Spec(NumpyTestCase): # R1220 + + def check_simple(self): + cls = Actual_Arg_Spec + a = cls('k=a') + assert isinstance(a,cls),`a` + assert_equal(str(a),'k = a') + assert_equal(repr(a),"Actual_Arg_Spec(Name('k'), Name('a'))") + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + +class test_Actual_Arg_Spec_List(NumpyTestCase): + + def check_simple(self): + cls = Actual_Arg_Spec_List + a = cls('a,b') + assert isinstance(a,cls),`a` + assert_equal(str(a),'a, b') + assert_equal(repr(a),"Actual_Arg_Spec_List(',', (Name('a'), Name('b')))") + + a = cls('a = k') + assert isinstance(a,Actual_Arg_Spec),`a` + assert_equal(str(a),'a = k') + + a = cls('a = k,b') + assert isinstance(a,Actual_Arg_Spec_List),`a` + assert_equal(str(a),'a = k, b') + + a = cls('a') + assert isinstance(a,Name),`a` + assert_equal(str(a),'a') + +class test_Alt_Return_Spec(NumpyTestCase): # R1222 + + def check_alt_return_spec(self): + cls = Alt_Return_Spec + a = cls('* 123') + assert isinstance(a,cls),`a` + assert_equal(str(a),'*123') + assert_equal(repr(a),"Alt_Return_Spec('123')") + +class test_Prefix(NumpyTestCase): # R1227 + + def check_simple(self): + cls = Prefix + a = cls('pure recursive') + assert isinstance(a, cls),`a` + assert_equal(str(a),'PURE RECURSIVE') + assert_equal(repr(a), "Prefix(' ', (Prefix_Spec('PURE'), Prefix_Spec('RECURSIVE')))") + + a = cls('integer * 2 pure') + assert isinstance(a, cls),`a` + assert_equal(str(a),'INTEGER*2 PURE') + +class test_Prefix_Spec(NumpyTestCase): # R1228 def check_simple(self): cls = Prefix_Spec @@ -136,20 +1909,29 @@ class test_Prefix_Spec(NumpyTestCase): assert isinstance(a, Intrinsic_Type_Spec),`a` assert_equal(str(a),'INTEGER*2') -class test_Prefix(NumpyTestCase): +class test_Subroutine_Subprogram(NumpyTestCase): # R1231 def check_simple(self): - cls = Prefix - a = cls('pure recursive') + from api import get_reader + reader = get_reader('''\ + subroutine foo + end subroutine foo''') + cls = Subroutine_Subprogram + a = cls(reader) assert isinstance(a, cls),`a` - assert_equal(str(a),'PURE RECURSIVE') - assert_equal(repr(a), "Prefix(' ', (Prefix_Spec('PURE'), Prefix_Spec('RECURSIVE')))") + assert_equal(str(a),'SUBROUTINE foo\nEND SUBROUTINE foo') + assert_equal(repr(a),"Subroutine_Subprogram(Subroutine_Stmt(None, Name('foo'), None, None), End_Subroutine_Stmt('SUBROUTINE', Name('foo')))") - a = cls('integer * 2 pure') + reader = get_reader('''\ + subroutine foo + integer a + end subroutine foo''') + cls = Subroutine_Subprogram + a = cls(reader) assert isinstance(a, cls),`a` - assert_equal(str(a),'INTEGER*2 PURE') + assert_equal(str(a),'SUBROUTINE foo\n INTEGER :: a\nEND SUBROUTINE foo') -class test_Subroutine_Stmt(NumpyTestCase): +class test_Subroutine_Stmt(NumpyTestCase): # R1232 def check_simple(self): cls = Subroutine_Stmt @@ -170,7 +1952,7 @@ class test_Subroutine_Stmt(NumpyTestCase): assert isinstance(a, cls),`a` assert_equal(str(a),'SUBROUTINE foo BIND(C)') -class test_End_Subroutine_Stmt(NumpyTestCase): +class test_End_Subroutine_Stmt(NumpyTestCase): # R1234 def check_simple(self): cls = End_Subroutine_Stmt @@ -187,39 +1969,48 @@ class test_End_Subroutine_Stmt(NumpyTestCase): assert isinstance(a, cls),`a` assert_equal(str(a),'END SUBROUTINE') -class test_Specification_Part(NumpyTestCase): +class test_Return_Stmt(NumpyTestCase): # R1236 def check_simple(self): - from api import get_reader - reader = get_reader('''\ - integer a''') - cls = Specification_Part - a = cls(reader) + cls = Return_Stmt + a = cls('return') assert isinstance(a, cls),`a` - assert_equal(str(a),'INTEGER :: a') - assert_equal(repr(a), "Specification_Part(Type_Declaration_Stmt(Intrinsic_Type_Spec('INTEGER', None), None, Entity_Decl(Name('a'), None, None, None)))") + assert_equal(str(a), 'RETURN') + assert_equal(repr(a), 'Return_Stmt(None)') -class test_Subroutine_Subprogram(NumpyTestCase): +class test_Contains(NumpyTestCase): # R1237 def check_simple(self): - from api import get_reader - reader = get_reader('''\ - subroutine foo - end subroutine foo''') - cls = Subroutine_Subprogram - a = cls(reader) + cls = Contains_Stmt + a = cls('Contains') assert isinstance(a, cls),`a` - assert_equal(str(a),'SUBROUTINE foo\nEND SUBROUTINE foo') - assert_equal(repr(a),"Subroutine_Subprogram(Subroutine_Stmt(None, Name('foo'), None, None), End_Subroutine_Stmt('SUBROUTINE', Name('foo')))") + assert_equal(str(a),'CONTAINS') + assert_equal(repr(a),"Contains_Stmt('CONTAINS')") - reader = get_reader('''\ - subroutine foo - integer a - end subroutine foo''') - cls = Subroutine_Subprogram - a = cls(reader) - assert isinstance(a, cls),`a` - assert_equal(str(a),'SUBROUTINE foo\nINTEGER :: a\nEND SUBROUTINE foo') +if 1: + for name in dir(): + obj = eval(name) + if not isinstance(obj, ClassType): continue + if not issubclass(obj, Base): continue + clsname = obj.__name__ + if clsname.endswith('Base'): continue + subclass_names = obj.__dict__.get('subclass_names',None) + use_names = obj.__dict__.get('use_names',None) + if not use_names: continue + match = obj.__dict__.get('match',None) + try: + test_cls = eval('test_%s' % (clsname)) + except NameError: + test_cls = None + if match is None: + if test_cls is None: + print '%s needs match implementation and tests' % (clsname) + else: + print '%s needs match implementation' % (clsname) + else: + if test_cls is None: + print '%s needs tests' % (clsname) + continue if __name__ == "__main__": diff --git a/numpy/f2py/lib/parser/test_expressions.py b/numpy/f2py/lib/parser/test_expressions.py deleted file mode 100644 index 3981ec9a7..000000000 --- a/numpy/f2py/lib/parser/test_expressions.py +++ /dev/null @@ -1,1118 +0,0 @@ - -from numpy.testing import * - -from Fortran2003 import * - -class test_Expr(NumpyTestCase): - - def check_simple(self): - cls = Expr - a = cls('a .op. b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .OP. b') - assert_equal(repr(a),"Expr(Name('a'), '.OP.', Name('b'))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Substring(NumpyTestCase): - - def check_substring(self): - cls = Substring - a = cls('a(1:2)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a(1 : 2)') - assert_equal(repr(a),"Substring(Name('a'), Substring_Range(Int_Literal_Constant('1', None), Int_Literal_Constant('2', None)))") - -class test_Part_Ref(NumpyTestCase): - - def check_part_ref(self): - cls = Part_Ref - a = cls('a') - assert isinstance(a, Name),`a` - assert_equal(str(a),'a') - -class test_Kind_Selector(NumpyTestCase): - - def check_kind_selector(self): - cls = Kind_Selector - a = cls('(1)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(KIND = 1)') - assert_equal(repr(a),"Kind_Selector('(', Int_Literal_Constant('1', None), ')')") - - a = cls('(kind=1+2)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(KIND = 1 + 2)') - - a = cls('* 1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'*1') - -class test_Type_Param_Value(NumpyTestCase): - - def check_type_param_value(self): - cls = Type_Param_Value - a = cls('*') - assert isinstance(a,cls),`a` - assert_equal(str(a),'*') - assert_equal(repr(a),"Type_Param_Value('*')") - - a = cls(':') - assert isinstance(a,cls),`a` - assert_equal(str(a),':') - - a = cls('1+2') - assert isinstance(a,Level_2_Expr),`a` - assert_equal(str(a),'1 + 2') - -class test_Char_Length(NumpyTestCase): - - def check_char_length(self): - cls = Char_Length - a = cls('(1)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(1)') - assert_equal(repr(a),"Char_Length('(', Int_Literal_Constant('1', None), ')')") - - a = cls('1') - assert isinstance(a,Int_Literal_Constant),`a` - assert_equal(str(a),'1') - - a = cls('(*)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(*)') - - a = cls('(:)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(:)') - -class test_Length_Selector(NumpyTestCase): - - def check_length_selector(self): - cls = Length_Selector - a = cls('( len = *)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(LEN = *)') - assert_equal(repr(a),"Length_Selector('(', Type_Param_Value('*'), ')')") - - a = cls('*2,') - assert isinstance(a,cls),`a` - assert_equal(str(a),'*2') - -class test_Char_Selector(NumpyTestCase): - - def check_char_selector(self): - cls = Char_Selector - a = cls('(len=2, kind=8)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(LEN = 2, KIND = 8)') - assert_equal(repr(a),"Char_Selector(Int_Literal_Constant('2', None), Int_Literal_Constant('8', None))") - - - a = cls('(2, kind=8)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(LEN = 2, KIND = 8)') - - a = cls('(2, 8)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(LEN = 2, KIND = 8)') - - a = cls('(kind=8)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(KIND = 8)') - - a = cls('(kind=8,len=2)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(LEN = 2, KIND = 8)') - -class test_Intrinsic_Type_Spec(NumpyTestCase): - - def check_intrinsic_type_spec(self): - cls = Intrinsic_Type_Spec - a = cls('INTEGER') - assert isinstance(a,cls),`a` - assert_equal(str(a),'INTEGER') - assert_equal(repr(a), "Intrinsic_Type_Spec('INTEGER', None)") - - a = cls('Integer*2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'INTEGER*2') - - a = cls('real*2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'REAL*2') - - a = cls('logical*2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'LOGICAL*2') - - a = cls('complex*2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'COMPLEX*2') - - a = cls('character*2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'CHARACTER*2') - - a = cls('double complex') - assert isinstance(a,cls),`a` - assert_equal(str(a),'DOUBLE COMPLEX') - - a = cls('double precision') - assert isinstance(a,cls),`a` - assert_equal(str(a),'DOUBLE PRECISION') - -class test_Type_Param_Spec(NumpyTestCase): - - def check_type_param_spec(self): - cls = Type_Param_Spec - a = cls('a=1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a = 1') - assert_equal(repr(a),"Type_Param_Spec(Name('a'), '=', Int_Literal_Constant('1', None))") - - a = cls('k=a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a') - - a = cls('k=:') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = :') - -class test_Type_Param_Spec_List(NumpyTestCase): - - def check_type_param_spec_list(self): - cls = Type_Param_Spec_List - - a = cls('a,b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a, b') - assert_equal(repr(a),"Type_Param_Spec_List(',', (Name('a'), Name('b')))") - - a = cls('a') - assert isinstance(a,Name),`a` - - a = cls('k=a,c,g=1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a, c, g = 1') - -class test_Type_Param_Inquiry(NumpyTestCase): - - def check_simple(self): - cls = Type_Param_Inquiry - a = cls('a % b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a % b') - assert_equal(repr(a),"Type_Param_Inquiry(Name('a'), '%', Name('b'))") - -class test_Function_Reference(NumpyTestCase): - - def check_simple(self): - cls = Function_Reference - a = cls('f()') - assert isinstance(a,cls),`a` - assert_equal(str(a),'f()') - assert_equal(repr(a),"Function_Reference(Name('f'), None)") - - a = cls('f(2,k=1,a)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'f(2, k = 1, a)') - -class test_Alt_Return_Spec(NumpyTestCase): - - def check_alt_return_spec(self): - cls = Alt_Return_Spec - a = cls('* 123') - assert isinstance(a,cls),`a` - assert_equal(str(a),'*123') - assert_equal(repr(a),"Alt_Return_Spec('123')") - -class test_Substring_Range(NumpyTestCase): - - def check_substring_range(self): - cls = Substring_Range - a = cls('a:b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a : b') - assert_equal(repr(a),"Substring_Range(Name('a'), Name('b'))") - - a = cls('a:') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a :') - - a = cls(':b') - assert isinstance(a,cls),`a` - assert_equal(str(a),': b') - - a = cls(':') - assert isinstance(a,cls),`a` - assert_equal(str(a),':') - -class test_Array_Section(NumpyTestCase): - - def check_array_section(self): - cls = Array_Section - a = cls('a(:)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a(:)') - assert_equal(repr(a),"Array_Section(Name('a'), Substring_Range(None, None))") - - a = cls('a(2:)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a(2 :)') - -class test_Procedure_Designator(NumpyTestCase): - - def check_procedure_designator(self): - cls = Procedure_Designator - a = cls('a%b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a % b') - assert_equal(repr(a),"Procedure_Designator(Name('a'), '%', Name('b'))") - -class test_Data_Ref(NumpyTestCase): - - def check_data_ref(self): - cls = Data_Ref - a = cls('a%b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a % b') - assert_equal(repr(a),"Data_Ref('%', (Name('a'), Name('b')))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Proc_Component_Ref(NumpyTestCase): - - def check_proc_component_ref(self): - cls = Proc_Component_Ref - a = cls('a % b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a % b') - assert_equal(repr(a),"Proc_Component_Ref(Name('a'), '%', Name('b'))") - -class test_Structure_Constructor(NumpyTestCase): - - def check_structure_constructor(self): - cls = Structure_Constructor - a = cls('t()') - assert isinstance(a,cls),`a` - assert_equal(str(a),'t()') - assert_equal(repr(a),"Structure_Constructor(Type_Name('t'), None)") - - a = cls('t(s=1, a)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'t(s = 1, a)') - - a = cls('a=k') - assert isinstance(a,Structure_Constructor_2),`a` - assert_equal(str(a),'a = k') - assert_equal(repr(a),"Structure_Constructor_2(Name('a'), '=', Name('k'))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Ac_Implied_Do_Control(NumpyTestCase): - - def check_ac_implied_do_control(self): - cls = Ac_Implied_Do_Control - a = cls('n = 3, 5') - assert isinstance(a,cls),`a` - assert_equal(str(a),'n = 3, 5') - assert_equal(repr(a),"Ac_Implied_Do_Control(Name('n'), [Int_Literal_Constant('3', None), Int_Literal_Constant('5', None)])") - - a = cls('n = 3+1, 5, 1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'n = 3 + 1, 5, 1') - -class test_Ac_Value_List(NumpyTestCase): - - def check_ac_value_list(self): - cls = Ac_Value_List - a = cls('a, b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a, b') - assert_equal(repr(a),"Ac_Value_List(',', (Name('a'), Name('b')))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Ac_Implied_Do(NumpyTestCase): - - def check_ac_implied_do(self): - cls = Ac_Implied_Do - a = cls('( a, b, n = 1, 5 )') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(a, b, n = 1, 5)') - assert_equal(repr(a),"Ac_Implied_Do(Ac_Value_List(',', (Name('a'), Name('b'))), Ac_Implied_Do_Control(Name('n'), [Int_Literal_Constant('1', None), Int_Literal_Constant('5', None)]))") - -class test_Ac_Spec(NumpyTestCase): - - def check_ac_spec(self): - cls = Ac_Spec - a = cls('integer ::') - assert isinstance(a,cls),`a` - assert_equal(str(a),'INTEGER ::') - assert_equal(repr(a),"Ac_Spec(Intrinsic_Type_Spec('INTEGER', None), None)") - - a = cls('integer :: a,b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'INTEGER :: a, b') - - a = cls('a,b') - assert isinstance(a,Ac_Value_List),`a` - assert_equal(str(a),'a, b') - - a = cls('integer :: a, (a, b, n = 1, 5)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'INTEGER :: a, (a, b, n = 1, 5)') - -class test_Name(NumpyTestCase): - - def check_name(self): - a = Name('a') - assert isinstance(a,Name),`a` - a = Name('a2') - assert isinstance(a,Name),`a` - a = Designator('a') - assert isinstance(a,Name),`a` - a = Constant('a') - assert isinstance(a,Name),`a` - a = Expr('a') - assert isinstance(a,Name),`a` - -class test_Int_Literal_Constant(NumpyTestCase): - - def check_int_literal_constant(self): - cls = Int_Literal_Constant - a = cls('1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1') - assert_equal(repr(a),"%s('1', None)" % (cls.__name__)) - - a = cls('21_2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'21_2') - assert_equal(repr(a),"%s('21', '2')" % (cls.__name__)) - - a = cls('21_SHORT') - assert isinstance(a,cls),`a` - assert_equal(str(a),'21_SHORT') - - a = cls('21_short') - assert isinstance(a,cls),`a` - assert_equal(str(a),'21_short') - - a = cls('1976354279568241_8') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1976354279568241_8') - -class test_Signed_Int_Literal_Constant(NumpyTestCase): - - def check_int_literal_constant(self): - cls = Signed_Int_Literal_Constant - a = cls('1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1') - assert_equal(repr(a),"%s('1', None)" % (cls.__name__)) - - a = cls('+ 21_2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+ 21_2') - assert_equal(repr(a),"%s('+ 21', '2')" % (cls.__name__)) - - a = cls('-21_SHORT') - assert isinstance(a,cls),`a` - assert_equal(str(a),'-21_SHORT') - - a = cls('21_short') - assert isinstance(a,cls),`a` - assert_equal(str(a),'21_short') - - a = cls('+1976354279568241_8') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+1976354279568241_8') - -class test_Real_Literal_Constant(NumpyTestCase): - - def check_real_literal_constant(self): - cls = Real_Literal_Constant - a = cls('12.78') - assert isinstance(a,cls),`a` - assert_equal(str(a),'12.78') - assert_equal(repr(a),"%s('12.78', None)" % (cls.__name__)) - - a = cls('12.78_8') - assert isinstance(a,cls),`a` - assert_equal(str(a),'12.78_8') - assert_equal(repr(a),"%s('12.78', '8')" % (cls.__name__)) - - a = cls('12.') - assert isinstance(a,cls),`a` - assert_equal(str(a),'12.') - - a = cls('1.6E3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E3') - - a = cls('1.6E3_8') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E3_8') - - a = cls('1.6D3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6D3') - - a = cls('1.6E-3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E-3') - a = cls('1.6E+3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E+3') - - a = cls('3E4') - assert isinstance(a,cls),`a` - assert_equal(str(a),'3E4') - - a = cls('.123') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.123') - - a = cls('1.6E-3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E-3') - - a = cls('10.9E7_QUAD') - assert isinstance(a,cls),`a` - assert_equal(str(a),'10.9E7_QUAD') - - a = cls('10.9e-17_quad') - assert isinstance(a,cls),`a` - assert_equal(str(a),'10.9E-17_quad') - -class test_Signed_Real_Literal_Constant(NumpyTestCase): - - def check_signed_real_literal_constant(self): - cls = Signed_Real_Literal_Constant - a = cls('12.78') - assert isinstance(a,cls),`a` - assert_equal(str(a),'12.78') - assert_equal(repr(a),"%s('12.78', None)" % (cls.__name__)) - - a = cls('+12.78_8') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+12.78_8') - assert_equal(repr(a),"%s('+12.78', '8')" % (cls.__name__)) - - a = cls('- 12.') - assert isinstance(a,cls),`a` - assert_equal(str(a),'- 12.') - - a = cls('1.6E3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E3') - - a = cls('+1.6E3_8') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+1.6E3_8') - - a = cls('1.6D3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6D3') - - a = cls('-1.6E-3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'-1.6E-3') - a = cls('1.6E+3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'1.6E+3') - - a = cls('3E4') - assert isinstance(a,cls),`a` - assert_equal(str(a),'3E4') - - a = cls('.123') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.123') - - a = cls('+1.6E-3') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+1.6E-3') - - a = cls('10.9E7_QUAD') - assert isinstance(a,cls),`a` - assert_equal(str(a),'10.9E7_QUAD') - - a = cls('-10.9e-17_quad') - assert isinstance(a,cls),`a` - assert_equal(str(a),'-10.9E-17_quad') - - -class test_Complex_Literal_Constant(NumpyTestCase): - - def check_complex_literal_constant(self): - cls = Complex_Literal_Constant - a = cls('(1.0, -1.0)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(1.0, -1.0)') - assert_equal(repr(a),"Complex_Literal_Constant(Signed_Real_Literal_Constant('1.0', None), Signed_Real_Literal_Constant('-1.0', None))") - - a = cls('(3,3.1E6)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(3, 3.1E6)') - - a = cls('(4.0_4, 3.6E7_8)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(4.0_4, 3.6E7_8)') - - a = cls('( 0., PI)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(0., PI)') - -class test_Char_Literal_Constant(NumpyTestCase): - - def check_char_literal_constant(self): - cls = Char_Literal_Constant - a = cls('NIH_"DO"') - assert isinstance(a,cls),`a` - assert_equal(str(a),'NIH_"DO"') - assert_equal(repr(a),'Char_Literal_Constant(\'"DO"\', \'NIH\')') - - a = cls("'DO'") - assert isinstance(a,cls),`a` - assert_equal(str(a),"'DO'") - assert_equal(repr(a),'Char_Literal_Constant("\'DO\'", None)') - - a = cls("'DON''T'") - assert isinstance(a,cls),`a` - assert_equal(str(a),"'DON''T'") - - a = cls('"DON\'T"') - assert isinstance(a,cls),`a` - assert_equal(str(a),'"DON\'T"') - - a = cls('""') - assert isinstance(a,cls),`a` - assert_equal(str(a),'""') - - a = cls("''") - assert isinstance(a,cls),`a` - assert_equal(str(a),"''") - - a = cls('"hey ha(ada)\t"') - assert isinstance(a,cls),`a` - assert_equal(str(a),'"hey ha(ada)\t"') - -class test_Logical_Literal_Constant(NumpyTestCase): - - def check_logical_literal_constant(self): - cls = Logical_Literal_Constant - a = cls('.TRUE.') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.TRUE.') - assert_equal(repr(a),"%s('.TRUE.', None)" % (cls.__name__)) - - a = cls('.True.') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.TRUE.') - - a = cls('.FALSE.') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.FALSE.') - - a = cls('.TRUE._HA') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.TRUE._HA') - -class test_Binary_Constant(NumpyTestCase): - - def check_boz_literal_constant(self): - cls = Boz_Literal_Constant - bcls = Binary_Constant - a = cls('B"01"') - assert isinstance(a,bcls),`a` - assert_equal(str(a),'B"01"') - assert_equal(repr(a),"%s('B\"01\"')" % (bcls.__name__)) - -class test_Octal_Constant(NumpyTestCase): - - def check_boz_literal_constant(self): - cls = Boz_Literal_Constant - ocls = Octal_Constant - a = cls('O"017"') - assert isinstance(a,ocls),`a` - assert_equal(str(a),'O"017"') - assert_equal(repr(a),"%s('O\"017\"')" % (ocls.__name__)) - -class test_Hex_Constant(NumpyTestCase): - - def check_boz_literal_constant(self): - cls = Boz_Literal_Constant - zcls = Hex_Constant - a = cls('Z"01A"') - assert isinstance(a,zcls),`a` - assert_equal(str(a),'Z"01A"') - assert_equal(repr(a),"%s('Z\"01A\"')" % (zcls.__name__)) - -class test_Subscript_Triplet(NumpyTestCase): - - def check_simple(self): - cls = Subscript_Triplet - a = cls('a:b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a : b') - assert_equal(repr(a),"Subscript_Triplet(Name('a'), Name('b'), None)") - - a = cls('a:b:1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a : b : 1') - - a = cls(':') - assert isinstance(a,cls),`a` - assert_equal(str(a),':') - - a = cls('::5') - assert isinstance(a,cls),`a` - assert_equal(str(a),': : 5') - - a = cls(':5') - assert isinstance(a,cls),`a` - assert_equal(str(a),': 5') - - a = cls('a+1 :') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a + 1 :') - -class test_Section_Subscript(NumpyTestCase): - - def check_simple(self): - cls = Section_Subscript - - a = cls('1:2') - assert isinstance(a, Subscript_Triplet),`a` - assert_equal(str(a),'1 : 2') - - a = cls('zzz') - assert isinstance(a, Name),`a` - assert_equal(str(a),'zzz') - -class test_Section_Subscript_List(NumpyTestCase): - - def check_simple(self): - cls = Section_Subscript_List - a = cls('a,2') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a, 2') - assert_equal(repr(a),"Section_Subscript_List(',', (Name('a'), Int_Literal_Constant('2', None)))") - - a = cls('::1') - assert isinstance(a,Subscript_Triplet),`a` - assert_equal(str(a),': : 1') - - a = cls('::1, 3') - assert isinstance(a,cls),`a` - assert_equal(str(a),': : 1, 3') - -class test_Derived_Type_Spec(NumpyTestCase): - - def check_simple(self): - cls = Derived_Type_Spec - a = cls('a(b)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a(b)') - assert_equal(repr(a),"Derived_Type_Spec(Type_Name('a'), Name('b'))") - - a = cls('a(b,c,g=1)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a(b, c, g = 1)') - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - - a = cls('a()') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a()') - -class test_Type_Name(NumpyTestCase): - - def check_simple(self): - cls = Type_Name - a = cls('a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a') - assert_equal(repr(a),"Type_Name('a')") - - self.assertRaises(NoMatchError,cls,'integer') - self.assertRaises(NoMatchError,cls,'doubleprecision') - -class test_Actual_Arg_Spec(NumpyTestCase): - - def check_simple(self): - cls = Actual_Arg_Spec - a = cls('k=a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a') - assert_equal(repr(a),"Actual_Arg_Spec(Name('k'), '=', Name('a'))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Actual_Arg_Spec_List(NumpyTestCase): - - def check_simple(self): - cls = Actual_Arg_Spec_List - a = cls('a,b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a, b') - assert_equal(repr(a),"Actual_Arg_Spec_List(',', (Name('a'), Name('b')))") - - a = cls('a = k') - assert isinstance(a,Actual_Arg_Spec),`a` - assert_equal(str(a),'a = k') - - a = cls('a = k,b') - assert isinstance(a,Actual_Arg_Spec_List),`a` - assert_equal(str(a),'a = k, b') - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Component_Spec(NumpyTestCase): - - def check_simple(self): - cls = Component_Spec - a = cls('k=a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a') - assert_equal(repr(a),"Component_Spec(Name('k'), '=', Name('a'))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - - a = cls('a % b') - assert isinstance(a, Proc_Component_Ref),`a` - assert_equal(str(a),'a % b') - - a = cls('s =a % b') - assert isinstance(a, Component_Spec),`a` - assert_equal(str(a),'s = a % b') - -class test_Component_Spec_List(NumpyTestCase): - - def check_simple(self): - cls = Component_Spec_List - a = cls('k=a, b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a, b') - assert_equal(repr(a),"Component_Spec_List(',', (Component_Spec(Name('k'), '=', Name('a')), Name('b')))") - - a = cls('k=a, c') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a, c') - -class test_Structure_Constructor_2(NumpyTestCase): - - def check_simple(self): - cls = Structure_Constructor_2 - a = cls('k=a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'k = a') - assert_equal(repr(a),"Structure_Constructor_2(Name('k'), '=', Name('a'))") - - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - -class test_Array_Constructor(NumpyTestCase): - - def check_simple(self): - cls = Array_Constructor - a = cls('(/a/)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(/a/)') - assert_equal(repr(a),"Array_Constructor('(/', Name('a'), '/)')") - - a = cls('[a]') - assert isinstance(a,cls),`a` - assert_equal(str(a),'[a]') - assert_equal(repr(a),"Array_Constructor('[', Name('a'), ']')") - - a = cls('[integer::a]') - assert isinstance(a,cls),`a` - assert_equal(str(a),'[INTEGER :: a]') - - a = cls('[integer::a,b]') - assert isinstance(a,cls),`a` - assert_equal(str(a),'[INTEGER :: a, b]') - -class test_Parenthesis(NumpyTestCase): - - def check_simple(self): - cls = Parenthesis - a = cls('(a)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(a)') - assert_equal(repr(a),"Parenthesis('(', Name('a'), ')')") - - a = cls('(a+1)') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(a + 1)') - - a = cls('((a))') - assert isinstance(a,cls),`a` - assert_equal(str(a),'((a))') - - a = cls('(a+(a+c))') - assert isinstance(a,cls),`a` - assert_equal(str(a),'(a + (a + c))') - -class test_Level_1_Expr(NumpyTestCase): - - def check_simple(self): - cls = Level_1_Expr - a = cls('.hey. a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.HEY. a') - assert_equal(repr(a),"Level_1_Expr('.HEY.', Name('a'))") - - self.assertRaises(NoMatchError,cls,'.not. a') - -class test_Level_2_Expr(NumpyTestCase): - - def check_simple(self): - cls = Level_2_Expr - a = cls('a+b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a + b') - assert_equal(repr(a),"Level_2_Expr(Name('a'), '+', Name('b'))") - - a = cls('a-b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a - b') - - a = cls('a+b+c') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a + b + c') - - a = cls('+a') - assert isinstance(a,Level_2_Unary_Expr),`a` - assert_equal(str(a),'+ a') - - a = cls('+1') - assert isinstance(a,Level_2_Unary_Expr),`a` - assert_equal(str(a),'+ 1') - - a = cls('+a+b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+ a + b') - -class test_Level_2_Unary_Expr(NumpyTestCase): - - def check_simple(self): - cls = Level_2_Unary_Expr - a = cls('+a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+ a') - assert_equal(repr(a),"Level_2_Unary_Expr('+', Name('a'))") - - a = cls('-a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'- a') - - a = cls('+1') - assert isinstance(a,cls),`a` - assert_equal(str(a),'+ 1') - -class test_Level_3_Expr(NumpyTestCase): - - def check_simple(self): - cls = Level_3_Expr - a = cls('a//b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a // b') - assert_equal(repr(a),"Level_3_Expr(Name('a'), '//', Name('b'))") - - a = cls('"a"//"b"') - assert isinstance(a,cls),`a` - assert_equal(str(a),'"a" // "b"') - -class test_Level_4_Expr(NumpyTestCase): - - def check_simple(self): - cls = Level_4_Expr - a = cls('a.eq.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .EQ. b') - assert_equal(repr(a),"Level_4_Expr(Name('a'), '.EQ.', Name('b'))") - - a = cls('a.ne.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .NE. b') - - a = cls('a.lt.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .LT. b') - - a = cls('a.gt.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .GT. b') - - a = cls('a.ge.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .GE. b') - - a = cls('a==b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a == b') - - a = cls('a/=b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a /= b') - - a = cls('a<b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a < b') - - a = cls('a<=b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a <= b') - - a = cls('a>=b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a >= b') - - a = cls('a>b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a > b') - -class test_Level_5_Expr(NumpyTestCase): - - def check_simple(self): - cls = Level_5_Expr - a = cls('a.eqv.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .EQV. b') - assert_equal(repr(a),"Level_5_Expr(Name('a'), '.EQV.', Name('b'))") - - a = cls('a.neqv.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .NEQV. b') - - a = cls('a.eq.b') - assert isinstance(a,Level_4_Expr),`a` - assert_equal(str(a),'a .EQ. b') - -class test_Mult_Operand(NumpyTestCase): - - def check_simple(self): - cls = Mult_Operand - a = cls('a**b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a ** b') - assert_equal(repr(a),"Mult_Operand(Name('a'), '**', Name('b'))") - -class test_Add_Operand(NumpyTestCase): - - def check_simple(self): - cls = Add_Operand - a = cls('a*b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a * b') - assert_equal(repr(a),"Add_Operand(Name('a'), '*', Name('b'))") - - a = cls('a/b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a / b') - -class test_Equiv_Operand(NumpyTestCase): - - def check_simple(self): - cls = Equiv_Operand - a = cls('a.or.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .OR. b') - assert_equal(repr(a),"Equiv_Operand(Name('a'), '.OR.', Name('b'))") - -class test_Or_Operand(NumpyTestCase): - - def check_simple(self): - cls = Or_Operand - a = cls('a.and.b') - assert isinstance(a,cls),`a` - assert_equal(str(a),'a .AND. b') - assert_equal(repr(a),"Or_Operand(Name('a'), '.AND.', Name('b'))") - -class test_And_Operand(NumpyTestCase): - - def check_simple(self): - cls = And_Operand - a = cls('.not.a') - assert isinstance(a,cls),`a` - assert_equal(str(a),'.NOT. a') - assert_equal(repr(a),"And_Operand('.NOT.', Name('a'))") - -class test_Primary(NumpyTestCase): - - def check_simple(self): - cls = Primary - a = cls('a') - assert isinstance(a,Name),`a` - assert_equal(str(a),'a') - - a = cls('(a)') - assert isinstance(a,Parenthesis),`a` - assert_equal(str(a),'(a)') - - a = cls('1') - assert isinstance(a,Int_Literal_Constant),`a` - assert_equal(str(a),'1') - - a = cls('1.') - assert isinstance(a,Real_Literal_Constant),`a` - assert_equal(str(a),'1.') - - a = cls('(1, n)') - assert isinstance(a,Complex_Literal_Constant),`a` - assert_equal(str(a),'(1, n)') - - a = cls('.true.') - assert isinstance(a,Logical_Literal_Constant),`a` - assert_equal(str(a),'.TRUE.') - - a = cls('"hey a()c"') - assert isinstance(a,Char_Literal_Constant),`a` - assert_equal(str(a),'"hey a()c"') - - a = cls('b"0101"') - assert isinstance(a,Binary_Constant),`a` - assert_equal(str(a),'B"0101"') - - a = cls('o"0107"') - assert isinstance(a,Octal_Constant),`a` - assert_equal(str(a),'O"0107"') - - a = cls('z"a107"') - assert isinstance(a,Hex_Constant),`a` - assert_equal(str(a),'Z"A107"') - - a = cls('a % b') - assert isinstance(a,Data_Ref),`a` - assert_equal(str(a),'a % b') - - a = cls('a(:)') - assert isinstance(a,Array_Section),`a` - assert_equal(str(a),'a(:)') - - - -if __name__ == "__main__": - NumpyTest().run() diff --git a/numpy/f2py/lib/parser/test_statements2.py b/numpy/f2py/lib/parser/test_statements2.py deleted file mode 100644 index a990fc6b1..000000000 --- a/numpy/f2py/lib/parser/test_statements2.py +++ /dev/null @@ -1,212 +0,0 @@ -from numpy.testing import * - -from Fortran2003 import * - -class test_Declaration_Type_Spec(NumpyTestCase): - - def check_simple(self): - cls = Declaration_Type_Spec - a = cls('Integer*2') - assert isinstance(a, Intrinsic_Type_Spec),`a` - assert_equal(str(a), 'INTEGER*2') - - a = cls('type(foo)') - assert isinstance(a, cls),`a` - assert_equal(str(a), 'TYPE(foo)') - assert_equal(repr(a), "Declaration_Type_Spec('TYPE', Type_Name('foo'))") - -class test_Type_Declaration_Stmt(NumpyTestCase): - - def check_simple(self): - cls = Type_Declaration_Stmt - a = cls('integer a') - assert isinstance(a, cls),`a` - assert_equal(str(a), 'INTEGER :: a') - assert_equal(repr(a), "Type_Declaration_Stmt(Intrinsic_Type_Spec('INTEGER', None), None, Entity_Decl(Name('a'), None, None, None))") - - a = cls('integer ,dimension(2):: a*3') - assert isinstance(a, cls),`a` - assert_equal(str(a), 'INTEGER, DIMENSION(2) :: a*3') - -class test_Access_Spec(NumpyTestCase): - - def check_simple(self): - cls = Access_Spec - a = cls('private') - assert isinstance(a, cls),`a` - assert_equal(str(a), 'PRIVATE') - assert_equal(repr(a), "Access_Spec('PRIVATE')") - - a = cls('public') - assert isinstance(a, cls),`a` - assert_equal(str(a), 'PUBLIC') - -class test_Attr_Spec(NumpyTestCase): - - def check_simple(self): - cls = Attr_Spec - a = cls('allocatable') - assert isinstance(a, cls),`a` - assert_equal(str(a), 'ALLOCATABLE') - - a = cls('dimension(a)') - assert isinstance(a, Dimension_Attr_Spec),`a` - assert_equal(str(a),'DIMENSION(a)') - -class test_Dimension_Attr_Spec(NumpyTestCase): - - def check_simple(self): - cls = Dimension_Attr_Spec - a = cls('dimension(a)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'DIMENSION(a)') - assert_equal(repr(a),"Dimension_Attr_Spec('DIMENSION', Name('a'))") - -class test_Intent_Attr_Spec(NumpyTestCase): - - def check_simple(self): - cls = Intent_Attr_Spec - a = cls('intent(in)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'INTENT(IN)') - assert_equal(repr(a),"Intent_Attr_Spec('INTENT', Intent_Spec('IN'))") - -class test_Language_Binding_Spec(NumpyTestCase): - - def check_simple(self): - cls = Language_Binding_Spec - a = cls('bind(c)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'BIND(C)') - assert_equal(repr(a),'Language_Binding_Spec(None)') - - a = cls('bind(c, name="hey")') - assert isinstance(a, cls),`a` - assert_equal(str(a),'BIND(C, NAME = "hey")') - -class test_Entity_Decl(NumpyTestCase): - - def check_simple(self): - cls = Entity_Decl - a = cls('a(1)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'a(1)') - assert_equal(repr(a),"Entity_Decl(Name('a'), Int_Literal_Constant('1', None), None, None)") - - a = cls('a(1)*(3)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'a(1)*(3)') - - a = cls('a(1)*(3) = 2') - assert isinstance(a, cls),`a` - assert_equal(str(a),'a(1)*(3) = 2') - -class test_Prefix_Spec(NumpyTestCase): - - def check_simple(self): - cls = Prefix_Spec - a = cls('pure') - assert isinstance(a, cls),`a` - assert_equal(str(a),'PURE') - assert_equal(repr(a),"Prefix_Spec('PURE')") - - a = cls('elemental') - assert isinstance(a, cls),`a` - assert_equal(str(a),'ELEMENTAL') - - a = cls('recursive') - assert isinstance(a, cls),`a` - assert_equal(str(a),'RECURSIVE') - - a = cls('integer * 2') - assert isinstance(a, Intrinsic_Type_Spec),`a` - assert_equal(str(a),'INTEGER*2') - -class test_Prefix(NumpyTestCase): - - def check_simple(self): - cls = Prefix - a = cls('pure recursive') - assert isinstance(a, cls),`a` - assert_equal(str(a),'PURE RECURSIVE') - assert_equal(repr(a), "Prefix(' ', (Prefix_Spec('PURE'), Prefix_Spec('RECURSIVE')))") - - a = cls('integer * 2 pure') - assert isinstance(a, cls),`a` - assert_equal(str(a),'INTEGER*2 PURE') - -class test_Subroutine_Stmt(NumpyTestCase): - - def check_simple(self): - cls = Subroutine_Stmt - a = cls('subroutine foo') - assert isinstance(a, cls),`a` - assert_equal(str(a),'SUBROUTINE foo') - assert_equal(repr(a),"Subroutine_Stmt(None, Name('foo'), None, None)") - - a = cls('pure subroutine foo') - assert isinstance(a, cls),`a` - assert_equal(str(a),'PURE SUBROUTINE foo') - - a = cls('pure subroutine foo(a,b)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'PURE SUBROUTINE foo(a, b)') - - a = cls('subroutine foo() bind(c)') - assert isinstance(a, cls),`a` - assert_equal(str(a),'SUBROUTINE foo BIND(C)') - -class test_End_Subroutine_Stmt(NumpyTestCase): - - def check_simple(self): - cls = End_Subroutine_Stmt - a = cls('end subroutine foo') - assert isinstance(a, cls),`a` - assert_equal(str(a),'END SUBROUTINE foo') - assert_equal(repr(a),"End_Subroutine_Stmt('SUBROUTINE', Name('foo'))") - - a = cls('end') - assert isinstance(a, cls),`a` - assert_equal(str(a),'END SUBROUTINE') - - a = cls('endsubroutine') - assert isinstance(a, cls),`a` - assert_equal(str(a),'END SUBROUTINE') - -class test_Specification_Part(NumpyTestCase): - - def check_simple(self): - from api import get_reader - reader = get_reader('''\ - integer a''') - cls = Specification_Part - a = cls(reader) - assert isinstance(a, cls),`a` - assert_equal(str(a),'INTEGER :: a') - assert_equal(repr(a), "Specification_Part(Type_Declaration_Stmt(Intrinsic_Type_Spec('INTEGER', None), None, Entity_Decl(Name('a'), None, None, None)))") - -class test_Subroutine_Subprogram(NumpyTestCase): - - def check_simple(self): - from api import get_reader - reader = get_reader('''\ - subroutine foo - end subroutine foo''') - cls = Subroutine_Subprogram - a = cls(reader) - assert isinstance(a, cls),`a` - assert_equal(str(a),'SUBROUTINE foo\nEND SUBROUTINE foo') - assert_equal(repr(a),"Subroutine_Subprogram(Subroutine_Stmt(None, Name('foo'), None, None), End_Subroutine_Stmt('SUBROUTINE', Name('foo')))") - - reader = get_reader('''\ - subroutine foo - integer a - end subroutine foo''') - cls = Subroutine_Subprogram - a = cls(reader) - assert isinstance(a, cls),`a` - assert_equal(str(a),'SUBROUTINE foo\nINTEGER :: a\nEND SUBROUTINE foo') - - -if __name__ == "__main__": - NumpyTest().run() |