@@ -14,6 +14,9 @@ Useful Fortran standard references:
14
14
* Fortran 90 standard: ANSI X3.198-1992 (also ISO/IEC 1539:1991)
15
15
* Fortran 90 Handbook (J. Adams)
16
16
* Fortran 77 standard: ANSI X3.9-1978
17
+
18
+ Note that the 'Ord' instances provided here do not guarantee any specific
19
+ behaviour, other than being valid instances (they are largely for convenience).
17
20
-}
18
21
19
22
module Language.Fortran.AST
@@ -172,7 +175,7 @@ data TypeSpec a = TypeSpec
172
175
, typeSpecSpan :: SrcSpan
173
176
, typeSpecBaseType :: BaseType
174
177
, typeSpecSelector :: Maybe (Selector a )
175
- } deriving stock (Eq , Show , Data , Generic , Functor )
178
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
176
179
177
180
-- | The "kind selector" of a declaration statement. Tightly bound to
178
181
-- 'TypeSpec'.
@@ -195,16 +198,16 @@ data Selector a = Selector
195
198
, selectorSpan :: SrcSpan
196
199
, selectorLength :: Maybe (Expression a )
197
200
, selectorKind :: Maybe (Expression a )
198
- } deriving stock (Eq , Show , Data , Generic , Functor )
201
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
199
202
200
203
data MetaInfo = MetaInfo { miVersion :: FortranVersion , miFilename :: String }
201
- deriving stock (Eq , Show , Data , Generic )
204
+ deriving stock (Eq , Ord , Show , Data , Generic )
202
205
203
206
-- Program structure definition
204
207
data ProgramFile a = ProgramFile
205
208
{ programFileMeta :: MetaInfo
206
209
, programFileProgramUnits :: [ ProgramUnit a ]
207
- } deriving stock (Eq , Show , Data , Generic , Functor )
210
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
208
211
209
212
pfSetFilename :: String -> ProgramFile a -> ProgramFile a
210
213
pfSetFilename fn (ProgramFile mi pus) = ProgramFile (mi { miFilename = fn }) pus
@@ -259,7 +262,7 @@ data ProgramUnit a =
259
262
| PUComment -- ^ Program unit-level comment
260
263
a SrcSpan
261
264
(Comment a )
262
- deriving stock (Eq , Show , Data , Generic , Functor )
265
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
263
266
264
267
type Prefixes a = Maybe (AList Prefix a )
265
268
type Suffixes a = Maybe (AList Suffix a )
@@ -277,7 +280,7 @@ emptyPrefixSuffix = (emptyPrefixes, emptySuffixes)
277
280
data Prefix a = PfxRecursive a SrcSpan
278
281
| PfxElemental a SrcSpan
279
282
| PfxPure a SrcSpan
280
- deriving stock (Eq , Show , Data , Generic , Functor )
283
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
281
284
282
285
-- see C1241 & C1242 (Fortran2003)
283
286
validPrefixSuffix :: PrefixSuffix a -> Bool
@@ -291,7 +294,7 @@ validPrefixSuffix (mpfxs, msfxs) =
291
294
sfxs = aStrip' msfxs
292
295
293
296
data Suffix a = SfxBind a SrcSpan (Maybe (Expression a ))
294
- deriving stock (Eq , Show , Data , Generic , Functor )
297
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
295
298
296
299
programUnitBody :: ProgramUnit a -> [Block a ]
297
300
programUnitBody (PUMain _ _ _ bs _) = bs
@@ -323,7 +326,7 @@ programUnitSubprograms PUBlockData{} = Nothing
323
326
programUnitSubprograms PUComment {} = Nothing
324
327
325
328
newtype Comment a = Comment String
326
- deriving stock (Eq , Show , Data , Generic , Functor )
329
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
327
330
328
331
data Block a =
329
332
BlStatement -- ^ Statement
@@ -391,7 +394,7 @@ data Block a =
391
394
| BlComment -- ^ Block-level comment
392
395
a SrcSpan
393
396
(Comment a )
394
- deriving stock (Eq , Show , Data , Generic , Functor )
397
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
395
398
396
399
data Statement a =
397
400
StDeclaration
@@ -615,28 +618,28 @@ data Statement a =
615
618
-- Following is a temporary solution to a complicated FORMAT statement
616
619
-- parsing problem.
617
620
| StFormatBogus a SrcSpan String
618
- deriving stock (Eq , Show , Data , Generic , Functor )
621
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
619
622
620
623
-- R1214 proc-decl is procedure-entity-name [=> null-init]
621
624
data ProcDecl a = ProcDecl
622
625
{ procDeclAnno :: a
623
626
, procDeclSpan :: SrcSpan
624
627
, procDeclEntityName :: Expression a
625
628
, procDeclInitName :: Maybe (Expression a )
626
- } deriving stock (Eq , Show , Data , Generic , Functor )
629
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
627
630
628
631
-- R1212 proc-interface is interface-name or declaration-type-spec
629
632
data ProcInterface a = ProcInterfaceName a SrcSpan (Expression a )
630
633
| ProcInterfaceType a SrcSpan (TypeSpec a )
631
- deriving stock (Eq , Show , Data , Generic , Functor )
634
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
632
635
633
636
-- | Part of a FORALL statement. Introduced in Fortran 95.
634
637
data ForallHeader a = ForallHeader
635
638
{ forallHeaderAnno :: a
636
639
, forallHeaderSpan :: SrcSpan
637
640
, forallHeaderHeaders :: [ForallHeaderPart a ]
638
641
, forallHeaderScaling :: Maybe (Expression a )
639
- } deriving stock (Eq , Show , Data , Generic , Functor )
642
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
640
643
641
644
data ForallHeaderPart a = ForallHeaderPart
642
645
{ forallHeaderPartAnno :: a
@@ -645,13 +648,13 @@ data ForallHeaderPart a = ForallHeaderPart
645
648
, forallHeaderPartStart :: Expression a
646
649
, forallHeaderPartEnd :: Expression a
647
650
, forallHeaderPartStride :: Maybe (Expression a )
648
- } deriving stock (Eq , Show , Data , Generic , Functor )
651
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
649
652
650
653
data Only = Exclusive | Permissive
651
- deriving stock (Eq , Show , Data , Generic )
654
+ deriving stock (Eq , Ord , Show , Data , Generic )
652
655
653
656
data ModuleNature = ModIntrinsic | ModNonIntrinsic
654
- deriving stock (Eq , Show , Data , Generic )
657
+ deriving stock (Eq , Ord , Show , Data , Generic )
655
658
656
659
-- | Part of USE statement. /(F2018 14.2.2)/
657
660
--
@@ -664,15 +667,15 @@ data Use a =
664
667
| UseID
665
668
a SrcSpan
666
669
(Expression a ) -- ^ name
667
- deriving stock (Eq , Show , Data , Generic , Functor )
670
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
668
671
669
672
-- TODO potentially should throw Maybe String into ArgumentExpression too?
670
673
data Argument a = Argument
671
674
{ argumentAnno :: a
672
675
, argumentSpan :: SrcSpan
673
676
, argumentName :: Maybe String
674
677
, argumentExpr :: ArgumentExpression a
675
- } deriving stock (Eq , Show , Data , Generic , Functor )
678
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
676
679
677
680
-- | Extra data type to disambiguate between plain variable arguments and
678
681
-- expression arguments (due to apparent behaviour of some Fortran compilers
@@ -683,7 +686,7 @@ data Argument a = Argument
683
686
data ArgumentExpression a
684
687
= ArgExpr (Expression a )
685
688
| ArgExprVar a SrcSpan Name
686
- deriving stock (Eq , Show , Data , Generic , Functor )
689
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
687
690
688
691
instance Annotated ArgumentExpression where
689
692
getAnnotation = \ case
@@ -729,17 +732,17 @@ data Attribute a =
729
732
| AttrTarget a SrcSpan
730
733
| AttrValue a SrcSpan
731
734
| AttrVolatile a SrcSpan
732
- deriving stock (Eq , Show , Data , Generic , Functor )
735
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
733
736
734
737
data Intent = In | Out | InOut
735
- deriving stock (Eq , Show , Data , Generic )
738
+ deriving stock (Eq , Ord , Show , Data , Generic )
736
739
737
740
data ControlPair a = ControlPair
738
741
{ controlPairAnno :: a
739
742
, controlPairSpan :: SrcSpan
740
743
, controlPairName :: Maybe String
741
744
, controlPairExpr :: Expression a
742
- } deriving stock (Eq , Show , Data , Generic , Functor )
745
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
743
746
744
747
-- | Part of ALLOCATE statement.
745
748
--
@@ -754,22 +757,22 @@ data AllocOpt a =
754
757
a SrcSpan
755
758
(Expression a ) -- ^ scalar character variable
756
759
| AOSource a SrcSpan (Expression a )
757
- deriving stock (Eq , Show , Data , Generic , Functor )
760
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
758
761
759
762
-- | List of names for an IMPLICIT statement.
760
763
data ImpList a = ImpList
761
764
{ impListAnno :: a
762
765
, impListSpan :: SrcSpan
763
766
, impListType :: TypeSpec a
764
767
, impListElements :: AList ImpElement a
765
- } deriving stock (Eq , Show , Data , Generic , Functor )
768
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
766
769
767
770
data ImpElement a = ImpElement
768
771
{ impElementAnno :: a
769
772
, impElementSpan :: SrcSpan
770
773
, impElementFrom :: Char
771
774
, impElementTo :: Maybe Char
772
- } deriving stock (Eq , Show , Data , Generic , Functor )
775
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
773
776
774
777
-- | A single COMMON block definition.
775
778
--
@@ -779,14 +782,14 @@ data CommonGroup a = CommonGroup
779
782
, commonGroupSpan :: SrcSpan
780
783
, commonGroupName :: Maybe (Expression a )
781
784
, commonGroupVars :: AList Declarator a
782
- } deriving stock (Eq , Show , Data , Generic , Functor )
785
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
783
786
784
787
data Namelist a = Namelist
785
788
{ namelistAnno :: a
786
789
, namelistSpan :: SrcSpan
787
790
, namelistName :: Expression a
788
791
, namelistVars :: AList Expression a
789
- } deriving stock (Eq , Show , Data , Generic , Functor )
792
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
790
793
791
794
-- | The part of a DATA statement describing a single set of initializations.
792
795
--
@@ -799,7 +802,7 @@ data DataGroup a = DataGroup
799
802
, dataGroupSpan :: SrcSpan
800
803
, dataGroupNames :: AList Expression a
801
804
, dataGroupInitializers :: AList Expression a
802
- } deriving stock (Eq , Show , Data , Generic , Functor )
805
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
803
806
804
807
-- | Field types in pre-Fortran 90 non-standard structure/record/union
805
808
-- extension.
@@ -821,13 +824,13 @@ data StructureItem a =
821
824
(Maybe String ) -- ^ Substructure name
822
825
String -- ^ Field name
823
826
(AList StructureItem a ) -- ^ Substructure fields
824
- deriving stock (Eq , Show , Data , Generic , Functor )
827
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
825
828
826
829
data UnionMap a = UnionMap
827
830
{ unionMapAnno :: a
828
831
, unionMapSpan :: SrcSpan
829
832
, unionMapFields :: AList StructureItem a
830
- } deriving stock (Eq , Show , Data , Generic , Functor )
833
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
831
834
832
835
data FormatItem a =
833
836
FIFormatList a SrcSpan (Maybe String ) (AList FormatItem a )
@@ -838,7 +841,7 @@ data FormatItem a =
838
841
| FIFieldDescriptorAIL a SrcSpan (Maybe Integer ) Char Integer
839
842
| FIBlankDescriptor a SrcSpan Integer
840
843
| FIScaleFactor a SrcSpan Integer
841
- deriving stock (Eq , Show , Data , Generic , Functor )
844
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
842
845
843
846
-- | Part of the newer (Fortran 2003?) FLUSH statement.
844
847
--
@@ -856,15 +859,15 @@ data FlushSpec a
856
859
| FSErr
857
860
a SrcSpan
858
861
(Expression a ) -- ^ statement label
859
- deriving stock (Eq , Show , Data , Generic , Functor )
862
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
860
863
861
864
data DoSpecification a = DoSpecification
862
865
{ doSpecAnno :: a
863
866
, doSpecSpan :: SrcSpan
864
867
, doSpecInitial :: Statement a -- ^ Guaranteed to be 'StExpressionAssign'
865
868
, doSpecLimit :: Expression a
866
869
, doSpecIncrement :: Maybe (Expression a )
867
- } deriving stock (Eq , Show , Data , Generic , Functor )
870
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
868
871
869
872
data Expression a =
870
873
ExpValue a SrcSpan (Value a )
@@ -885,15 +888,15 @@ data Expression a =
885
888
-- ^ Array initialisation
886
889
| ExpReturnSpec a SrcSpan (Expression a )
887
890
-- ^ Function return value specification
888
- deriving stock (Eq , Show , Data , Generic , Functor )
891
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
889
892
890
893
data Index a =
891
894
IxSingle a SrcSpan (Maybe String ) (Expression a )
892
895
| IxRange a SrcSpan
893
896
(Maybe (Expression a )) -- ^ Lower index
894
897
(Maybe (Expression a )) -- ^ Upper index
895
898
(Maybe (Expression a )) -- ^ Stride
896
- deriving stock (Eq , Show , Data , Generic , Functor )
899
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
897
900
898
901
-- | Values and literals.
899
902
--
@@ -925,7 +928,7 @@ data Value a
925
928
| ValType String
926
929
| ValStar
927
930
| ValColon -- see R402 / C403 in Fortran2003 spec.
928
- deriving stock (Eq , Show , Data , Generic , Functor )
931
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
929
932
deriving anyclass (NFData , Out )
930
933
931
934
-- | Declarators. R505 entity-decl from F90 ISO spec.
@@ -949,12 +952,12 @@ data Declarator a = Declarator
949
952
, declaratorType :: DeclaratorType a
950
953
, declaratorLength :: Maybe (Expression a )
951
954
, declaratorInitial :: Maybe (Expression a )
952
- } deriving stock (Eq , Show , Data , Generic , Functor )
955
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
953
956
954
957
data DeclaratorType a
955
958
= ScalarDecl
956
959
| ArrayDecl (AList DimensionDeclarator a )
957
- deriving stock (Eq , Show , Data , Generic , Functor )
960
+ deriving stock (Eq , Ord , Show , Data , Generic , Functor )
958
961
959
962
-- | Set a 'Declarator''s initializing expression only if it has none already.
960
963
setInitialisation :: Declarator a -> Expression a -> Declarator a
@@ -968,7 +971,7 @@ data DimensionDeclarator a = DimensionDeclarator
968
971
, dimDeclSpan :: SrcSpan
969
972
, dimDeclLower :: Maybe (Expression a )
970
973
, dimDeclUpper :: Maybe (Expression a )
971
- } deriving stock (Eq , Show , Data , Generic , Functor )
974
+ } deriving stock (Eq , Ord , Show , Data , Generic , Functor )
972
975
973
976
data UnaryOp =
974
977
Plus
0 commit comments