From e8490cdc60657a4ca0fe7b4927ed2c5e49e4d7c6 Mon Sep 17 00:00:00 2001 From: peter klausler Date: Thu, 3 May 2018 16:20:22 -0700 Subject: [PATCH] [flang] Clean up dump-parse-tree.h Original-commit: flang-compiler/f18@50241163976fe889acd851c5da981f4eb2506205 Reviewed-on: https://github.com/flang-compiler/f18/pull/80 Tree-same-pre-rewrite: false --- flang/lib/semantics/CMakeLists.txt | 1 - flang/lib/semantics/dump-parse-tree.cc | 23 - flang/lib/semantics/dump-parse-tree.h | 1870 ++++++++++---------------------- flang/tools/f18/f18.cc | 2 +- 4 files changed, 563 insertions(+), 1333 deletions(-) delete mode 100644 flang/lib/semantics/dump-parse-tree.cc diff --git a/flang/lib/semantics/CMakeLists.txt b/flang/lib/semantics/CMakeLists.txt index b99f89b0..9a6f6a1 100644 --- a/flang/lib/semantics/CMakeLists.txt +++ b/flang/lib/semantics/CMakeLists.txt @@ -15,7 +15,6 @@ add_library(FlangSemantics attr.cc - dump-parse-tree.cc resolve-names.cc rewrite-parse-tree.cc scope.cc diff --git a/flang/lib/semantics/dump-parse-tree.cc b/flang/lib/semantics/dump-parse-tree.cc deleted file mode 100644 index fea8ece..0000000 --- a/flang/lib/semantics/dump-parse-tree.cc +++ /dev/null @@ -1,23 +0,0 @@ -// 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. - -#include "dump-parse-tree.h" - -#include -#include -#include -#include - -// Perform all required instantiations -FORTRAN_PARSE_TREE_DUMPER_INSTANTIATE_ALL() diff --git a/flang/lib/semantics/dump-parse-tree.h b/flang/lib/semantics/dump-parse-tree.h index 1966614..880912e 100644 --- a/flang/lib/semantics/dump-parse-tree.h +++ b/flang/lib/semantics/dump-parse-tree.h @@ -11,8 +11,8 @@ // 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_ +#ifndef FORTRAN_SEMANTICS_DUMP_PARSE_TREE_H_ +#define FORTRAN_SEMANTICS_DUMP_PARSE_TREE_H_ #include "symbol.h" #include "../parser/format-specification.h" @@ -20,1248 +20,540 @@ #include "../parser/indirection.h" #include "../parser/parse-tree-visitor.h" #include "../parser/parse-tree.h" -#include -#include -#include +#include #include namespace Fortran::semantics { // -// Dump the Parse Tree hiearchy of any node 'x' of the parse tree. -// -// ParseTreeDumper().run(x) +// Dump the Parse Tree hierarchy of any node 'x' of the parse tree. // class ParseTreeDumper { 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 "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 "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 "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"; - } - } + explicit ParseTreeDumper(std::ostream &out) : out_(out) {} + + constexpr const char *GetNodeName(const char *const &) { return "char *"; } +#define NODE_NAME(T,N) constexpr const char *GetNodeName(const T &) { return N; } +#define NODE(NS, T) NODE_NAME(NS::T, #T) +#define NESTED_NODE(T1, T2) NODE_NAME(T1::T2, #T2) + NODE_NAME(bool, "bool") + NODE_NAME(int, "int") + NODE(format, ControlEditDesc) + NESTED_NODE(format::ControlEditDesc, Kind) + NODE(format, DerivedTypeDataEditDesc) + NODE(format, FormatItem) + NODE(format, FormatSpecification) + NODE(format, IntrinsicTypeDataEditDesc) + NESTED_NODE(format::IntrinsicTypeDataEditDesc, Kind) + NODE(parser, Abstract) + NODE(parser, AcImpliedDo) + NODE(parser, AcImpliedDoControl) + NODE(parser, AcValue) + NODE(parser, AccessStmt) + NODE(parser, AccessId) + NODE(parser, AccessSpec) + NESTED_NODE(parser::AccessSpec, Kind) + NODE(parser, AcSpec) + NODE(parser, ActionStmt) + NODE(parser, ActualArg) + NESTED_NODE(parser::ActualArg, PercentRef) + NESTED_NODE(parser::ActualArg, PercentVal) + NODE(parser, ActualArgSpec) + NESTED_NODE(parser::AcValue, Triplet) + NODE(parser, AllocOpt) + NESTED_NODE(parser::AllocOpt, Mold) + NESTED_NODE(parser::AllocOpt, Source) + NODE(parser, Allocatable) + NODE(parser, AllocatableStmt) + NODE(parser, AllocateCoarraySpec) + NODE(parser, AllocateObject) + NODE(parser, AllocateShapeSpec) + NODE(parser, AllocateStmt) + NODE(parser, Allocation) + NODE(parser, AltReturnSpec) + NODE(parser, ArithmeticIfStmt) + NODE(parser, ArrayConstructor) + NODE(parser, ArrayElement) + NODE(parser, ArraySpec) + NODE(parser, AssignStmt) + NODE(parser, AssignedGotoStmt) + NODE(parser, AssignmentStmt) + NODE(parser, AssociateConstruct) + NODE(parser, AssociateStmt) + NODE(parser, Association) + NODE(parser, AssumedImpliedSpec) + NODE(parser, AssumedRankSpec) + NODE(parser, AssumedShapeSpec) + NODE(parser, AssumedSizeSpec) + NODE(parser, Asynchronous) + NODE(parser, AsynchronousStmt) + NODE(parser, AttrSpec) + NODE(parser, BOZLiteralConstant) + NODE(parser, BackspaceStmt) + NODE(parser, BasedPointerStmt) + NODE(parser, BindAttr) + NESTED_NODE(parser::BindAttr, Deferred) + NESTED_NODE(parser::BindAttr, Non_Overridable) + NODE(parser, BindEntity) + NESTED_NODE(parser::BindEntity, Kind) + NODE(parser, BindStmt) + NODE(parser, Block) + NODE(parser, BlockConstruct) + NODE(parser, BlockData) + NODE(parser, BlockDataStmt) + NODE(parser, BlockSpecificationPart) + NODE(parser, BlockStmt) + NODE(parser, BoundsRemapping) + NODE(parser, BoundsSpec) + NODE(parser, Call) + NODE(parser, CallStmt) + NODE(parser, CaseConstruct) + NESTED_NODE(parser::CaseConstruct, Case) + NODE(parser, CaseSelector) + NODE(parser, CaseStmt) + NODE(parser, CaseValueRange) + NESTED_NODE(parser::CaseValueRange, Range) + NODE(parser, ChangeTeamConstruct) + NODE(parser, ChangeTeamStmt) + NODE(parser, CharLength) + NODE(parser, CharLiteralConstant) + NODE(parser, CharLiteralConstantSubstring) + NODE(parser, CharSelector) + NESTED_NODE(parser::CharSelector, LengthAndKind) + NODE(parser, CharVariable) + NODE(parser, CloseStmt) + NESTED_NODE(parser::CloseStmt, CloseSpec) + NODE(parser, CoarrayAssociation) + NODE(parser, CoarraySpec) + NODE(parser, CodimensionDecl) + NODE(parser, CodimensionStmt) + NODE(parser, CoindexedNamedObject) + NODE(parser, CommonBlockObject) + NODE(parser, CommonStmt) + NESTED_NODE(parser::CommonStmt, Block) + NODE(parser, CompilerDirective) + NESTED_NODE(parser::CompilerDirective, IVDEP) + NESTED_NODE(parser::CompilerDirective, IgnoreTKR) + NODE(parser, ComplexLiteralConstant) + NODE(parser, ComplexPart) + NODE(parser, ComponentArraySpec) + NODE(parser, ComponentAttrSpec) + NODE(parser, ComponentDataSource) + NODE(parser, ComponentDecl) + NODE(parser, ComponentDefStmt) + NODE(parser, ComponentSpec) + NODE(parser, ComputedGotoStmt) + NODE(parser, ConcurrentControl) + NODE(parser, ConcurrentHeader) + NODE(parser, ConnectSpec) + NESTED_NODE(parser::ConnectSpec, CharExpr) + NESTED_NODE(parser::ConnectSpec::CharExpr, Kind) + NESTED_NODE(parser::ConnectSpec, Newunit) + NESTED_NODE(parser::ConnectSpec, Recl) + NODE(parser, ConstantValue) + NODE(parser, ContainsStmt) + NODE(parser, Contiguous) + NODE(parser, ContiguousStmt) + NODE(parser, ContinueStmt) + NODE(parser, CriticalConstruct) + NODE(parser, CriticalStmt) + NODE(parser, CycleStmt) + NODE(parser, DataComponentDefStmt) + NODE(parser, DataIDoObject) + NODE(parser, DataImpliedDo) + NODE(parser, DataRef) + NODE(parser, DataStmt) + NODE(parser, DataStmtConstant) + NODE(parser, DataStmtObject) + NODE(parser, DataStmtRepeat) + NODE(parser, DataStmtSet) + NODE(parser, DataStmtValue) + NODE(parser, DeallocateStmt) + NODE(parser, DeclarationConstruct) + NODE(parser, DeclarationTypeSpec) + NESTED_NODE(parser::DeclarationTypeSpec, Class) + NESTED_NODE(parser::DeclarationTypeSpec, ClassStar) + NESTED_NODE(parser::DeclarationTypeSpec, Record) + NESTED_NODE(parser::DeclarationTypeSpec, Type) + NESTED_NODE(parser::DeclarationTypeSpec, TypeStar) + NODE(parser, Default) + NODE(parser, DeferredCoshapeSpecList) + NODE(parser, DeferredShapeSpecList) + NODE(parser, DefinedOpName) + NODE(parser, DefinedOperator) + NESTED_NODE(parser::DefinedOperator, IntrinsicOperator) + NODE(parser, DerivedTypeDef) + NODE(parser, DerivedTypeSpec) + NODE(parser, DerivedTypeStmt) + NODE(parser, Designator) + NODE(parser, DimensionStmt) + NESTED_NODE(parser::DimensionStmt, Declaration) + NODE(parser, DoConstruct) + NODE(parser, DummyArg) + NODE(parser, ElseIfStmt) + NODE(parser, ElseStmt) + NODE(parser, ElsewhereStmt) + NODE(parser, EndAssociateStmt) + NODE(parser, EndBlockDataStmt) + NODE(parser, EndBlockStmt) + NODE(parser, EndChangeTeamStmt) + NODE(parser, EndCriticalStmt) + NODE(parser, EndDoStmt) + NODE(parser, EndEnumStmt) + NODE(parser, EndForallStmt) + NODE(parser, EndFunctionStmt) + NODE(parser, EndIfStmt) + NODE(parser, EndInterfaceStmt) + NODE(parser, EndLabel) + NODE(parser, EndModuleStmt) + NODE(parser, EndMpSubprogramStmt) + NODE(parser, EndProgramStmt) + NODE(parser, EndSelectStmt) + NODE(parser, EndSubmoduleStmt) + NODE(parser, EndSubroutineStmt) + NODE(parser, EndTypeStmt) + NODE(parser, EndWhereStmt) + NODE(parser, EndfileStmt) + NODE(parser, EntityDecl) + NODE(parser, EntryStmt) + NODE(parser, EnumDef) + NODE(parser, EnumDefStmt) + NODE(parser, Enumerator) + NODE(parser, EnumeratorDefStmt) + NODE(parser, EorLabel) + NODE(parser, EquivalenceObject) + NODE(parser, EquivalenceStmt) + NODE(parser, ErrLabel) + NODE(parser, ErrorRecovery) + NODE(parser, EventPostStmt) + NODE(parser, EventWaitStmt) + NESTED_NODE(parser::EventWaitStmt, EventWaitSpec) + NODE(parser, ExecutableConstruct) + NODE(parser, ExecutionPart) + NODE(parser, ExecutionPartConstruct) + NODE(parser, ExitStmt) + NODE(parser, ExplicitCoshapeSpec) + NODE(parser, ExplicitShapeSpec) + NODE(parser, Expr) + NESTED_NODE(parser::Expr, Parentheses) + NESTED_NODE(parser::Expr, UnaryPlus) + NESTED_NODE(parser::Expr, Negate) + NESTED_NODE(parser::Expr, NOT) + NESTED_NODE(parser::Expr, PercentLoc) + NESTED_NODE(parser::Expr, DefinedUnary) + NESTED_NODE(parser::Expr, Power) + NESTED_NODE(parser::Expr, Multiply) + NESTED_NODE(parser::Expr, Divide) + NESTED_NODE(parser::Expr, Add) + NESTED_NODE(parser::Expr, Subtract) + NESTED_NODE(parser::Expr, Concat) + NESTED_NODE(parser::Expr, LT) + NESTED_NODE(parser::Expr, LE) + NESTED_NODE(parser::Expr, EQ) + NESTED_NODE(parser::Expr, NE) + NESTED_NODE(parser::Expr, GE) + NESTED_NODE(parser::Expr, GT) + NESTED_NODE(parser::Expr, AND) + NESTED_NODE(parser::Expr, OR) + NESTED_NODE(parser::Expr, EQV) + NESTED_NODE(parser::Expr, NEQV) + NESTED_NODE(parser::Expr, XOR) + NESTED_NODE(parser::Expr, DefinedBinary) + NESTED_NODE(parser::Expr, ComplexConstructor) + NODE(parser, External) + NODE(parser, ExternalStmt) + NODE(parser, FailImageStmt) + NODE(parser, FileUnitNumber) + NODE(parser, FinalProcedureStmt) + NODE(parser, FlushStmt) + NODE(parser, ForallAssignmentStmt) + NODE(parser, ForallBodyConstruct) + NODE(parser, ForallConstruct) + NODE(parser, ForallConstructStmt) + NODE(parser, ForallStmt) + NODE(parser, FormTeamStmt) + NESTED_NODE(parser::FormTeamStmt, FormTeamSpec) + NODE(parser, Format) + NODE(parser, FormatStmt) + NODE(parser, FunctionReference) + NODE(parser, FunctionStmt) + NODE(parser, FunctionSubprogram) + NODE(parser, GenericSpec) + NESTED_NODE(parser::GenericSpec, Assignment) + NESTED_NODE(parser::GenericSpec, ReadFormatted) + NESTED_NODE(parser::GenericSpec, ReadUnformatted) + NESTED_NODE(parser::GenericSpec, WriteFormatted) + NESTED_NODE(parser::GenericSpec, WriteUnformatted) + NODE(parser, GenericStmt) + NODE(parser, GotoStmt) + NODE(parser, HollerithLiteralConstant) + NODE(parser, IdExpr) + NODE(parser, IdVariable) + NODE(parser, IfConstruct) + NESTED_NODE(parser::IfConstruct, ElseBlock) + NESTED_NODE(parser::IfConstruct, ElseIfBlock) + NODE(parser, IfStmt) + NODE(parser, IfThenStmt) + NODE(parser, ImageSelector) + NODE(parser, ImageSelectorSpec) + NESTED_NODE(parser::ImageSelectorSpec, Stat) + NESTED_NODE(parser::ImageSelectorSpec, Team) + NESTED_NODE(parser::ImageSelectorSpec, Team_Number) + NODE(parser, ImplicitPart) + NODE(parser, ImplicitPartStmt) + NODE(parser, ImplicitSpec) + NODE(parser, ImplicitStmt) + NESTED_NODE(parser::ImplicitStmt, ImplicitNoneNameSpec) + NODE(parser, ImpliedShapeSpec) + NODE(parser, ImportStmt) + NODE(parser, Initialization) + NODE(parser, InputImpliedDo) + NODE(parser, InputItem) + NODE(parser, InquireSpec) + NESTED_NODE(parser::InquireSpec, CharVar) + NESTED_NODE(parser::InquireSpec::CharVar, Kind) + NESTED_NODE(parser::InquireSpec, IntVar) + NESTED_NODE(parser::InquireSpec::IntVar, Kind) + NESTED_NODE(parser::InquireSpec, LogVar) + NESTED_NODE(parser::InquireSpec::LogVar, Kind) + NODE(parser, InquireStmt) + NESTED_NODE(parser::InquireStmt, Iolength) + NODE(parser, IntegerTypeSpec) + NODE(parser, IntentSpec) + NESTED_NODE(parser::IntentSpec, Intent) + NODE(parser, IntentStmt) + NODE(parser, InterfaceBlock) + NODE(parser, InterfaceBody) + NESTED_NODE(parser::InterfaceBody, Function) + NESTED_NODE(parser::InterfaceBody, Subroutine) + NODE(parser, InterfaceSpecification) + NODE(parser, InterfaceStmt) + NODE(parser, InternalSubprogram) + NODE(parser, InternalSubprogramPart) + NODE(parser, IntLiteralConstant) + NODE(parser, Intrinsic) + NODE(parser, IntrinsicStmt) + NODE(parser, IntrinsicTypeSpec) + NESTED_NODE(parser::IntrinsicTypeSpec, Character) + NESTED_NODE(parser::IntrinsicTypeSpec, Complex) + NESTED_NODE(parser::IntrinsicTypeSpec, DoubleComplex) + NESTED_NODE(parser::IntrinsicTypeSpec, DoublePrecision) + NESTED_NODE(parser::IntrinsicTypeSpec, Logical) + NESTED_NODE(parser::IntrinsicTypeSpec, NCharacter) + NESTED_NODE(parser::IntrinsicTypeSpec, Real) + NODE(parser, IoControlSpec) + NESTED_NODE(parser::IoControlSpec, Asynchronous) + NESTED_NODE(parser::IoControlSpec, CharExpr) + NESTED_NODE(parser::IoControlSpec::CharExpr, Kind) + NESTED_NODE(parser::IoControlSpec, Pos) + NESTED_NODE(parser::IoControlSpec, Rec) + NESTED_NODE(parser::IoControlSpec, Size) + NODE(parser, IoUnit) + NODE(parser, Keyword) + NODE(parser, KindParam) + NESTED_NODE(parser::KindParam, Kanji) + NODE(parser, KindSelector) + NESTED_NODE(parser::KindSelector, StarSize) + NODE(parser, LabelDoStmt) + NODE(parser, LanguageBindingSpec) + NODE(parser, LengthSelector) + NODE(parser, LetterSpec) + NODE(parser, LiteralConstant) + NODE(parser, LocalitySpec) + NESTED_NODE(parser::LocalitySpec, DefaultNone) + NESTED_NODE(parser::LocalitySpec, Local) + NESTED_NODE(parser::LocalitySpec, LocalInit) + NESTED_NODE(parser::LocalitySpec, Shared) + NODE(parser, LockStmt) + NESTED_NODE(parser::LockStmt, LockStat) + NODE(parser, LogicalLiteralConstant) + NODE_NAME(parser::LoopBounds, "LoopBounds") + NODE_NAME(parser::LoopBounds, "LoopBounds") + NODE(parser, LoopControl) + NESTED_NODE(parser::LoopControl, Concurrent) + NODE(parser, MainProgram) + NODE(parser, Map) + NESTED_NODE(parser::Map, EndMapStmt) + NESTED_NODE(parser::Map, MapStmt) + NODE(parser, MaskedElsewhereStmt) + NODE(parser, Module) + NODE(parser, ModuleStmt) + NODE(parser, ModuleSubprogram) + NODE(parser, ModuleSubprogramPart) + NODE(parser, MpSubprogramStmt) + NODE(parser, MsgVariable) + NODE(parser, NamedConstant) + NODE(parser, NamedConstantDef) + NODE(parser, NamelistStmt) + NESTED_NODE(parser::NamelistStmt, Group) + NODE(parser, NonLabelDoStmt) + NODE(parser, NoPass) + NODE(parser, NullifyStmt) + NODE(parser, NullInit) + NODE(parser, ObjectDecl) + NODE(parser, OldParameterStmt) + NODE(parser, Only) + NODE(parser, OpenStmt) + NODE(parser, Optional) + NODE(parser, OptionalStmt) + NODE(parser, OtherSpecificationStmt) + NODE(parser, OutputImpliedDo) + NODE(parser, OutputItem) + NODE(parser, Parameter) + NODE(parser, ParameterStmt) + NODE(parser, ParentIdentifier) + NODE(parser, Pass) + NODE(parser, PauseStmt) + NODE(parser, Pointer) + NODE(parser, PointerAssignmentStmt) + NESTED_NODE(parser::PointerAssignmentStmt, Bounds) + NODE(parser, PointerDecl) + NODE(parser, PointerObject) + NODE(parser, PointerStmt) + NODE(parser, PositionOrFlushSpec) + NODE(parser, PrefixSpec) + NESTED_NODE(parser::PrefixSpec, Elemental) + NESTED_NODE(parser::PrefixSpec, Impure) + NESTED_NODE(parser::PrefixSpec, Module) + NESTED_NODE(parser::PrefixSpec, Non_Recursive) + NESTED_NODE(parser::PrefixSpec, Pure) + NESTED_NODE(parser::PrefixSpec, Recursive) + NODE(parser, PrintStmt) + NODE(parser, PrivateStmt) + NODE(parser, PrivateOrSequence) + NODE(parser, ProcAttrSpec) + NODE(parser, ProcComponentAttrSpec) + NODE(parser, ProcComponentDefStmt) + NODE(parser, ProcComponentRef) + NODE(parser, ProcDecl) + NODE(parser, ProcInterface) + NODE(parser, ProcPointerInit) + NODE(parser, ProcedureDeclarationStmt) + NODE(parser, ProcedureDesignator) + NODE(parser, ProcedureStmt) + NESTED_NODE(parser::ProcedureStmt, Kind) + NODE(parser, Program) + NODE(parser, ProgramStmt) + NODE(parser, ProgramUnit) + NODE(parser, Protected) + NODE(parser, ProtectedStmt) + NODE(parser, ReadStmt) + NODE(parser, RealLiteralConstant) + NESTED_NODE(parser::RealLiteralConstant, Real) + NODE(parser, Rename) + NESTED_NODE(parser::Rename, Names) + NESTED_NODE(parser::Rename, Operators) + NODE(parser, ReturnStmt) + NODE(parser, RewindStmt) + NODE(parser, Save) + NODE(parser, SaveStmt) + NODE(parser, SavedEntity) + NESTED_NODE(parser::SavedEntity, Kind) + NODE(parser, SectionSubscript) + NODE(parser, SelectCaseStmt) + NODE(parser, SelectRankCaseStmt) + NESTED_NODE(parser::SelectRankCaseStmt, Rank) + NODE(parser, SelectRankConstruct) + NESTED_NODE(parser::SelectRankConstruct, RankCase) + NODE(parser, SelectRankStmt) + NODE(parser, SelectTypeConstruct) + NESTED_NODE(parser::SelectTypeConstruct, TypeCase) + NODE(parser, SelectTypeStmt) + NODE(parser, Selector) + NODE(parser, SeparateModuleSubprogram) + NODE(parser, SequenceStmt) + NODE(parser, Sign) + NODE(parser, SignedComplexLiteralConstant) + NODE(parser, SignedIntLiteralConstant) + NODE(parser, SignedRealLiteralConstant) + NODE(parser, SpecificationConstruct) + NODE(parser, SpecificationExpr) + NODE(parser, SpecificationPart) + NODE(parser, Star) + NODE(parser, StatOrErrmsg) + NODE(parser, StatVariable) + NODE(parser, StatusExpr) + NODE(parser, StmtFunctionStmt) + NODE(parser, StopCode) + NODE(parser, StopStmt) + NESTED_NODE(parser::StopStmt, Kind) + NODE(parser, StructureComponent) + NODE(parser, StructureConstructor) + NODE(parser, StructureDef) + NESTED_NODE(parser::StructureDef, EndStructureStmt) + NODE(parser, StructureField) + NODE(parser, StructureStmt) + NODE(parser, Submodule) + NODE(parser, SubmoduleStmt) + NODE(parser, SubroutineStmt) + NODE(parser, SubroutineSubprogram) + NODE(parser, SubscriptTriplet) + NODE(parser, Substring) + NODE(parser, SubstringRange) + NODE(parser, Suffix) + NODE(parser, SyncAllStmt) + NODE(parser, SyncImagesStmt) + NESTED_NODE(parser::SyncImagesStmt, ImageSet) + NODE(parser, SyncMemoryStmt) + NODE(parser, SyncTeamStmt) + NODE(parser, Target) + NODE(parser, TargetStmt) + NODE(parser, TypeAttrSpec) + NESTED_NODE(parser::TypeAttrSpec, BindC) + NESTED_NODE(parser::TypeAttrSpec, Extends) + NODE(parser, TypeBoundGenericStmt) + NODE(parser, TypeBoundProcBinding) + NODE(parser, TypeBoundProcDecl) + NODE(parser, TypeBoundProcedurePart) + NODE(parser, TypeBoundProcedureStmt) + NESTED_NODE(parser::TypeBoundProcedureStmt, WithInterface) + NESTED_NODE(parser::TypeBoundProcedureStmt, WithoutInterface) + NODE(parser, TypeDeclarationStmt) + NODE(parser, TypeGuardStmt) + NESTED_NODE(parser::TypeGuardStmt, Guard) + NODE(parser, TypeParamDecl) + NODE(parser, TypeParamDefStmt) + NESTED_NODE(parser::TypeParamDefStmt, KindOrLen) + NODE(parser, TypeParamInquiry) + NODE(parser, TypeParamSpec) + NODE(parser, TypeParamValue) + NESTED_NODE(parser::TypeParamValue, Deferred) + NODE(parser, TypeSpec) + NODE(parser, Union) + NESTED_NODE(parser::Union, EndUnionStmt) + NESTED_NODE(parser::Union, UnionStmt) + NODE(parser, UnlockStmt) + NODE(parser, UseStmt) + NESTED_NODE(parser::UseStmt, ModuleNature) + NODE(parser, Value) + NODE(parser, ValueStmt) + NODE(parser, Variable) + NODE(parser, Volatile) + NODE(parser, VolatileStmt) + NODE(parser, WaitSpec) + NODE(parser, WaitStmt) + NODE(parser, WhereBodyConstruct) + NODE(parser, WhereConstruct) + NESTED_NODE(parser::WhereConstruct, Elsewhere) + NESTED_NODE(parser::WhereConstruct, MaskedElsewhere) + NODE(parser, WhereConstructStmt) + NODE(parser, WhereStmt) + NODE(parser, WriteStmt) +#undef NESTED_NODE +#undef NODE +#undef NODE_NAME template bool Pre(const T &x) { - if (emptyline_) { - Indent(); - emptyline_ = false; - } + IndentEmptyLine(); if (UnionTrait || WrapperTrait) { out_ << GetNodeName(x) << " -> "; emptyline_ = false; } else { out_ << GetNodeName(x); - out_ << "\n"; - indent_++; - emptyline_ = true; + EndLine(); + ++indent_; } return true; } @@ -1269,89 +561,78 @@ public: template void Post(const T &x) { if (UnionTrait || WrapperTrait) { if (!emptyline_) { - out_ << "\n"; - emptyline_ = true; + EndLine(); } } else { - indent_--; + --indent_; } } bool PutName(const std::string &name, const semantics::Symbol *symbol) { - if (emptyline_) { - Indent(); - emptyline_ = false; - } - if (symbol) { + IndentEmptyLine(); + if (symbol != nullptr) { out_ << "symbol = " << *symbol; } else { out_ << "Name = '" << name << '\''; } - out_ << '\n'; - indent_++; - emptyline_ = true; + ++indent_; + EndLine(); return true; } bool Pre(const parser::Name &x) { return PutName(x.ToString(), x.symbol); } - void Post(const parser::Name &) { indent_--; } + void Post(const parser::Name &) { --indent_; } bool Pre(const std::string &x) { return PutName(x, nullptr); } - void Post(const std::string &x) { indent_--; } + void Post(const std::string &x) { --indent_; } bool Pre(const std::int64_t &x) { - if (emptyline_) { - Indent(); - emptyline_ = false; - } - out_ << "int = '" << x << "'\n"; - indent_++; - emptyline_ = true; + IndentEmptyLine(); + out_ << "int = '" << x << '\''; + ++indent_; + EndLine(); return true; } - void Post(const std::int64_t &x) { indent_--; } + void Post(const std::int64_t &x) { --indent_; } bool Pre(const std::uint64_t &x) { - if (emptyline_) { - Indent(); - emptyline_ = false; - } - out_ << "int = '" << x << "'\n"; - indent_++; - emptyline_ = true; + IndentEmptyLine(); + out_ << "int = '" << x << '\''; + ++indent_; + EndLine(); return true; } - void Post(const std::uint64_t &x) { indent_--; } + void Post(const std::uint64_t &x) { --indent_; } // A few types we want to ignore - template bool Pre(const Fortran::parser::Statement &) { + template bool Pre(const parser::Statement &) { return true; } - template void Post(const Fortran::parser::Statement &) {} + template void Post(const parser::Statement &) {} - template bool Pre(const Fortran::parser::Indirection &) { + template bool Pre(const parser::Indirection &) { return true; } - template void Post(const Fortran::parser::Indirection &) {} + template void Post(const parser::Indirection &) {} - template bool Pre(const Fortran::parser::Integer &) { + template bool Pre(const parser::Integer &) { return true; } - template void Post(const Fortran::parser::Integer &) {} + template void Post(const parser::Integer &) {} - template bool Pre(const Fortran::parser::Scalar &) { + template bool Pre(const parser::Scalar &) { return true; } - template void Post(const Fortran::parser::Scalar &) {} + template void Post(const parser::Scalar &) {} template bool Pre(const std::tuple &) { return true; } @@ -1362,56 +643,29 @@ public: template void Post(const std::variant &) {} protected: - - void Indent() { - for (int i = 0; i < indent_; i++) { - out_ << "| "; + void IndentEmptyLine() { + if (emptyline_&& indent_ > 0) { + for (int i{0}; i < indent_; ++i) { + out_ << "| "; + } + emptyline_ = false; } } + void EndLine() { + out_ << '\n'; + emptyline_ = true; + } + private: - int indent_; + int indent_{0}; std::ostream &out_; - bool emptyline_; - + bool emptyline_{false}; }; -template void DumpTree(const T &x, std::ostream &out = std::cout) { - ParseTreeDumper dumper(out); - Fortran::parser::Walk(x, dumper); +template void DumpTree(std::ostream &out, const T &x) { + ParseTreeDumper dumper{out}; + parser::Walk(x, dumper); } - } // namespace Fortran::semantics - -// Provide a explicit instantiation for a few selected node types. -// The goal is not to provide the instantiation of all possible -// types but to insure that a call to DumpTree will not cause -// the instantiation of Walk() for 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_ +#endif // FORTRAN_SEMANTICS_DUMP_PARSE_TREE_H_ diff --git a/flang/tools/f18/f18.cc b/flang/tools/f18/f18.cc index 7478cd1..b9e0981 100644 --- a/flang/tools/f18/f18.cc +++ b/flang/tools/f18/f18.cc @@ -206,7 +206,7 @@ std::string CompileFortran( } } if (driver.dumpParseTree) { - Fortran::semantics::DumpTree(*parsing.parseTree()); + Fortran::semantics::DumpTree(std::cout, *parsing.parseTree()); } if (driver.dumpUnparse) { Unparse( -- 2.7.4