// Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef FORTRAN_SEMANTICS_PARSETREEDUMP_H_ #define FORTRAN_SEMANTICS_PARSETREEDUMP_H_ #include "symbol.h" #include "../parser/format-specification.h" #include "../parser/idioms.h" #include "../parser/indirection.h" #include "../parser/parse-tree-visitor.h" #include "../parser/parse-tree.h" #include #include #include #include namespace Fortran::semantics { // // Dump the Parse Tree hiearchy of any node 'x' of the parse tree. // // ParseTreeDumper().run(x) // class ParseTreeDumper { private: int indent_; std::ostream &out; bool emptyline; public: ParseTreeDumper(std::ostream &out_ = std::cerr) : indent_(0), out(out_), emptyline(false) {} // Provide a name to a parse-tree node. // TODO: Provide a name for the 400+ classes in the parse-tree. template const char *GetNodeName(const T &x) { if constexpr (std::is_same_v) { return "AcImpliedDo"; } else if constexpr (std::is_same_v) { return "AcImpliedDoControl"; } else if constexpr (std::is_same_v) { return "AcValue"; } else if constexpr (std::is_same_v) { return "AccessStmt"; } else if constexpr (std::is_same_v) { return "AccessId"; } else if constexpr (std::is_same_v) { return "AccessSpec"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "ActionStmt"; } else if constexpr (std::is_same_v) { return "ActualArg"; } else if constexpr (std::is_same_v) { return "ActualArgSpec"; } else if constexpr (std::is_same_v) { return "AllocOpt"; } else if constexpr (std::is_same_v) { return "AllocatableStmt"; } else if constexpr (std::is_same_v) { return "AllocateCoarraySpec"; } else if constexpr (std::is_same_v) { return "AllocateObject"; } else if constexpr (std::is_same_v) { return "AllocateShapeSpec"; } else if constexpr (std::is_same_v) { return "AllocateStmt"; } else if constexpr (std::is_same_v) { return "Allocation"; } else if constexpr (std::is_same_v) { return "AltReturnSpec"; } else if constexpr (std::is_same_v) { return "ArithmeticIfStmt"; } else if constexpr (std::is_same_v) { return "ArrayConstructor"; } else if constexpr (std::is_same_v) { return "ArrayElement"; } else if constexpr (std::is_same_v) { return "ArraySpec"; } else if constexpr (std::is_same_v) { return "AssignStmt"; } else if constexpr (std::is_same_v) { return "AssignedGotoStmt"; } else if constexpr (std::is_same_v) { return "AssignmentStmt"; } else if constexpr (std::is_same_v) { return "AssociateConstruct"; } else if constexpr (std::is_same_v) { return "AssociateStmt"; } else if constexpr (std::is_same_v) { return "Association"; } else if constexpr (std::is_same_v) { return "AssumedImpliedSpec"; } else if constexpr (std::is_same_v) { return "AssumedShapeSpec"; } else if constexpr (std::is_same_v) { return "AssumedSizeSpec"; } else if constexpr (std::is_same_v) { return "AsynchronousStmt"; } else if constexpr (std::is_same_v) { return "AttrSpec"; } else if constexpr (std::is_same_v) { return "BOZLiteralConstant"; } else if constexpr (std::is_same_v) { return "BackspaceStmt"; } else if constexpr (std::is_same_v) { return "BasedPointerStmt"; } else if constexpr (std::is_same_v) { return "BindAttr"; } else if constexpr (std::is_same_v) { return "BindEntity"; } else if constexpr (std::is_same_v) { return "BindStmt"; } else if constexpr (std::is_same_v) { return "Block"; } else if constexpr (std::is_same_v) { return "BlockConstruct"; } else if constexpr (std::is_same_v) { return "BlockData"; } else if constexpr (std::is_same_v) { return "BlockDataStmt"; } else if constexpr (std::is_same_v) { return "BlockSpecificationPart"; } else if constexpr (std::is_same_v) { return "BlockStmt"; } else if constexpr (std::is_same_v) { return "BoundsRemapping"; } else if constexpr (std::is_same_v) { return "BoundsSpec"; } else if constexpr (std::is_same_v) { return "Call"; } else if constexpr (std::is_same_v) { return "CallStmt"; } else if constexpr (std::is_same_v) { return "CaseConstruct"; } else if constexpr (std::is_same_v) { return "CaseSelector"; } else if constexpr (std::is_same_v) { return "CaseStmt"; } else if constexpr (std::is_same_v) { return "CaseValueRange"; } else if constexpr (std::is_same_v) { return "ChangeTeamConstruct"; } else if constexpr (std::is_same_v) { return "ChangeTeamStmt"; } else if constexpr (std::is_same_v) { return "CharLength"; } else if constexpr (std::is_same_v) { return "CharLiteralConstant"; } else if constexpr (std::is_same_v) { return "CharLiteralConstantSubstring"; } else if constexpr (std::is_same_v) { return "CharLiteralConstantSubstring;"; } else if constexpr (std::is_same_v) { return "CharSelector"; } else if constexpr (std::is_same_v) { return "CharVariable"; } else if constexpr (std::is_same_v) { return "CloseStmt"; } else if constexpr (std::is_same_v) { return "CoarrayAssociation"; } else if constexpr (std::is_same_v) { return "CoarraySpec"; } else if constexpr (std::is_same_v) { return "CodimensionDecl"; } else if constexpr (std::is_same_v) { return "CodimensionStmt"; } else if constexpr (std::is_same_v) { return "CoindexedNamedObject"; } else if constexpr (std::is_same_v) { return "CommonBlockObject"; } else if constexpr (std::is_same_v) { return "CommonStmt"; } else if constexpr (std::is_same_v) { return "CompilerDirective"; } else if constexpr (std::is_same_v) { return "ComplexLiteralConstant"; } else if constexpr (std::is_same_v) { return "ComplexPart"; } else if constexpr (std::is_same_v) { return "ComponentArraySpec"; } else if constexpr (std::is_same_v) { return "ComponentAttrSpec"; } else if constexpr (std::is_same_v) { return "ComponentDataSource"; } else if constexpr (std::is_same_v) { return "ComponentDecl"; } else if constexpr (std::is_same_v) { return "ComponentDefStmt"; } else if constexpr (std::is_same_v) { return "ComponentSpec"; } else if constexpr (std::is_same_v) { return "ComputedGotoStmt"; } else if constexpr (std::is_same_v) { return "ConcurrentControl"; } else if constexpr (std::is_same_v) { return "ConcurrentHeader"; } else if constexpr (std::is_same_v) { return "ConnectSpec"; } else if constexpr (std::is_same_v) { return "ConstantValue"; } else if constexpr (std::is_same_v) { return "ContiguousStmt"; } else if constexpr (std::is_same_v) { return "ContinueStmt"; } else if constexpr (std::is_same_v) { return "CriticalConstruct"; } else if constexpr (std::is_same_v) { return "CriticalStmt"; } else if constexpr (std::is_same_v) { return "CycleStmt"; } else if constexpr (std::is_same_v) { return "DataComponentDefStmt"; } else if constexpr (std::is_same_v) { return "DataIDoObject"; } else if constexpr (std::is_same_v) { return "DataImpliedDo"; } else if constexpr (std::is_same_v) { return "DataRef"; } else if constexpr (std::is_same_v) { return "DataStmt"; } else if constexpr (std::is_same_v) { return "DataStmtConstant"; } else if constexpr (std::is_same_v) { return "DataStmtObject"; } else if constexpr (std::is_same_v) { return "DataStmtRepeat"; } else if constexpr (std::is_same_v) { return "DataStmtSet"; } else if constexpr (std::is_same_v) { return "DataStmtValue"; } else if constexpr (std::is_same_v) { return "DeallocateStmt"; } else if constexpr (std::is_same_v) { return "DeclarationConstruct"; } else if constexpr (std::is_same_v) { return "DeclarationTypeSpec"; } else if constexpr (std::is_same_v) { return "DeferredCoshapeSpecList"; } else if constexpr (std::is_same_v) { return "DeferredShapeSpecList"; } else if constexpr (std::is_same_v) { return "DefinedOpName"; } else if constexpr (std::is_same_v) { return "DefinedOperator"; } else if constexpr (std::is_same_v) { return "DerivedTypeDef"; } else if constexpr (std::is_same_v) { return "DerivedTypeSpec"; } else if constexpr (std::is_same_v) { return "DerivedTypeStmt"; } else if constexpr (std::is_same_v) { return "Designator"; } else if constexpr (std::is_same_v) { return "DimensionStmt"; } else if constexpr (std::is_same_v) { return "DoConstruct"; } else if constexpr (std::is_same_v) { return "DummyArg"; } else if constexpr (std::is_same_v) { return "ElseIfStmt"; } else if constexpr (std::is_same_v) { return "ElseStmt"; } else if constexpr (std::is_same_v) { return "ElsewhereStmt"; } else if constexpr (std::is_same_v) { return "EndAssociateStmt"; } else if constexpr (std::is_same_v) { return "EndBlockDataStmt"; } else if constexpr (std::is_same_v) { return "EndBlockStmt"; } else if constexpr (std::is_same_v) { return "EndChangeTeamStmt"; } else if constexpr (std::is_same_v) { return "EndCriticalStmt"; } else if constexpr (std::is_same_v) { return "EndDoStmt"; } else if constexpr (std::is_same_v) { return "EndForallStmt"; } else if constexpr (std::is_same_v) { return "EndFunctionStmt"; } else if constexpr (std::is_same_v) { return "EndIfStmt"; } else if constexpr (std::is_same_v) { return "EndInterfaceStmt"; } else if constexpr (std::is_same_v) { return "EndLabel"; } else if constexpr (std::is_same_v) { return "EndModuleStmt"; } else if constexpr (std::is_same_v) { return "EndMpSubprogramStmt"; } else if constexpr (std::is_same_v) { return "EndProgramStmt"; } else if constexpr (std::is_same_v) { return "EndSelectStmt"; } else if constexpr (std::is_same_v) { return "EndSubmoduleStmt"; } else if constexpr (std::is_same_v) { return "EndSubroutineStmt"; } else if constexpr (std::is_same_v) { return "EndTypeStmt"; } else if constexpr (std::is_same_v) { return "EndWhereStmt"; } else if constexpr (std::is_same_v) { return "EndfileStmt"; } else if constexpr (std::is_same_v) { return "EntityDecl"; } else if constexpr (std::is_same_v) { return "EntryStmt"; } else if constexpr (std::is_same_v) { return "EnumDef"; } else if constexpr (std::is_same_v) { return "Enumerator"; } else if constexpr (std::is_same_v) { return "EnumeratorDefStmt"; } else if constexpr (std::is_same_v) { return "EorLabel"; } else if constexpr (std::is_same_v) { return "EquivalenceObject"; } else if constexpr (std::is_same_v) { return "EquivalenceStmt"; } else if constexpr (std::is_same_v) { return "ErrLabel"; } else if constexpr (std::is_same_v) { return "EventPostStmt"; } else if constexpr (std::is_same_v) { return "EventWaitStmt"; } else if constexpr (std::is_same_v) { return "ExecutableConstruct"; } else if constexpr (std::is_same_v) { return "ExecutionPartConstruct"; } else if constexpr (std::is_same_v) { return "ExitStmt"; } else if constexpr (std::is_same_v) { return "ExplicitCoshapeSpec"; } else if constexpr (std::is_same_v) { return "ExplicitShapeSpec"; } else if constexpr (std::is_same_v) { return "Expr"; } else if constexpr (std::is_same_v) { return "Parentheses"; } else if constexpr (std::is_same_v) { return "UnaryPlus"; } else if constexpr (std::is_same_v) { return "Negate"; } else if constexpr (std::is_same_v) { return "NOT"; } else if constexpr (std::is_same_v) { return "PercentLoc"; } else if constexpr (std::is_same_v) { return "DefinedUnary"; } else if constexpr (std::is_same_v) { return "Power"; } else if constexpr (std::is_same_v) { return "Multiply"; } else if constexpr (std::is_same_v) { return "Divide"; } else if constexpr (std::is_same_v) { return "Add"; } else if constexpr (std::is_same_v) { return "Subtract"; } else if constexpr (std::is_same_v) { return "Concat"; } else if constexpr (std::is_same_v) { return "LT"; } else if constexpr (std::is_same_v) { return "LE"; } else if constexpr (std::is_same_v) { return "EQ"; } else if constexpr (std::is_same_v) { return "NE"; } else if constexpr (std::is_same_v) { return "GE"; } else if constexpr (std::is_same_v) { return "GT"; } else if constexpr (std::is_same_v) { return "AND"; } else if constexpr (std::is_same_v) { return "OR"; } else if constexpr (std::is_same_v) { return "EQV"; } else if constexpr (std::is_same_v) { return "NEQV"; } else if constexpr (std::is_same_v) { return "XOR"; } else if constexpr (std::is_same_v) { return "DefinedBinary"; } else if constexpr (std::is_same_v) { return "ComplexConstructor"; } else if constexpr (std::is_same_v) { return "Parentheses"; } else if constexpr (std::is_same_v) { return "AcSpec"; } else if constexpr (std::is_same_v) { return "ErrorRecovery"; } else if constexpr (std::is_same_v) { return "ExternalStmt"; } else if constexpr (std::is_same_v) { return "FailImageStmt"; } else if constexpr (std::is_same_v) { return "FileUnitNumber"; } else if constexpr (std::is_same_v) { return "FinalProcedureStmt"; } else if constexpr (std::is_same_v) { return "FlushStmt"; } else if constexpr (std::is_same_v) { return "ForallAssignmentStmt"; } else if constexpr (std::is_same_v) { return "ForallBodyConstruct"; } else if constexpr (std::is_same_v) { return "ForallConstruct"; } else if constexpr (std::is_same_v) { return "ForallConstructStmt"; } else if constexpr (std::is_same_v) { return "ForallStmt"; } else if constexpr (std::is_same_v) { return "FormTeamStmt"; } else if constexpr (std::is_same_v) { return "Format"; } else if constexpr (std::is_same_v) { return "FormatStmt"; } else if constexpr (std::is_same_v) { return "FunctionReference"; } else if constexpr (std::is_same_v) { return "FunctionStmt"; } else if constexpr (std::is_same_v) { return "FunctionSubprogram"; } else if constexpr (std::is_same_v) { return "GenericSpec"; } else if constexpr (std::is_same_v) { return "GenericStmt"; } else if constexpr (std::is_same_v) { return "GotoStmt"; } else if constexpr (std::is_same_v) { return "IdExpr"; } else if constexpr (std::is_same_v) { return "IdVariable"; } else if constexpr (std::is_same_v) { return "IfConstruct"; } else if constexpr (std::is_same_v) { return "IfStmt"; } else if constexpr (std::is_same_v) { return "IfThenStmt"; } else if constexpr (std::is_same_v) { return "ImageSelector"; } else if constexpr (std::is_same_v) { return "ImageSelectorSpec"; } else if constexpr (std::is_same_v) { return "ImplicitPart"; } else if constexpr (std::is_same_v) { return "ImplicitPartStmt"; } else if constexpr (std::is_same_v) { return "ImplicitSpec"; } else if constexpr (std::is_same_v) { return "ImplicitStmt"; } else if constexpr (std::is_same_v) { return "ImpliedShapeSpec"; } else if constexpr (std::is_same_v) { return "ImportStmt"; } else if constexpr (std::is_same_v) { return "Initialization"; } else if constexpr (std::is_same_v) { return "InputImpliedDo"; } else if constexpr (std::is_same_v) { return "InputItem"; } else if constexpr (std::is_same_v) { return "InquireSpec"; } else if constexpr (std::is_same_v) { return "InquireStmt"; } else if constexpr (std::is_same_v) { return "IntLiteralConstant"; } else if constexpr (std::is_same_v) { return "IntegerTypeSpec"; } else if constexpr (std::is_same_v) { return "IntentStmt"; } else if constexpr (std::is_same_v) { return "InterfaceBlock"; } else if constexpr (std::is_same_v) { return "InterfaceBody"; } else if constexpr (std::is_same_v) { return "InterfaceSpecification"; } else if constexpr (std::is_same_v) { return "InterfaceStmt"; } else if constexpr (std::is_same_v) { return "InternalSubprogram"; } else if constexpr (std::is_same_v) { return "InternalSubprogramPart"; } else if constexpr (std::is_same_v) { return "IntrinsicStmt"; } else if constexpr (std::is_same_v) { return "IntrinsicTypeSpec"; } else if constexpr (std::is_same_v) { return "IoControlSpec"; } else if constexpr (std::is_same_v) { return "IoUnit"; } else if constexpr (std::is_same_v) { return "Keyword"; } else if constexpr (std::is_same_v) { return "KindParam"; } else if constexpr (std::is_same_v) { return "KindSelector"; } else if constexpr (std::is_same_v) { return "LabelDoStmt"; } else if constexpr (std::is_same_v) { return "LengthSelector"; } else if constexpr (std::is_same_v) { return "LetterSpec"; } else if constexpr (std::is_same_v) { return "LiteralConstant"; } else if constexpr (std::is_same_v) { return "LocalitySpec"; } else if constexpr (std::is_same_v) { return "LockStmt"; } else if constexpr (std::is_same_v) { return "LogicalLiteralConstant"; } else if constexpr (std::is_same_v) { return "LoopControl"; } else if constexpr (std::is_same_v) { return "MainProgram"; } else if constexpr (std::is_same_v) { return "Map"; } else if constexpr (std::is_same_v) { return "MaskedElsewhereStmt"; } else if constexpr (std::is_same_v) { return "Module"; } else if constexpr (std::is_same_v) { return "ModuleStmt"; } else if constexpr (std::is_same_v) { return "ModuleSubprogram"; } else if constexpr (std::is_same_v) { return "ModuleSubprogramPart"; } else if constexpr (std::is_same_v) { return "MpSubprogramStmt"; } else if constexpr (std::is_same_v) { return "MsgVariable"; } else if constexpr (std::is_same_v) { return "NamedConstant"; } else if constexpr (std::is_same_v) { return "NamedConstantDef"; } else if constexpr (std::is_same_v) { return "NamelistStmt"; } else if constexpr (std::is_same_v) { return "NonLabelDoStmt"; } else if constexpr (std::is_same_v) { return "NullifyStmt"; } else if constexpr (std::is_same_v) { return "ObjectDecl"; } else if constexpr (std::is_same_v) { return "OldParameterStmt"; } else if constexpr (std::is_same_v) { return "OldParameterStmt;"; } else if constexpr (std::is_same_v) { return "Only"; } else if constexpr (std::is_same_v) { return "OpenStmt"; } else if constexpr (std::is_same_v) { return "OptionalStmt"; } else if constexpr (std::is_same_v) { return "OtherSpecificationStmt"; } else if constexpr (std::is_same_v) { return "OutputImpliedDo"; } else if constexpr (std::is_same_v) { return "OutputItem"; } else if constexpr (std::is_same_v) { return "ParameterStmt"; } else if constexpr (std::is_same_v) { return "ParentIdentifier"; } else if constexpr (std::is_same_v) { return "Pass"; } else if constexpr (std::is_same_v) { return "PauseStmt"; } else if constexpr (std::is_same_v) { return "PointerAssignmentStmt"; } else if constexpr (std::is_same_v) { return "PointerDecl"; } else if constexpr (std::is_same_v) { return "PointerObject"; } else if constexpr (std::is_same_v) { return "PointerStmt"; } else if constexpr (std::is_same_v) { return "PositionOrFlushSpec"; } else if constexpr (std::is_same_v) { return "PrefixSpec"; } else if constexpr (std::is_same_v) { return "PrintStmt"; } else if constexpr (std::is_same_v) { return "PrivateOrSequence"; } else if constexpr (std::is_same_v) { return "ProcAttrSpec"; } else if constexpr (std::is_same_v) { return "ProcComponentAttrSpec"; } else if constexpr (std::is_same_v) { return "ProcComponentDefStmt"; } else if constexpr (std::is_same_v) { return "ProcComponentRef"; } else if constexpr (std::is_same_v) { return "ProcDecl"; } else if constexpr (std::is_same_v) { return "ProcInterface"; } else if constexpr (std::is_same_v) { return "ProcPointerInit"; } else if constexpr (std::is_same_v) { return "ProcedureDeclarationStmt"; } else if constexpr (std::is_same_v) { return "ProcedureDesignator"; } else if constexpr (std::is_same_v) { return "ProcedureStmt"; } else if constexpr (std::is_same_v) { return "Program"; } else if constexpr (std::is_same_v) { return "ProgramStmt"; } else if constexpr (std::is_same_v) { return "ProgramUnit"; } else if constexpr (std::is_same_v) { return "ProtectedStmt"; } else if constexpr (std::is_same_v) { return "ReadStmt"; } else if constexpr (std::is_same_v) { return "Rename"; } else if constexpr (std::is_same_v) { return "ReturnStmt"; } else if constexpr (std::is_same_v) { return "RewindStmt"; } else if constexpr (std::is_same_v) { return "SaveStmt"; } else if constexpr (std::is_same_v) { return "SavedEntity"; } else if constexpr (std::is_same_v) { return "SectionSubscript"; } else if constexpr (std::is_same_v) { return "SelectCaseStmt"; } else if constexpr (std::is_same_v) { return "SelectRankCaseStmt"; } else if constexpr (std::is_same_v) { return "SelectRankConstruct"; } else if constexpr (std::is_same_v) { return "SelectRankStmt"; } else if constexpr (std::is_same_v) { return "SelectTypeConstruct"; } else if constexpr (std::is_same_v) { return "SelectTypeStmt"; } else if constexpr (std::is_same_v) { return "Selector"; } else if constexpr (std::is_same_v) { return "SeparateModuleSubprogram"; } else if constexpr (std::is_same_v) { return "SignedComplexLiteralConstant"; } else if constexpr (std::is_same_v) { return "SignedIntLiteralConstant"; } else if constexpr (std::is_same_v) { return "SignedRealLiteralConstant"; } else if constexpr (std::is_same_v) { return "SpecificationConstruct"; } else if constexpr (std::is_same_v) { return "SpecificationExpr"; } else if constexpr (std::is_same_v) { return "SpecificationPart"; } else if constexpr (std::is_same_v) { return "StatOrErrmsg"; } else if constexpr (std::is_same_v) { return "StatVariable"; } else if constexpr (std::is_same_v) { return "StatusExpr"; } else if constexpr (std::is_same_v) { return "StmtFunctionStmt"; } else if constexpr (std::is_same_v) { return "StopCode"; } else if constexpr (std::is_same_v) { return "StopStmt"; } else if constexpr (std::is_same_v) { return "StructureComponent"; } else if constexpr (std::is_same_v) { return "StructureConstructor"; } else if constexpr (std::is_same_v) { return "StructureDef"; } else if constexpr (std::is_same_v) { return "StructureField"; } else if constexpr (std::is_same_v) { return "StructureStmt"; } else if constexpr (std::is_same_v) { return "Submodule"; } else if constexpr (std::is_same_v) { return "SubmoduleStmt"; } else if constexpr (std::is_same_v) { return "SubroutineStmt"; } else if constexpr (std::is_same_v) { return "SubroutineSubprogram"; } else if constexpr (std::is_same_v) { return "SubscriptTriplet"; } else if constexpr (std::is_same_v) { return "Substring"; } else if constexpr (std::is_same_v) { return "SubstringRange"; } else if constexpr (std::is_same_v) { return "SyncAllStmt"; } else if constexpr (std::is_same_v) { return "SyncImagesStmt"; } else if constexpr (std::is_same_v) { return "SyncMemoryStmt"; } else if constexpr (std::is_same_v) { return "SyncTeamStmt"; } else if constexpr (std::is_same_v) { return "TargetStmt"; } else if constexpr (std::is_same_v) { return "TypeAttrSpec"; } else if constexpr (std::is_same_v) { return "TypeBoundGenericStmt"; } else if constexpr (std::is_same_v) { return "TypeBoundProcBinding"; } else if constexpr (std::is_same_v) { return "TypeBoundProcDecl"; } else if constexpr (std::is_same_v) { return "TypeBoundProcedurePart"; } else if constexpr (std::is_same_v) { return "TypeBoundProcedureStmt"; } else if constexpr (std::is_same_v) { return "TypeDeclarationStmt"; } else if constexpr (std::is_same_v) { return "TypeGuardStmt"; } else if constexpr (std::is_same_v) { return "TypeParamDecl"; } else if constexpr (std::is_same_v) { return "TypeParamDefStmt"; } else if constexpr (std::is_same_v) { return "TypeParamInquiry"; } else if constexpr (std::is_same_v) { return "TypeParamSpec"; } else if constexpr (std::is_same_v) { return "TypeParamValue"; } else if constexpr (std::is_same_v) { return "TypeSpec"; } else if constexpr (std::is_same_v) { return "Union"; } else if constexpr (std::is_same_v) { return "UnlockStmt"; } else if constexpr (std::is_same_v) { return "UseStmt"; } else if constexpr (std::is_same_v) { return "ValueStmt"; } else if constexpr (std::is_same_v) { return "Variable"; } else if constexpr (std::is_same_v) { return "VolatileStmt"; } else if constexpr (std::is_same_v) { return "WaitSpec"; } else if constexpr (std::is_same_v) { return "WaitStmt"; } else if constexpr (std::is_same_v) { return "WhereBodyConstruct"; } else if constexpr (std::is_same_v) { return "WhereConstruct"; } else if constexpr (std::is_same_v) { return "WhereConstructStmt"; } else if constexpr (std::is_same_v) { return "WhereStmt"; } else if constexpr (std::is_same_v) { return "WriteStmt"; } else if constexpr (std::is_same_v) { return "HollerithLiteralConstant"; } else if constexpr (std::is_same_v) { return "RealLiteralConstant"; } else if constexpr (std::is_same_v) { return "Real"; } else if constexpr (std::is_same_v) { return "CloseSpec"; } else if constexpr (std::is_same_v) { return "Iolength"; } else if constexpr (std::is_same_v) { return "ControlEditDesc"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "DerivedTypeDataEditDesc"; } else if constexpr (std::is_same_v) { return "FormatItem"; } else if constexpr (std::is_same_v) { return "FormatSpecification"; } else if constexpr (std::is_same_v) { return "IntrinsicTypeDataEditDesc"; } else if constexpr ( std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "Abstract"; } else if constexpr (std::is_same_v) { return "Triplet"; } else if constexpr (std::is_same_v) { return "PercentRef"; } else if constexpr (std::is_same_v) { return "PercentVal"; } else if constexpr (std::is_same_v) { return "Mold"; } else if constexpr (std::is_same_v) { return "Source"; } else if constexpr (std::is_same_v) { return "Allocatable"; } else if constexpr (std::is_same_v) { return "AssumedRankSpec"; } else if constexpr (std::is_same_v) { return "Asynchronous"; } else if constexpr (std::is_same_v) { return "Deferred"; } else if constexpr (std::is_same_v) { return "Non_Overridable"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "Case"; } else if constexpr (std::is_same_v) { return "Range"; } else if constexpr (std::is_same_v) { return "LengthAndKind"; } else if constexpr (std::is_same_v) { return "Block"; } else if constexpr (std::is_same_v) { return "IVDEP"; } else if constexpr (std::is_same_v) { return "IgnoreTKR"; } else if constexpr (std::is_same_v) { return "CharExpr"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "Newunit"; } else if constexpr (std::is_same_v) { return "Recl"; } else if constexpr (std::is_same_v) { return "ContainsStmt"; } else if constexpr (std::is_same_v) { return "Contiguous"; } else if constexpr (std::is_same_v) { return "Class"; } else if constexpr (std::is_same_v) { return "ClassStar"; } else if constexpr (std::is_same_v) { return "Record"; } else if constexpr (std::is_same_v) { return "Type"; } else if constexpr (std::is_same_v) { return "TypeStar"; } else if constexpr (std::is_same_v) { return "Default"; } else if constexpr (std::is_same_v) { return "IntrinsicOperator"; } else if constexpr (std::is_same_v) { return "Declaration"; } else if constexpr (std::is_same_v) { return "EndEnumStmt"; } else if constexpr (std::is_same_v) { return "EnumDefStmt"; } else if constexpr (std::is_same_v) { return "EventWaitSpec"; } else if constexpr (std::is_same_v) { return "ExecutionPart"; } else if constexpr (std::is_same_v) { return "External"; } else if constexpr (std::is_same_v) { return "FormTeamSpec"; } else if constexpr (std::is_same_v) { return "Assignment"; } else if constexpr (std::is_same_v) { return "ReadFormatted"; } else if constexpr (std::is_same_v) { return "ReadUnformatted"; } else if constexpr (std::is_same_v) { return "WriteFormatted"; } else if constexpr (std::is_same_v) { return "WriteUnformatted"; } else if constexpr (std::is_same_v) { return "ElseBlock"; } else if constexpr (std::is_same_v) { return "ElseIfBlock"; } else if constexpr (std::is_same_v) { return "Stat"; } else if constexpr (std::is_same_v) { return "Team"; } else if constexpr (std::is_same_v) { return "Team_Number"; } else if constexpr (std::is_same_v) { return "ImplicitNoneNameSpec"; } else if constexpr (std::is_same_v) { return "CharVar"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "IntVar"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "LogVar"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "IntentSpec"; } else if constexpr (std::is_same_v) { return "Intent"; } else if constexpr (std::is_same_v) { return "Function"; } else if constexpr (std::is_same_v) { return "Subroutine"; } else if constexpr (std::is_same_v) { return "Intrinsic"; } else if constexpr (std::is_same_v) { return "Character"; } else if constexpr (std::is_same_v) { return "Complex"; } else if constexpr ( std::is_same_v) { return "DoubleComplex"; } else if constexpr (std::is_same_v) { return "DoublePrecision"; } else if constexpr (std::is_same_v) { return "Logical"; } else if constexpr (std::is_same_v) { return "NCharacter"; } else if constexpr (std::is_same_v) { return "Real"; } else if constexpr (std::is_same_v) { return "Asynchronous"; } else if constexpr (std::is_same_v) { return "CharExpr"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "Pos"; } else if constexpr (std::is_same_v) { return "Rec"; } else if constexpr (std::is_same_v) { return "Size"; } else if constexpr (std::is_same_v) { return "Kanji"; } else if constexpr (std::is_same_v) { return "StarSize"; } else if constexpr (std::is_same_v) { return "LanguageBindingSpec"; } else if constexpr (std::is_same_v) { return "DefaultNone"; } else if constexpr (std::is_same_v) { return "Local"; } else if constexpr (std::is_same_v) { return "LocalInit"; } else if constexpr (std::is_same_v) { return "Shared"; } else if constexpr (std::is_same_v) { return "LockStat"; } else if constexpr (std::is_same_v>) { return "LoopBounds"; } else if constexpr (std::is_same_v>) { return "LoopBounds"; } else if constexpr (std::is_same_v) { return "Concurrent"; } else if constexpr (std::is_same_v) { return "EndMapStmt"; } else if constexpr (std::is_same_v) { return "MapStmt"; } else if constexpr (std::is_same_v) { return "Group"; } else if constexpr (std::is_same_v) { return "NoPass"; } else if constexpr (std::is_same_v) { return "NullInit"; } else if constexpr (std::is_same_v) { return "Optional"; } else if constexpr (std::is_same_v) { return "Parameter"; } else if constexpr (std::is_same_v) { return "Pointer"; } else if constexpr (std::is_same_v) { return "Bounds"; } else if constexpr (std::is_same_v) { return "Elemental"; } else if constexpr (std::is_same_v) { return "Impure"; } else if constexpr (std::is_same_v) { return "Module"; } else if constexpr (std::is_same_v) { return "Non_Recursive"; } else if constexpr (std::is_same_v) { return "Pure"; } else if constexpr (std::is_same_v) { return "Recursive"; } else if constexpr (std::is_same_v) { return "PrivateStmt"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "Protected"; } else if constexpr (std::is_same_v) { return "Names"; } else if constexpr (std::is_same_v) { return "Operators"; } else if constexpr (std::is_same_v) { return "Save"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "Rank"; } else if constexpr (std::is_same_v) { return "RankCase"; } else if constexpr (std::is_same_v) { return "TypeCase"; } else if constexpr (std::is_same_v) { return "SequenceStmt"; } else if constexpr (std::is_same_v) { return "Sign"; } else if constexpr (std::is_same_v) { return "Star"; } else if constexpr (std::is_same_v) { return "Kind"; } else if constexpr (std::is_same_v) { return "EndStructureStmt"; } else if constexpr (std::is_same_v) { return "Suffix"; } else if constexpr (std::is_same_v) { return "ImageSet"; } else if constexpr (std::is_same_v) { return "Target"; } else if constexpr (std::is_same_v) { return "BindC"; } else if constexpr (std::is_same_v) { return "Extends"; } else if constexpr (std::is_same_v) { return "WithInterface"; } else if constexpr (std::is_same_v) { return "WithoutInterface"; } else if constexpr (std::is_same_v) { return "Guard"; } else if constexpr (std::is_same_v) { return "KindOrLen"; } else if constexpr (std::is_same_v) { return "Deferred"; } else if constexpr (std::is_same_v) { return "EndUnionStmt"; } else if constexpr (std::is_same_v) { return "UnionStmt"; } else if constexpr (std::is_same_v) { return "ModuleNature"; } else if constexpr (std::is_same_v) { return "Value"; } else if constexpr (std::is_same_v) { return "Volatile"; } else if constexpr (std::is_same_v) { return "Elsewhere"; } else if constexpr ( std::is_same_v) { return "MaskedElsewhere"; } else if constexpr (std::is_same_v) { return "bool"; } else if constexpr (std::is_same_v) { return "char*"; } else if constexpr (std::is_same_v) { return "int"; } else { // Uncomment the following static_assert to help figure out classes // that are not handled here. // static_assert(0); return "Unknown"; } } void out_indent() { for (int i = 0; i < indent_; i++) { out << "| "; } } template bool Pre(const T &x) { if (emptyline) { out_indent(); emptyline = false; } if (UnionTrait || WrapperTrait) { out << GetNodeName(x) << " -> "; emptyline = false; } else { out << GetNodeName(x); out << "\n"; indent_++; emptyline = true; } return true; } template void Post(const T &x) { if (UnionTrait || WrapperTrait) { if (!emptyline) { out << "\n"; emptyline = true; } } else { indent_--; } } bool PutName(const std::string &name, const semantics::Symbol *symbol) { if (emptyline) { out_indent(); emptyline = false; } if (symbol) { out << "symbol = " << *symbol; } else { out << "Name = '" << name << '\''; } out << '\n'; indent_++; emptyline = true; return true; } bool Pre(const parser::Name &x) { return PutName(x.ToString(), x.symbol); } void Post(const parser::Name &) { indent_--; } bool Pre(const std::string &x) { return PutName(x, nullptr); } void Post(const std::string &x) { indent_--; } bool Pre(const std::int64_t &x) { if (emptyline) { out_indent(); emptyline = false; } out << "int = '" << x << "'\n"; indent_++; emptyline = true; return true; } void Post(const std::int64_t &x) { indent_--; } bool Pre(const std::uint64_t &x) { if (emptyline) { out_indent(); emptyline = false; } out << "int = '" << x << "'\n"; indent_++; emptyline = true; return true; } void Post(const std::uint64_t &x) { indent_--; } // A few types we want to ignore template bool Pre(const Fortran::parser::Statement &) { return true; } template void Post(const Fortran::parser::Statement &) {} template bool Pre(const Fortran::parser::Indirection &) { return true; } template void Post(const Fortran::parser::Indirection &) {} template bool Pre(const Fortran::parser::Integer &) { return true; } template void Post(const Fortran::parser::Integer &) {} template bool Pre(const Fortran::parser::Scalar &) { return true; } template void Post(const Fortran::parser::Scalar &) {} template bool Pre(const std::tuple &) { return true; } template void Post(const std::tuple &) {} template bool Pre(const std::variant &) { return true; } template void Post(const std::variant &) {} }; template void DumpTree(const T &x, std::ostream &out = std::cout) { ParseTreeDumper dumper(out); Fortran::parser::Walk(x, dumper); } } // namespace Fortran::semantics // Provide a explicit instantiation for a few selected node types. // The goal is not to provide the instanciation of all possible // types but to insure that a call to DumpTree will not cause // the instanciation of thousands of types. #define FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, TYPE) \ MODE template void Fortran::parser::Walk( \ const TYPE &, Fortran::semantics::ParseTreeDumper &); #define FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE_ALL(MODE) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::ProgramUnit) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::SubroutineStmt) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::ProgramStmt) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::FunctionStmt) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::ModuleStmt) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::Expr) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::ActionStmt) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE( \ MODE, Fortran::parser::ExecutableConstruct) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE(MODE, Fortran::parser::Block) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE( \ MODE, Fortran::parser::DeclarationConstruct) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE( \ MODE, Fortran::parser::SpecificationPart) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE( \ MODE, Fortran::parser::OtherSpecificationStmt) \ FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE( \ MODE, Fortran::parser::SpecificationConstruct) FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE_ALL(extern) #endif // of FORTRAN_SEMANTICS_PARSETREEDUMP_H_