[Numpy-svn] r3423 - trunk/numpy/f2py/lib/parser
numpy-svn at scipy.org
numpy-svn at scipy.org
Wed Nov 1 05:09:57 EST 2006
Author: pearu
Date: 2006-11-01 04:09:49 -0600 (Wed, 01 Nov 2006)
New Revision: 3423
Added:
trunk/numpy/f2py/lib/parser/test_Fortran2003.py
Modified:
trunk/numpy/f2py/lib/parser/Fortran2003.py
trunk/numpy/f2py/lib/parser/pattern_tools.py
Log:
F2PY G3: Cont impl F2003 parser; defined all syntax rules.
Modified: trunk/numpy/f2py/lib/parser/Fortran2003.py
===================================================================
--- trunk/numpy/f2py/lib/parser/Fortran2003.py 2006-10-31 14:58:19 UTC (rev 3422)
+++ trunk/numpy/f2py/lib/parser/Fortran2003.py 2006-11-01 10:09:49 UTC (rev 3423)
@@ -31,7 +31,9 @@
def __new__(cls, string):
#print '__new__:',cls.__name__,`string`
- if isinstance(string, FortranReaderBase) and not issubclass(cls, BlockBase):
+ match = cls.__dict__.get('match', None)
+ if isinstance(string, FortranReaderBase) and not issubclass(cls, BlockBase) \
+ and match is not None:
reader = string
item = reader.get_item()
if item is None: return
@@ -44,7 +46,6 @@
return
obj._item = item
return obj
- match = cls.__dict__.get('match', None)
if match is not None:
result = cls.match(string)
else:
@@ -109,6 +110,7 @@
[ <endcls> ]
"""
def match(startcls, subclasses, endcls, reader):
+ assert isinstance(reader,FortranReaderBase),`reader`
content = []
if startcls is not None:
try:
@@ -157,9 +159,12 @@
start_stmt = content[0]
end_stmt = content[-1]
if isinstance(end_stmt, endcls) and hasattr(end_stmt, 'name'):
- if end_stmt.name is not None and start_stmt.name != end_stmt.name:
- end_stmt._item.reader.error('expected <%s-name> is %s but got %s. Ignoring.'\
- % (end_stmt.type.lower(), start_stmt.name, end_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.'\
+ % (end_stmt.type.lower(), start_stmt.name, end_stmt.name))
+ else:
+ end_stmt.name = start_stmt.name
return content,
match = staticmethod(match)
@@ -432,13 +437,16 @@
############################### SECTION 2 ####################################
###############################################################################
-class Program(Base): # R201
+class Program(BlockBase): # R201
"""
<program> = <program-unit>
[ <program-unit> ] ...
"""
subclass_names = []
use_names = ['Program_Unit']
+ def match(reader):
+ return BlockBase.match(Program_Unit, [Program_Unit], None, reader)
+ match = staticmethod(match)
class Program_Unit(Base): # R202
"""
@@ -684,10 +692,17 @@
subclass_names = ['Constant']
#R310: <intrinsic-operator> = <power-op> | <mult-op> | <add-op> | <concat-op> | <rel-op> | <not-op> | <and-op> | <or-op> | <equiv-op>
-#R311: <defined-operator> = <defined--unary-op> | <defined-binary-op> | <extended-intrinsic-op>
+#R311: <defined-operator> = <defined-unary-op> | <defined-binary-op> | <extended-intrinsic-op>
#R312: <extended-intrinsic-op> = <intrinsic-op>
-#R313: <label> = <digit> [ <digit> [ <digit> [ <digit> [ <digit> ] ] ] ]
+class Label(StringBase): # R313
+ """
+ <label> = <digit> [ <digit> [ <digit> [ <digit> [ <digit> ] ] ] ]
+ """
+ subclass_names = []
+ def match(string): return StringBase.match(pattern.abs_label, string)
+ match = staticmethod(match)
+
###############################################################################
############################### SECTION 4 ####################################
###############################################################################
@@ -2907,7 +2922,7 @@
subclass_names = []
use_names = ['Execution_Part_Construct']
-class If_Construct(Base):
+class If_Construct(Base): # R802
"""
<if-construct> = <if-then-stmt>
<block>
@@ -2919,39 +2934,45 @@
]
<end-if-stmt>
"""
+ subclass_names = []
use_names = ['If_Then_Stmt', 'Block', 'Else_If_Stmt', 'Else_Stmt', 'End_If_Stmt']
-class If_Then_Stmt(Base):
+class If_Then_Stmt(Base): # R803
"""
<if-then-stmt> = [ <if-construct-name> : ] IF ( <scalar-logical-expr> ) THEN
"""
+ subclass_names = []
use_names = ['If_Construct_Name', 'Scalar_Logical_Expr']
-class Else_If_Stmt(Base):
+class Else_If_Stmt(Base): # 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):
+class Else_Stmt(Base): # R805
"""
<else-stmt> = ELSE [ <if-construct-name> ]
"""
+ subclass_names = []
use_names = ['If_Construct_Name']
-class End_If_Stmt(Base):
+class End_If_Stmt(Base): # R806
"""
<end-if-stmt> = END IF [ <if-construct-name> ]
"""
+ subclass_names = []
use_names = ['If_Construct_Name']
-class If_Stmt(Base):
+class If_Stmt(Base): # R807
"""
<if-stmt> = IF ( <scalar-logical-expr> ) <action-stmt>
"""
+ subclass_names = []
use_names = ['Scalar_Logical_Expr', 'Action_Stmt']
-class Case_Construct(Base):
+class Case_Construct(Base): # R808
"""
<case-construct> = <select-case-stmt>
[ <case-stmt>
@@ -2959,42 +2980,48 @@
]..
<end-select-stmt>
"""
+ subclass_names = []
use_names = ['Select_Case_Stmt', 'Case_Stmt', 'End_Select_Stmt']
-class Select_Case_Stmt(Base):
+class Select_Case_Stmt(Base): # R809
"""
<select-case-stmt> = [ <case-construct-name> : ] SELECT CASE ( <case-expr> )
"""
+ subclass_names = []
use_names = ['Case_Construct_Name', 'Case_Expr']
-class Case_Stmt(Base):
+class Case_Stmt(Base): # R810
"""
<case-stmt> = CASE <case-selector> [ <case-construct-name> ]
"""
+ subclass_names = []
use_names = ['Case_Selector', 'Case_Construct_Name']
-class End_Select_Stmt(Base):
+class End_Select_Stmt(Base): # R811
"""
<end-select-stmt> = END SELECT [ <case-construct-name> ]
"""
+ subclass_names = []
use_names = ['Case_Construct_Name']
-class Case_Expr(Base):
+class Case_Expr(Base): # R812
"""
<case-expr> = <scalar-int-expr>
| <scalar-char-expr>
| <scalar-logical-expr>
"""
+ subclass_names = []
subclass_names = ['Scalar_Int_Expr', 'Scalar_Char_Expr', 'Scalar_Logical_Expr']
-class Case_Selector(Base):
+class Case_Selector(Base): # R813
"""
<case-selector> = ( <case-value-range-list> )
| DEFAULT
"""
+ subclass_names = []
use_names = ['Case_Value_Range_List']
-class Case_Value_Range(Base):
+class Case_Value_Range(Base): # R814
"""
<case-value-range> = <case-value>
| <case-value> :
@@ -3012,40 +3039,44 @@
subclass_names = ['Scalar_Int_Initialization_Expr', 'Scalar_Char_Initialization_Expr', 'Scalar_Logical_Initialization_Expr']
-class Associate_Construct(Base):
+class Associate_Construct(Base): # R816
"""
<associate-construct> = <associate-stmt>
<block>
<end-associate-stmt>
"""
+ subclass_names = []
use_names = ['Associate_Stmt', 'Block', 'End_Associate_Stmt']
-class Associate_Stmt(Base):
+class Associate_Stmt(Base): # R817
"""
<associate-stmt> = [ <associate-construct-name> : ] ASSOCIATE ( <association-list> )
"""
- use_names = ['Associate_Construct_Name', 'Associateion_List']
+ subclass_names = []
+ use_names = ['Associate_Construct_Name', 'Association_List']
-class Association(Base):
+class Association(Base): # R818
"""
<association> = <associate-name> => <selector>
"""
+ subclass_names = []
use_names = ['Associate_Name', 'Selector']
-class Selector(Base):
+class Selector(Base): # R819
"""
<selector> = <expr>
| <variable>
"""
subclass_names = ['Expr', 'Variable']
-class End_Associate_Stmt(Base):
+class End_Associate_Stmt(Base): # R820
"""
<end-associate-stmt> = END ASSOCIATE [ <associate-construct-name> ]
"""
+ subclass_names = []
use_names = ['Associate_Construct_Name']
-class Select_Type_Construct(Base):
+class Select_Type_Construct(Base): # R821
"""
<select-type-construct> = <select-type-stmt>
[ <type-guard-stmt>
@@ -3053,96 +3084,225 @@
]...
<end-select-type-stmt>
"""
+ subclass_names = []
use_names = ['Select_Type_Stmt', 'Type_Guard_Stmt', 'Block', 'End_Select_Type_Stmt']
-class Select_Type_Stmt(Base):
+class Select_Type_Stmt(Base): # 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):
+class Type_Guard_Stmt(Base): # R823
"""
<type-guard-stmt> = TYPE IS ( <type-spec> ) [ <select-construct-name> ]
| CLASS IS ( <type-spec> ) [ <select-construct-name> ]
| CLASS DEFAULT [ <select-construct-name> ]
"""
+ subclass_names = []
use_names = ['Type_Spec', 'Select_Construct_Name']
-class End_Select_Type_Stmt(Base):
+class End_Select_Type_Stmt(Base): # R824
"""
<end-select-type-stmt> = END SELECT [ <select-construct-name> ]
"""
+ subclass_names = []
use_names = ['Select_Construct_Name']
-class Do_Construct(Base):
+class Do_Construct(Base): # R825
"""
<do-construct> = <block-do-construct>
| <nonblock-do-construct>
"""
subclass_names = ['Block_Do_Construct', 'Nonblock_Do_Construct']
-class Block_Do_Construct(Base):
+class Block_Do_Construct(Base): # R826
"""
<block-do-construct> = <do-stmt>
<do-block>
<end-do>
"""
+ subclass_names = []
use_names = ['Do_Stmt', 'Do_Block', 'End_Do']
-class Do_Stmt(Base):
+class Do_Stmt(Base): # R827
"""
<do-stmt> = <label-do-stmt>
| <nonlabel-do-stmt>
"""
subclass_names = ['Label_Do_Stmt', 'Nonlabel_Do_Stmt']
-class Label_Do_Stmt(Base):
+class Label_Do_Stmt(Base): # 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):
+class Nonlabel_Do_Stmt(Base): # R829
"""
<nonlabel-do-stmt> = [ <do-construct-name> : ] DO [ <loop-control> ]
"""
+ subclass_names = []
use_names = ['Do_Construct_Name', 'Loop_Control']
-class Loop_Control(Base):
+class Loop_Control(Base): # R830
"""
<loop-control> = [ , ] <do-variable> = <scalar-int-expr> , <scalar-int-expr> [ , <scalar-int-expr> ]
| [ , ] WHILE ( <scalar-logical-expr> )
"""
+ subclass_names = []
use_names = ['Do_Variable', 'Scalar_Int_Expr', 'Scalar_Logical_Expr']
-class Do_Variable(Base):
+class Do_Variable(Base): # R831
"""
<do-variable> = <scalar-int-variable>
"""
subclass_names = ['Scalar_Int_Variable']
-class Do_Block(Base):
+class Do_Block(Base): # R832
"""
<do-block> = <block>
"""
subclass_names = ['Block']
-class End_Do(Base):
+class End_Do(Base): # R833
"""
<end-do> = <end-do-stmt>
| <continue-stmt>
"""
subclass_names = ['End_Do_Stmt', 'Continue_Stmt']
-class End_Do_Stmt(Base):
+class End_Do_Stmt(Base): # R834
"""
<end-do-stmt> = END DO [ <do-construct-name> ]
"""
+ subclass_names = []
use_names = ['Do_Construct_Name']
-#...
+class Nonblock_Do_Construct(Base): # R835
+ """
+ <nonblock-do-stmt> = <action-term-do-construct>
+ | <outer-shared-do-construct>
+ """
+ subclass_names = ['Action_Term_Do_Construct', 'Outer_Shared_Do_Construct']
+class Action_Term_Do_Construct(Base): # R836
+ """
+ <action-term-do-construct> = <label-do-stmt>
+ <do-body>
+ <do-term-action-stmt>
+ """
+ subclass_names = []
+ use_names = ['Label_Do_Stmt', 'Do_Body', 'Do_Term_Action_Stmt']
+
+class Do_Body(Base): # R837
+ """
+ <do-body> = [ <execution-part-construct> ]...
+ """
+ subclass_names = []
+ use_names = ['Execution_Part_Construct']
+
+class Do_Term_Action_Stmt(Base): # 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']
+
+class Outer_Shared_Do_Construct(Base): # R839
+ """
+ <outer-shared-do-construct> = <label-do-stmt>
+ <do-body>
+ <shared-term-do-construct>
+ """
+ subclass_names = []
+ use_names = ['Label_Do_Stmt', 'Do_Body', 'Shared_Term_Do_Construct']
+
+class Shared_Term_Do_Construct(Base): # R840
+ """
+ <shared-term-do-construct> = <outer-shared-do-construct>
+ | <inner-shared-do-construct>
+ """
+ subclass_names = ['Outer_Shared_Do_Construct', 'Inner_Shared_Do_Construct']
+
+class Inner_Shared_Do_Construct(Base): # R841
+ """
+ <inner-shared-do-construct> = <label-do-stmt>
+ <do-body>
+ <do-term-shared-stmt>
+ """
+ subclass_names = []
+ use_names = ['Label_Do_Stmt', 'Do_Body', 'Do_Term_Shared_Stmt']
+
+class Do_Term_Shared_Stmt(Base): # R842
+ """
+ <do-term-shared-stmt> = <action-stmt>
+ C826: see C824 above.
+ """
+ subclass_names = ['Action_Stmt']
+
+class Cycle_Stmt(Base): # R843
+ """
+ <cycle-stmt> = CYCLE [ <do-construct-name> ]
+ """
+ subclass_names = []
+ use_names = ['Do_Construct_Name']
+
+class Exit_Stmt(Base): # R844
+ """
+ <exit-stmt> = EXIT [ <do-construct-name> ]
+ """
+ subclass_names = []
+ use_names = ['Do_Construct_Name']
+
+class Goto_Stmt(Base): # R845
+ """
+ <goto-stmt> = GO TO <label>
+ """
+ subclass_names = []
+ use_names = ['Label']
+
+class Computed_Goto_Stmt(Base): # 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
+ """
+ <arithmetic-if-stmt> = IF ( <scalar-numeric-expr> ) <label> , <label> , <label>
+ """
+ subclass_names = []
+ use_names = ['Scalar_Numeric_Expr', 'Label']
+
+class Continue_Stmt(Base): # R848
+ """
+ <continue-stmt> = CONTINUE
+ """
+ subclass_names = []
+
+class Stop_Stmt(Base): # R849
+ """
+ <stop-stmt> = STOP [ <stop-code> ]
+ """
+ subclass_names = []
+ use_names = ['Stop_Code']
+
+class Stop_Code(StringBase): # R850
+ """
+ <stop-code> = <scalar-char-constant>
+ | <digit> [ <digit> [ <digit> [ <digit> [ <digit> ] ] ] ]
+ """
+ subclass_names = ['Scalar_Char_Constant']
+ def match(string): return StringBase.match(pattern.abs_label, string)
+ match = staticmethod(match)
+
+
###############################################################################
############################### SECTION 9 ####################################
###############################################################################
@@ -3155,6 +3315,309 @@
"""
subclass_names = ['File_Unit_Number', 'Internal_File_Variable']
+class File_Unit_Number(Base): # R902
+ """
+ <file-unit-number> = <scalar-int-expr>
+ """
+ subclass_names = ['Scalar_Int_Expr']
+
+class Internal_File_Variable(Base): # R903
+ """
+ <internal-file-variable> = <char-variable>
+ C901: <char-variable> shall not be an array section with a vector subscript.
+ """
+ subclass_names = ['Char_Variable']
+
+class Open_Stmt(Base): # R904
+ """
+ <open-stmt> = OPEN ( <connect-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['Connect_Spec_List']
+
+class Connect_Spec(Base): # R905
+ """
+ <connect-spec> = [ UNIT = ] <file-unit-number>
+ | ACCESS = <scalar-default-char-expr>
+ | ACTION = <scalar-default-char-expr>
+ | ASYNCHRONOUS = <scalar-default-char-expr>
+ | BLANK = <scalar-default-char-expr>
+ | DECIMAL = <scalar-default-char-expr>
+ | DELIM = <scalar-default-char-expr>
+ | ENCODING = <scalar-default-char-expr>
+ | ERR = <label>
+ | FILE = <file-name-expr>
+ | FORM = <scalar-default-char-expr>
+ | IOMSG = <iomsg-variable>
+ | IOSTAT = <scalar-int-variable>
+ | PAD = <scalar-default-char-expr>
+ | POSITION = <scalar-default-char-expr>
+ | RECL = <scalar-int-expr>
+ | ROUND = <scalar-default-char-expr>
+ | SIGN = <scalar-default-char-expr>
+ | STATUS = <scalar-default-char-expr>
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Scalar_Default_Char_Expr', 'Label', 'File_Name_Expr', 'Iomsg_Variable',
+ 'Scalar_Int_Expr', 'Scalar_Int_Variable']
+
+class File_Name_Expr(Base): # R906
+ """
+ <file-name-expr> = <scalar-default-char-expr>
+ """
+ subclass_names = ['Scalar_Default_Char_Expr']
+
+class Iomsg_Variable(Base): # R907
+ """
+ <iomsg-variable> = <scalar-default-char-variable>
+ """
+ subclass_names = ['Scalar_Default_Char_Variable']
+
+class Close_Stmt(Base): # R908
+ """
+ <close-stmt> = CLOSE ( <close-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['Close_Spec_List']
+
+class Close_Spec(Base): # R909
+ """
+ <close-spec> = [ UNIT = ] <file-unit-number>
+ | IOSTAT = <scalar-int-variable>
+ | IOMSG = <iomsg-variable>
+ | ERR = <label>
+ | STATUS = <scalar-default-char-expr>
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Scalar_Default_Char_Expr', 'Label', 'Iomsg_Variable',
+ 'Scalar_Int_Variable']
+
+class Read_Stmt(Base): # R910
+ """
+ <read-stmt> = READ ( <io-control-spec-list> ) [ <input-item-list> ]
+ | READ <format> [ , <input-item-list> ]
+ """
+ subclass_names = []
+ use_names = ['Io_Control_Spec_List', 'Input_Item_List', 'Format']
+
+class Write_Stmt(Base): # 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
+ """
+ <print-stmt> = PRINT <format> [ , <output-item-list> ]
+ """
+ subclass_names = []
+ use_names = ['Format', 'Output_Item_List']
+
+class Io_Control_Spec(Base): # R913
+ """
+ <io-control-spec> = [ UNIT = ] <io-unit>
+ | [ FMT = ] <format>
+ | [ NML = ] <namelist-group-name>
+ | ADVANCE = <scalar-default-char-expr>
+ | ASYNCHRONOUS = <scalar-char-initialization-expr>
+ | BLANK = <scalar-default-char-expr>
+ | DECIMAL = <scalar-default-char-expr>
+ | DELIM = <scalar-default-char-expr>
+ | END = <label>
+ | EOR = <label>
+ | ERR = <label>
+ | ID = <scalar-int-variable>
+ | IOMSG = <iomsg-variable>
+ | IOSTAT = <scalar-int-variable>
+ | PAD = <scalar-default-char-expr>
+ | POS = <scalar-int-expr>
+ | REC = <scalar-int-expr>
+ | ROUND = <scalar-default-char-expr>
+ | SIGN = <scalar-default-char-expr>
+ | SIZE = <scalar-int-variable>
+ """
+ subclass_names = []
+ 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']
+
+class Format(Base): # R914
+ """
+ <format> = <default-char-expr>
+ | <label>
+ | *
+ """
+ subclass_names = ['Default_Char_Expr', 'Label']
+
+class Input_Item(Base): # R915
+ """
+ <input-item> = <variable>
+ | <io-implied-do>
+ """
+ subclass_names = ['Variable', 'Io_Implied_Do']
+
+class Output_Item(Base): # R916
+ """
+ <output-item> = <expr>
+ | <io-implied-do>
+ """
+ subclass_names = ['Expr', 'Io_Implied_Do']
+
+class Io_Implied_Do(Base): # R917
+ """
+ <io-implied-do> = ( <io-implied-do-object-list> , <io-implied-do-control> )
+ """
+ subclass_names = []
+ use_names = ['Io_Implied_Do_Object_List', 'Io_Implied_Do_Control']
+
+class Io_Implied_Do_Object(Base): # R918
+ """
+ <io-implied-do-object> = <input-item>
+ | <output-item>
+ """
+ subclass_names = ['Input_Item', 'Output_Item']
+
+class Io_Implied_Do_Control(Base): # R919
+ """
+ <io-implied-do-control> = <do-variable> = <scalar-int-expr> , <scalar-int-expr> [ , <scalar-int-expr> ]
+ """
+ subclass_names = []
+ use_names = ['Do_Variable', 'Scalar_Int_Expr']
+
+class Dtv_Type_Spec(Base): # R920
+ """
+ <dtv-type-spec> = TYPE ( <derived-type-spec> )
+ | CLASS ( <derived-type-spec> )
+ """
+ subclass_names = []
+ use_names = ['Derived_Type_Spec']
+
+class Wait_Stmt(Base): # R921
+ """
+ <wait-stmt> = WAIT ( <wait-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['Wait_Spec_List']
+
+class Wait_Spec(Base): # R922
+ """
+ <wait-spec> = [ UNIT = ] <file-unit-number>
+ | END = <label>
+ | EOR = <label>
+ | ERR = <label>
+ | ID = <scalar-int-expr>
+ | IOMSG = <iomsg-variable>
+ | IOSTAT = <scalar-int-variable>
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Label', 'Scalar_Int_Expr', 'Iomsg_Variable', 'Scalar_Int_Variable']
+
+class Backspace_Stmt(Base): # R923
+ """
+ <backspace-stmt> = BACKSPACE <file-unit-number>
+ | BACKSPACE ( <position-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Position_Spec_List']
+
+class Endfile_Stmt(Base): # R924
+ """
+ <endfile-stmt> = ENDFILE <file-unit-number>
+ | ENDFILE ( <position-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Position_Spec_List']
+
+class Rewind_Stmt(Base): # R925
+ """
+ <rewind-stmt> = REWIND <file-unit-number>
+ | REWIND ( <position-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Position_Spec_List']
+
+class Position_Spec(Base): # R926
+ """
+ <position-spec> = [ UNIT = ] <file-unit-number>
+ | IOMSG = <iomsg-variable>
+ | IOSTAT = <scalar-int-variable>
+ | ERR = <label>
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Iomsg_Variable', 'Scalar_Int_Variable', 'Label']
+
+class Flush_Stmt(Base): # R927
+ """
+ <flush-stmt> = FLUSH <file-unit-number>
+ | FLUSH ( <position-spec-list> )
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Position_Spec_List']
+
+class Flush_Spec(Base): # R928
+ """
+ <flush-spec> = [ UNIT = ] <file-unit-number>
+ | IOMSG = <iomsg-variable>
+ | IOSTAT = <scalar-int-variable>
+ | ERR = <label>
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'Iomsg_Variable', 'Scalar_Int_Variable', 'Label']
+
+class Inquire_Stmt(Base): # R929
+ """
+ <inquire-stmt> = INQUIRE ( <inquire-spec-list> )
+ | INQUIRE ( IOLENGTH = <scalar-int-variable> ) <output-item-list>
+ """
+ subclass_names = []
+ use_names = ['Inquire_Spec_List', 'Scalar_Int_Variable', 'Output_Item_List']
+
+class Inquire_Spec(Base): # R930
+ """
+ <inquire-spec> = [ UNIT = ] <file-unit-number>
+ | FILE = <file-name-expr>
+ | ACCESS = <scalar-default-char-variable>
+ | ACTION = <scalar-default-char-variable>
+ | ASYNCHRONOUS = <scalar-default-char-variable>
+ | BLANK = <scalar-default-char-variable>
+ | DECIMAL = <scalar-default-char-variable>
+ | DELIM = <scalar-default-char-variable>
+ | DIRECT = <scalar-default-char-variable>
+ | ENCODING = <scalar-default-char-variable>
+ | ERR = <label>
+ | EXIST = <scalar-default-logical-variable>
+ | FORM = <scalar-default-char-variable>
+ | FORMATTED = <scalar-default-char-variable>
+ | ID = <scalar-int-expr>
+ | IOMSG = <iomsg-variable>
+ | IOSTAT = <scalar-int-variable>
+ | NAME = <scalar-default-char-variable>
+ | NAMED = <scalar-default-logical-variable>
+ | NEXTREC = <scalar-int-variable>
+ | NUMBER = <scalar-int-variable>
+ | OPENED = <scalar-default-logical-variable>
+ | PAD = <scalar-default-char-variable>
+ | PENDING = <scalar-default-logical-variable>
+ | POS = <scalar-int-variable>
+ | POSITION = <scalar-default-char-variable>
+ | READ = <scalar-default-char-variable>
+ | READWRITE = <scalar-default-char-variable>
+ | RECL = <scalar-int-variable>
+ | ROUND = <scalar-default-char-variable>
+ | SEQUENTIAL = <scalar-default-char-variable>
+ | SIGN = <scalar-default-char-variable>
+ | SIZE = <scalar-int-variable>
+ | STREAM = <scalar-default-char-variable>
+ | UNFORMATTED = <scalar-default-char-variable>
+ | WRITE = <scalar-default-char-variable>
+ """
+ subclass_names = []
+ use_names = ['File_Unit_Number', 'File_Name_Expr', 'Scalar_Default_Char_Variable',
+ 'Scalar_Default_Logical_Variable', 'Scalar_Int_Variable', 'Scalar_Int_Expr',
+ 'Label', 'Iomsg_Variable']
+
+
###############################################################################
############################### SECTION 10 ####################################
###############################################################################
@@ -3916,6 +4379,7 @@
def _rpl_list(clsname):
if not Base_classes.has_key(clsname):
+ print 'Not implemented:',clsname
return [] # remove this code when all classes are implemented
cls = Base_classes[clsname]
if cls.__dict__.has_key('match'): return [clsname]
@@ -3956,7 +4420,7 @@
else:
print '%s not implemented needed by %s' % (n,clsname)
-if 0:
+if 1:
for cls in Base_classes.values():
subclasses = Base.subclasses.get(cls.__name__,[])
subclasses_names = [c.__name__ for c in subclasses]
@@ -3970,7 +4434,7 @@
break
if n not in subclasses_names:
print '%s needs to be added to %s subclass_name list' % (n,cls.__name__)
- for n in use_names:
+ for n in use_names + subclass_names:
if not Base_classes.has_key(n):
print '%s not defined used by %s' % (n, cls.__name__)
Modified: trunk/numpy/f2py/lib/parser/pattern_tools.py
===================================================================
--- trunk/numpy/f2py/lib/parser/pattern_tools.py 2006-10-31 14:58:19 UTC (rev 3422)
+++ trunk/numpy/f2py/lib/parser/pattern_tools.py 2006-11-01 10:09:49 UTC (rev 3423)
@@ -274,6 +274,7 @@
defined_unary_op = Pattern('<defined-unary-op>','[.][A-Z]+[.]',flags=re.I)
defined_binary_op = Pattern('<defined-binary-op>','[.][A-Z]+[.]',flags=re.I)
defined_operator = defined_unary_op | defined_binary_op | extended_intrinsic_operator
+abs_defined_operator = abs(defined_operator)
non_defined_binary_op = intrinsic_operator | logical_literal_constant
Added: trunk/numpy/f2py/lib/parser/test_Fortran2003.py
===================================================================
--- trunk/numpy/f2py/lib/parser/test_Fortran2003.py 2006-10-31 14:58:19 UTC (rev 3422)
+++ trunk/numpy/f2py/lib/parser/test_Fortran2003.py 2006-11-01 10:09:49 UTC (rev 3423)
@@ -0,0 +1,226 @@
+from numpy.testing import *
+
+from Fortran2003 import *
+from api import get_reader
+
+class test_Program(NumpyTestCase):
+
+ def check_simple(self):
+ reader = get_reader('''\
+ subroutine foo
+ end subroutine foo
+ subroutine bar
+ end
+ ''')
+ cls = Program
+ a = cls(reader)
+ print a
+
+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()
More information about the Numpy-svn
mailing list