%%%%%%%%%%
%% This Fortran grammar is structured according to document ISO/IEC 1539:1991. 
%% Rulenumbers are named R2xx - R12xx as in Annex D of 1539:1991
%% The grammar is adapted from an ELI project grammer, http://eli-project.cvs.sourceforge.net/eli-project
%%
%%%%%%%%%%
%% ISO/IEC 1539:1991 section R2xx Fortran terms and concepts
%%%%%%%%%%

module languages/fortran/syntax/Fortran90

%%imports languages/fortran/syntax/FortranLex
imports languages/fortran/syntax/R400DataTypes
imports languages/fortran/syntax/R500DataDeclarations
imports languages/fortran/syntax/R600UseDataObjects
imports languages/fortran/syntax/R700Expressions
imports languages/fortran/syntax/R800ExecutionControl
imports languages/fortran/syntax/R900IOStatements
imports languages/fortran/syntax/R1000_IOEditing
imports languages/fortran/syntax/R1100ProgramUnits
imports languages/fortran/syntax/R1200Procedures

exports

sorts
  ActionStmt ArrayName Body
  BodyConstruct CommonBlockName ComponentName DeclarationConstruct DefinedOperator
  DummyArgName EndName EntryName ExecutableConstruct ExecutableProgram
  ExecutionPartConstruct ExternalName FunctionName GenericName ImpliedDoVariable
  InternalSubProgPart InternalSubprogram IntrinsicProcedureName  MainProgram
  MainRange  ModuleSubprogram ModuleSubprogramPartConstruct Name
  NamelistGroupName ObjectName ProgramName ProgramUnit SFDummyArgName
  SpecificationPartConstruct SpecificationStmt SubroutineName SubroutineNameUse TypeName
  VariableName   
  

context-free start-symbols 
  ExecutableProgram

context-free syntax

%%R201 JD: the optional startcommentblock is needed to parse comment lines in 1st lines of a file.
%% original: ExecutableProgram ProgramUnit -> ExecutableProgram
  StartCommentBlock? ProgramUnit+       -> ExecutableProgram

%%R202
%%R203
  MainProgram                           -> ProgramUnit
  FunctionSubprogram                    -> ProgramUnit
  SubroutineSubprogram                  -> ProgramUnit
  Module                                -> ProgramUnit
  BlockDataSubprogram                   -> ProgramUnit


%%R1101
  ProgramStmt? MainRange                -> MainProgram
  BodyConstruct+ EndProgramStmt         -> MainRange
  InternalSubProgPart EndProgramStmt    -> MainRange
  EndProgramStmt                        -> MainRange

  SpecificationPartConstruct            -> BodyConstruct
  ExecutableConstruct                   -> BodyConstruct
  BodyConstruct+                        -> Body

%%R204
  ImplicitStmt                          -> SpecificationPartConstruct
  ParameterStmt                         -> SpecificationPartConstruct
  FormatStmt                            -> SpecificationPartConstruct
  EntryStmt                             -> SpecificationPartConstruct
  DeclarationConstruct                  -> SpecificationPartConstruct
  UseStmt                               -> SpecificationPartConstruct

%%R207
  TypeDeclarationStmt                   -> DeclarationConstruct
  SpecificationStmt                     -> DeclarationConstruct
  DerivedTypeDef                        -> DeclarationConstruct
  InterfaceBlock                        -> DeclarationConstruct

%%R209
  ExecutableConstruct                   -> ExecutionPartConstruct
  FormatStmt                            -> ExecutionPartConstruct
  DataStmt                              -> ExecutionPartConstruct
  EntryStmt                             -> ExecutionPartConstruct

%%R214                     
  AccessStmt                            -> SpecificationStmt
  AllocatableStmt                       -> SpecificationStmt
  CommonStmt                            -> SpecificationStmt
  DataStmt                              -> SpecificationStmt
  DimensionStmt                         -> SpecificationStmt
  EquivalenceStmt                       -> SpecificationStmt
  ExternalStmt                          -> SpecificationStmt
  IntrinsicStmt                         -> SpecificationStmt
  SaveStmt                              -> SpecificationStmt
  IntentStmt                            -> SpecificationStmt
  NamelistStmt                          -> SpecificationStmt
  OptionalStmt                          -> SpecificationStmt
  PointerStmt                           -> SpecificationStmt
  TargetStmt                            -> SpecificationStmt

%%R210
  Body ContainsStmt   InternalSubprogram        -> InternalSubProgPart
  ContainsStmt        InternalSubprogram        -> InternalSubProgPart
  InternalSubProgPart InternalSubprogram        -> InternalSubProgPart

%%R211
  FunctionSubprogram            -> InternalSubprogram
  SubroutineSubprogram          -> InternalSubprogram

%%R212
  ContainsStmt                  -> ModuleSubprogramPartConstruct
  ModuleSubprogram              -> ModuleSubprogramPartConstruct

%%R213
  FunctionSubprogram            -> ModuleSubprogram
  SubroutineSubprogram          -> ModuleSubprogram

%%R215
  ActionStmt                    -> ExecutableConstruct
  DoConstruct                   -> ExecutableConstruct
  IfConstruct                   -> ExecutableConstruct
  CaseConstruct                 -> ExecutableConstruct
  WhereConstruct                -> ExecutableConstruct
  EndDoStmt                     -> ExecutableConstruct

%%R216
  AllocateStmt                  -> ActionStmt
  CycleStmt                     -> ActionStmt
  DeallocateStmt                -> ActionStmt
  ExitStmt                      -> ActionStmt
  NullifyStmt                   -> ActionStmt
  PointerAssignmentStmt         -> ActionStmt
  WhereStmt                     -> ActionStmt
  ArithmeticIfStmt              -> ActionStmt
  AssignmentStmt                -> ActionStmt
  AssignStmt                    -> ActionStmt
  BackspaceStmt                 -> ActionStmt
  CallStmt                      -> ActionStmt
  CloseStmt                     -> ActionStmt
  ContinueStmt                  -> ActionStmt
  EndfileStmt                   -> ActionStmt
  GotoStmt                      -> ActionStmt
  ComputedGotoStmt              -> ActionStmt
  AssignedGotoStmt              -> ActionStmt
  IfStmt                        -> ActionStmt
  InquireStmt                   -> ActionStmt
  OpenStmt                      -> ActionStmt
  PauseStmt                     -> ActionStmt
  PrintStmt                     -> ActionStmt
  ReadStmt                      -> ActionStmt
  ReturnStmt                    -> ActionStmt
  RewindStmt                    -> ActionStmt
%%  StmtFunctionStmt            -> ActionStmt see R1226 comment
  StopStmt                      -> ActionStmt
  WriteStmt                     -> ActionStmt


%%R311
  Dop                   -> DefinedOperator
  PowerOp               -> DefinedOperator
  MultOp                -> DefinedOperator
  AddOp                 -> DefinedOperator
  ConcatOp              -> DefinedOperator
  RelOp                 -> DefinedOperator
  NotOp                 -> DefinedOperator
  AndOp                 -> DefinedOperator
  OrOp                  -> DefinedOperator
  EquivOp               -> DefinedOperator