fparser Reference Guide  0.0.14
fparser.common.base_classes.BeginStatement Class Reference
Inheritance diagram for fparser.common.base_classes.BeginStatement:
Collaboration diagram for fparser.common.base_classes.BeginStatement:

Public Member Functions

def __init__ (self, parent, item=None)
 
def tostr (self)
 
def tofortran (self, isfix=None)
 
def torepr (self, depth=-1, incrtab="")
 
def process_item (self)
 
def fill (self, end_flag=False)
 
def process_subitem (self, item)
 
def handle_unknown_item_and_raise (self, item)
 
def analyze (self)
 
- Public Member Functions inherited from fparser.common.base_classes.Statement
def __init__ (self, parent, item)
 
def __repr__ (self)
 
def torepr (self, depth=-1, incrtab="")
 
def get_indent_tab (self, deindent=False, isfix=None)
 
def __str__ (self)
 
def asfix (self)
 
def format_message (self, kind, message)
 
def error (self, message)
 
def warning (self, message)
 
def info (self, message)
 
def analyze (self)
 
def get_variable (self, name)
 
def get_type (self, name)
 
def get_type_decl (self, kind)
 
def get_provides (self)
 
- Public Member Functions inherited from fparser.common.utils.classes
def __new__ (metacls, name, bases, dict)
 
- Public Member Functions inherited from fparser.common.utils.meta_classes
def __getattr__ (self, name)
 

Public Attributes

 content
 
 get_item
 
 put_item
 
 blocktype
 
 name
 
 construct_name
 
 classes
 
 pyf_classes
 
- Public Attributes inherited from fparser.common.base_classes.Statement
 parent
 
 reader
 
 top
 
 item
 
 programblock
 
 isvalid
 
 ignore
 
 a
 

Additional Inherited Members

- Static Public Attributes inherited from fparser.common.base_classes.Statement
list modes = ["free", "fix", "f77", "pyf"]
 

Detailed Description

[ construct_name : ] <blocktype> [ <name> ]

BeginStatement instances have additional attributes:
  name
  blocktype

Block instance has attributes:
  content - list of Line or Statement instances
  name    - name of the block, unnamed blocks are named
            with the line label
  construct_name - name of a construct
  parent  - Block or FortranParser instance
  item    - Line instance containing the block start statement
  get_item, put_item - methods to retrive/submit Line instances
            from/to Fortran reader.
  isvalid - boolean, when False, the Block instance will be ignored.

  stmt_cls, end_stmt_cls

Definition at line 760 of file base_classes.py.

Member Function Documentation

◆ fill()

def fparser.common.base_classes.BeginStatement.fill (   self,
  end_flag = False 
)
Fills blocks content until the end of block statement.

Definition at line 833 of file base_classes.py.

References fparser.common.base_classes.BeginStatement.classes, fparser.common.base_classes.BeginStatement.content, fparser.one.block_statements.BeginSource.get_classes(), fparser.one.block_statements.Module.get_classes(), fparser.one.block_statements.PythonModule.get_classes(), fparser.one.block_statements.BlockData.get_classes(), fparser.one.block_statements.Interface.get_classes(), fparser.one.block_statements.SubProgramStatement.get_classes(), fparser.one.block_statements.SelectCase.get_classes(), fparser.one.block_statements.SelectType.get_classes(), fparser.one.block_statements.Where.get_classes(), fparser.one.block_statements.Forall.get_classes(), fparser.one.block_statements.IfThen.get_classes(), fparser.one.block_statements.If.get_classes(), fparser.one.block_statements.Do.get_classes(), fparser.one.block_statements.Associate.get_classes(), fparser.one.block_statements.Type.get_classes(), fparser.one.block_statements.Enum.get_classes(), fparser.common.base_classes.BeginStatement.get_item, fparser.common.base_classes.Statement.modes, fparser.common.base_classes.BeginStatement.process_subitem(), fparser.common.base_classes.BeginStatement.pyf_classes, fparser.common.base_classes.Statement.reader, fparser.common.base_classes.Variable.warning(), and fparser.common.base_classes.Statement.warning().

833  def fill(self, end_flag=False):
834  """
835  Fills blocks content until the end of block statement.
836  """
837 
838  mode = self.reader.format.mode
839  class_list = self.get_classes()
840  self.classes = [cls for cls in class_list if mode in cls.modes]
841  self.pyf_classes = [cls for cls in class_list if "pyf" in cls.modes]
842 
843  item = self.get_item()
844  while item is not None:
845  if isinstance(item, Line):
846  if self.process_subitem(item):
847  end_flag = True
848  break
849  elif isinstance(item, Comment):
850  # TODO: FIX ME, Comment content is a string
851  self.content.append(classes.Comment(self, item))
852  else:
853  raise NotImplementedError(repr(item))
854  item = self.get_item()
855 
856  if not end_flag:
857  self.warning("failed to find the end of block")
858 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_unknown_item_and_raise()

def fparser.common.base_classes.BeginStatement.handle_unknown_item_and_raise (   self,
  item 
)
Called when process_subitem does not find a start or end of block.
It adds the item (which is an instance of Line) to the content, but
then raises an AnalyzeError. An instance of Line in content typically
results in other errors later (e.g. because Line has no analyze
method).

Definition at line 954 of file base_classes.py.

References fparser.one.statements.GeneralAssignment.__class__, fparser.one.statements.Read.__class__, and fparser.common.base_classes.BeginStatement.content.

954  def handle_unknown_item_and_raise(self, item):
955  """Called when process_subitem does not find a start or end of block.
956  It adds the item (which is an instance of Line) to the content, but
957  then raises an AnalyzeError. An instance of Line in content typically
958  results in other errors later (e.g. because Line has no analyze
959  method).
960  """
961  message = item.reader.format_message(
962  "WARNING",
963  'no parse pattern found for "%s" in %r block.'
964  % (item.get_line(), self.__class__.__name__),
965  item.span[0],
966  item.span[1],
967  )
968  logging.getLogger(__name__).warning(message)
969  self.content.append(item)
970  raise AnalyzeError(message)
971 
Here is the caller graph for this function:

◆ process_item()

def fparser.common.base_classes.BeginStatement.process_item (   self)
Process the line

Definition at line 826 of file base_classes.py.

References fparser.common.base_classes.BeginStatement.fill(), and fparser.common.base_classes.Statement.item.

826  def process_item(self):
827  """Process the line"""
828  item = self.item
829  if item is None:
830  return
831  self.fill()
832 
Here is the call graph for this function:

◆ process_subitem()

def fparser.common.base_classes.BeginStatement.process_subitem (   self,
  item 
)
Check if item is blocks start statement, if it is, read the block.

Return True to stop adding items to given block.

Definition at line 859 of file base_classes.py.

References fparser.one.statements.GeneralAssignment.__class__, fparser.one.statements.Read.__class__, fparser.common.base_classes.BeginStatement.classes, fparser.common.base_classes.BeginStatement.content, fparser.one.block_statements.BeginSource.end_stmt_cls, fparser.one.block_statements.Module.end_stmt_cls, fparser.one.block_statements.PythonModule.end_stmt_cls, fparser.one.block_statements.BlockData.end_stmt_cls, fparser.one.block_statements.Interface.end_stmt_cls, fparser.one.block_statements.Subroutine.end_stmt_cls, fparser.one.block_statements.Function.end_stmt_cls, fparser.one.block_statements.Select.end_stmt_cls, fparser.one.block_statements.Where.end_stmt_cls, fparser.one.block_statements.Forall.end_stmt_cls, fparser.one.block_statements.IfThen.end_stmt_cls, fparser.one.block_statements.Do.end_stmt_cls, fparser.one.block_statements.Associate.end_stmt_cls, fparser.one.block_statements.Type.end_stmt_cls, fparser.one.block_statements.Enum.end_stmt_cls, fparser.one.block_statements.BeginSource.get_classes(), fparser.one.block_statements.Module.get_classes(), fparser.one.block_statements.PythonModule.get_classes(), fparser.one.block_statements.BlockData.get_classes(), fparser.one.block_statements.Interface.get_classes(), fparser.one.block_statements.SubProgramStatement.get_classes(), fparser.one.block_statements.SelectCase.get_classes(), fparser.one.block_statements.SelectType.get_classes(), fparser.one.block_statements.Where.get_classes(), fparser.one.block_statements.Forall.get_classes(), fparser.one.block_statements.IfThen.get_classes(), fparser.one.block_statements.If.get_classes(), fparser.one.block_statements.Do.get_classes(), fparser.one.block_statements.Associate.get_classes(), fparser.one.block_statements.Type.get_classes(), fparser.one.block_statements.Enum.get_classes(), fparser.common.base_classes.BeginStatement.handle_unknown_item_and_raise(), fparser.two.C99Preprocessor.Cpp_Pp_Tokens.match(), fparser.two.pattern_tools.Pattern.match(), fparser.two.C99Preprocessor.Cpp_If_Stmt.match(), fparser.one.statements.GeneralAssignment.match, fparser.two.C99Preprocessor.Cpp_Elif_Stmt.match(), fparser.two.C99Preprocessor.Cpp_Else_Stmt.match(), fparser.one.statements.Assign.match, fparser.two.C99Preprocessor.Cpp_Endif_Stmt.match(), fparser.one.statements.Call.match, fparser.one.block_statements.EndSource.match, fparser.one.block_statements.BeginSource.match, fparser.one.statements.Goto.match, fparser.one.statements.ComputedGoto.match, fparser.one.block_statements.EndModule.match, fparser.one.block_statements.Module.match, fparser.one.statements.AssignedGoto.match, fparser.one.statements.Continue.match, fparser.one.typedecl_statements.Integer.match, fparser.one.statements.Return.match, fparser.one.typedecl_statements.Real.match, fparser.one.typedecl_statements.DoublePrecision.match, fparser.one.statements.Stop.match, fparser.one.typedecl_statements.Complex.match, fparser.two.C99Preprocessor.Cpp_Macro_Identifier_List.match(), fparser.one.block_statements.EndPythonModule.match, fparser.one.typedecl_statements.DoubleComplex.match, fparser.two.utils.BlockBase.match(), fparser.one.statements.Print.match, fparser.one.block_statements.PythonModule.match, fparser.one.typedecl_statements.Logical.match, fparser.one.typedecl_statements.Character.match, fparser.one.block_statements.EndProgram.match, fparser.one.typedecl_statements.Byte.match, fparser.one.typedecl_statements.Type.match, fparser.one.statements.Read.match, fparser.two.C99Preprocessor.Cpp_Undef_Stmt.match(), fparser.one.typedecl_statements.Class.match, fparser.one.block_statements.EndBlockData.match, fparser.one.typedecl_statements.Implicit.match, fparser.one.block_statements.BlockData.match, fparser.one.block_statements.EndInterface.match, fparser.one.statements.Write.match, fparser.one.block_statements.Interface.match, fparser.one.statements.Flush.match, fparser.one.statements.Wait.match, fparser.two.C99Preprocessor.Cpp_Warning_Stmt.match(), fparser.one.statements.Contains.match, fparser.one.statements.Allocate.match, fparser.one.statements.Deallocate.match, fparser.one.statements.ModuleProcedure.match, fparser.two.utils.SequenceBase.match(), fparser.one.statements.Access.match, fparser.one.block_statements.EndSubroutine.match, fparser.one.block_statements.Subroutine.match, fparser.one.block_statements.EndFunction.match, fparser.one.block_statements.Function.match, fparser.one.statements.Close.match, fparser.two.utils.UnaryOpBase.match(), fparser.one.statements.Cycle.match, fparser.two.utils.BinaryOpBase.match(), fparser.one.statements.FilePositioningStatement.match, fparser.one.block_statements.SubprogramPrefix.match, fparser.one.block_statements.EndSelect.match, fparser.one.statements.Open.match, fparser.one.block_statements.SelectCase.match, fparser.one.block_statements.SelectType.match, fparser.one.statements.Format.match, fparser.one.block_statements.EndWhere.match, fparser.two.utils.SeparatorBase.match(), fparser.one.block_statements.Where.match, fparser.one.statements.Save.match, fparser.one.block_statements.EndForall.match, fparser.two.utils.KeywordValueBase.match(), fparser.one.block_statements.Forall.match, fparser.two.Fortran2003.Digit_String.match(), fparser.one.statements.Data.match, fparser.one.block_statements.EndIfThen.match, fparser.one.block_statements.IfThen.match, fparser.one.statements.Nullify.match, fparser.one.block_statements.If.match, fparser.two.utils.BracketBase.match(), fparser.one.statements.Use.match, fparser.one.block_statements.EndDo.match, fparser.two.utils.NumberBase.match(), fparser.one.block_statements.Do.match, fparser.two.utils.CallBase.match(), fparser.one.statements.Exit.match, fparser.two.utils.CALLBase.match(), fparser.one.block_statements.EndAssociate.match, fparser.one.block_statements.Associate.match, fparser.one.statements.Parameter.match, fparser.two.utils.StringBase.match(), fparser.one.block_statements.EndType.match, fparser.one.statements.Equivalence.match, fparser.one.block_statements.Type.match, fparser.two.utils.STRINGBase.match(), fparser.one.statements.Dimension.match, fparser.one.statements.Target.match, fparser.one.statements.Pointer.match, fparser.two.utils.EndStmtBase.match(), fparser.one.statements.Protected.match, fparser.one.statements.Volatile.match, fparser.one.block_statements.EndEnum.match, fparser.one.statements.Value.match, fparser.one.block_statements.Enum.match, fparser.one.statements.ArithmeticIf.match, fparser.two.utils.WORDClsBase.match(), fparser.one.statements.Intrinsic.match, fparser.one.statements.Inquire.match, fparser.one.statements.Sequence.match, fparser.one.statements.External.match, fparser.one.statements.Namelist.match, fparser.two.utils.Type_Declaration_StmtBase.match(), fparser.one.statements.Common.match, fparser.one.statements.Optional.match, fparser.one.statements.Intent.match, fparser.one.statements.Entry.match, fparser.two.Fortran2003.Dimension_Component_Attr_Spec.match(), fparser.one.statements.Import.match, fparser.one.statements.Forall.match, fparser.one.statements.SpecificBinding.match, fparser.one.statements.GenericBinding.match, fparser.one.statements.FinalBinding.match, fparser.one.statements.Allocatable.match, fparser.two.Fortran2003.Proc_Component_PASS_Arg_Name.match(), fparser.one.statements.Asynchronous.match, fparser.one.statements.Bind.match, fparser.one.statements.Else.match, fparser.one.statements.ElseIf.match, fparser.one.statements.Case.match, fparser.one.statements.TypeIs.match, fparser.one.statements.ClassIs.match, fparser.two.Fortran2003.Binding_PASS_Arg_Name.match(), fparser.two.Fortran2003.Generic_Binding.match(), fparser.one.statements.Where.match, fparser.one.statements.ElseWhere.match, fparser.one.statements.Enumerator.match, fparser.one.statements.FortranName.match, fparser.one.statements.Threadsafe.match, fparser.one.statements.Depend.match, fparser.one.statements.Check.match, fparser.one.statements.CallStatement.match, fparser.one.statements.CallProtoArgument.match, fparser.one.statements.Pause.match, fparser.one.statements.Comment.match, fparser.two.Fortran2003.Ac_Implied_Do.match(), fparser.two.Fortran2003.Ac_Implied_Do_Control.match(), fparser.two.Fortran2003.Object_Name_Deferred_Shape_Spec_List_Item.match(), fparser.two.Fortran2003.Target_Entity_Decl.match(), fparser.two.Fortran2003.Data_Ref.match(), fparser.two.Fortran2003.Parenthesis.match(), fparser.two.Fortran2003.Connect_Spec.match(), fparser.two.Fortran2003.Io_Control_Spec_List.match(), fparser.two.Fortran2003.Io_Control_Spec.match(), fparser.two.Fortran2003.Data_Edit_Desc_C1002.match(), fparser.two.Fortran2003.Main_Program0.match(), fparser.two.Fortran2003.Function_Body.match(), fparser.two.Fortran2003.Subroutine_Body.match(), fparser.two.Fortran2003.Prefix.match(), fparser.common.base_classes.Statement.modes, fparser.common.base_classes.BeginStatement.process_subitem(), fparser.common.base_classes.BeginStatement.pyf_classes, and fparser.common.base_classes.Statement.reader.

859  def process_subitem(self, item):
860  """
861  Check if item is blocks start statement, if it is, read the block.
862 
863  Return True to stop adding items to given block.
864  """
865  line = item.get_line()
866 
867  # First check for the end of block
868  cls = self.end_stmt_cls
869  if cls.match(line):
870  stmt = cls(self, item)
871  if stmt.isvalid:
872  self.content.append(stmt)
873  return True
874 
875  if item.is_f2py_directive:
876  classes = self.pyf_classes
877  else:
878  classes = self.classes
879 
880  # Look for statement match
881  for cls in classes:
882  if cls.match(line):
883  stmt = cls(self, item)
884  if stmt.isvalid:
885  if not stmt.ignore:
886  self.content.append(stmt)
887  return False
888  # item may be cloned that changes the items line:
889  line = item.get_line()
890 
891  # Check if f77 code contains inline comments or other f90
892  # constructs that got undetected by get_source_info.
893  if item.reader.format.is_f77:
894  i = line.find("!")
895  if i != -1:
896  message = item.reader.format_message(
897  "WARNING",
898  'no parse pattern found for "%s" in %r block, '
899  "trying to remove inline comment (not in Fortran 77)."
900  % (item.get_line(), self.__class__.__name__),
901  item.span[0],
902  item.span[1],
903  )
904  # .. but at the expense of loosing the comment.
905  logging.getLogger(__name__).warning(message)
906  if line[:i]:
907  newitem = item.copy(line[:i].rstrip())
908  return self.process_subitem(newitem)
909  else:
910  return True
911 
912  # try fix statement classes
913  f77_classes = self.classes
914  classes = []
915  for cls in self.get_classes():
916  if "f77" in cls.modes and cls not in f77_classes:
917  classes.append(cls)
918  if classes:
919  message = item.reader.format_message(
920  "WARNING",
921  'no parse pattern found for "%s" in %r block'
922  " maybe due to strict f77 mode."
923  " Trying f90 fix mode patterns.."
924  % (item.get_line(), self.__class__.__name__),
925  item.span[0],
926  item.span[1],
927  )
928  logging.getLogger(__name__).warning(message)
929 
930  item.reader.set_mode(False, False)
931  self.classes = classes
932 
933  r = BeginStatement.process_subitem(self, item)
934  if r is None:
935  # restore f77 fix mode
936  self.classes = f77_classes
937  item.reader.set_mode(False, True)
938  else:
939  message = item.reader.format_message(
940  "INFORMATION",
941  "The f90 fix mode resolved the parse pattern issue."
942  " Setting reader to f90 fix mode.",
943  item.span[0],
944  item.span[1],
945  )
946  logging.getLogger(__name__).info(message)
947  # set f90 fix mode
948  self.classes = f77_classes + classes
949  self.reader.set_mode(False, False)
950  return r
951 
952  self.handle_unknown_item_and_raise(item)
953 
Here is the caller graph for this function:

The documentation for this class was generated from the following file: