Lines Matching refs:parser
20 using namespace parser::literals;
27 using IndexList = std::vector<std::pair<parser::CharBlock, parser::CharBlock>>;
39 parser::CharBlock parserCharBlock;
43 using TargetStmtMap = std::map<parser::Label, LabeledStatementInfoTuplePOD>;
45 SourceStatementInfoTuplePOD(const parser::Label &parserLabel, in SourceStatementInfoTuplePOD()
47 const parser::CharBlock &parserCharBlock) in SourceStatementInfoTuplePOD()
50 parser::Label parserLabel;
52 parser::CharBlock parserCharBlock;
61 constexpr Legality IsLegalDoTerm(const parser::Statement<A> &) { in IsLegalDoTerm()
62 if (std::is_same_v<A, common::Indirection<parser::EndDoStmt>> || in IsLegalDoTerm()
63 std::is_same_v<A, parser::EndDoStmt>) { in IsLegalDoTerm()
65 } else if (std::is_same_v<A, parser::EndForallStmt> || in IsLegalDoTerm()
66 std::is_same_v<A, parser::EndWhereStmt>) { in IsLegalDoTerm()
77 const parser::Statement<parser::ActionStmt> &actionStmt) { in IsLegalDoTerm()
78 if (std::holds_alternative<parser::ContinueStmt>(actionStmt.statement.u)) { in IsLegalDoTerm()
82 common::Indirection<parser::ArithmeticIfStmt>>( in IsLegalDoTerm()
84 std::holds_alternative<common::Indirection<parser::CycleStmt>>( in IsLegalDoTerm()
86 std::holds_alternative<common::Indirection<parser::ExitStmt>>( in IsLegalDoTerm()
88 std::holds_alternative<common::Indirection<parser::StopStmt>>( in IsLegalDoTerm()
90 std::holds_alternative<common::Indirection<parser::GotoStmt>>( in IsLegalDoTerm()
93 common::Indirection<parser::ReturnStmt>>( in IsLegalDoTerm()
101 template <typename A> constexpr bool IsFormat(const parser::Statement<A> &) { in IsFormat()
102 return std::is_same_v<A, common::Indirection<parser::FormatStmt>>; in IsFormat()
106 constexpr Legality IsLegalBranchTarget(const parser::Statement<A> &) { in IsLegalBranchTarget()
107 if (std::is_same_v<A, parser::ActionStmt> || in IsLegalBranchTarget()
108 std::is_same_v<A, parser::AssociateStmt> || in IsLegalBranchTarget()
109 std::is_same_v<A, parser::EndAssociateStmt> || in IsLegalBranchTarget()
110 std::is_same_v<A, parser::IfThenStmt> || in IsLegalBranchTarget()
111 std::is_same_v<A, parser::EndIfStmt> || in IsLegalBranchTarget()
112 std::is_same_v<A, parser::SelectCaseStmt> || in IsLegalBranchTarget()
113 std::is_same_v<A, parser::EndSelectStmt> || in IsLegalBranchTarget()
114 std::is_same_v<A, parser::SelectRankStmt> || in IsLegalBranchTarget()
115 std::is_same_v<A, parser::SelectTypeStmt> || in IsLegalBranchTarget()
116 std::is_same_v<A, common::Indirection<parser::LabelDoStmt>> || in IsLegalBranchTarget()
117 std::is_same_v<A, parser::NonLabelDoStmt> || in IsLegalBranchTarget()
118 std::is_same_v<A, parser::EndDoStmt> || in IsLegalBranchTarget()
119 std::is_same_v<A, common::Indirection<parser::EndDoStmt>> || in IsLegalBranchTarget()
120 std::is_same_v<A, parser::BlockStmt> || in IsLegalBranchTarget()
121 std::is_same_v<A, parser::EndBlockStmt> || in IsLegalBranchTarget()
122 std::is_same_v<A, parser::CriticalStmt> || in IsLegalBranchTarget()
123 std::is_same_v<A, parser::EndCriticalStmt> || in IsLegalBranchTarget()
124 std::is_same_v<A, parser::ForallConstructStmt> || in IsLegalBranchTarget()
125 std::is_same_v<A, parser::WhereConstructStmt> || in IsLegalBranchTarget()
126 std::is_same_v<A, parser::EndFunctionStmt> || in IsLegalBranchTarget()
127 std::is_same_v<A, parser::EndMpSubprogramStmt> || in IsLegalBranchTarget()
128 std::is_same_v<A, parser::EndProgramStmt> || in IsLegalBranchTarget()
129 std::is_same_v<A, parser::EndSubroutineStmt>) { in IsLegalBranchTarget()
138 const parser::Statement<A> &statement) { in ConstructBranchTargetFlags()
156 static unsigned SayLabel(parser::Label label) { in SayLabel()
175 const parser::CharBlock *GetStmtName(const parser::Statement<A> &stmt) { in GetStmtName()
176 const std::optional<parser::Name> *name{nullptr}; in GetStmtName()
178 if constexpr (std::is_same_v<decltype(A::v), parser::Name>) { in GetStmtName()
183 } else if constexpr (std::is_same_v<A, parser::SelectRankStmt> || in GetStmtName()
184 std::is_same_v<A, parser::SelectTypeStmt>) { in GetStmtName()
186 } else if constexpr (common::HasMember<parser::Name, in GetStmtName()
188 return &std::get<parser::Name>(stmt.statement.t).source; in GetStmtName()
190 name = &std::get<std::optional<parser::Name>>(stmt.statement.t); in GetStmtName()
205 std::tuple<parser::MainProgram, parser::FunctionSubprogram, in Pre()
206 parser::SubroutineSubprogram, parser::SeparateModuleSubprogram>; in Pre()
222 template <typename A> bool Pre(const parser::Statement<A> &statement) { in Pre()
228 using LabeledConstructStmts = std::tuple<parser::AssociateStmt, in Pre()
229 parser::BlockStmt, parser::ChangeTeamStmt, parser::CriticalStmt, in Pre()
230 parser::IfThenStmt, parser::NonLabelDoStmt, parser::SelectCaseStmt, in Pre()
231 parser::SelectRankStmt, parser::SelectTypeStmt, in Pre()
232 parser::ForallConstructStmt, parser::WhereConstructStmt>; in Pre()
233 using LabeledConstructEndStmts = std::tuple<parser::EndAssociateStmt, in Pre()
234 parser::EndBlockStmt, parser::EndChangeTeamStmt, in Pre()
235 parser::EndCriticalStmt, parser::EndDoStmt, parser::EndForallStmt, in Pre()
236 parser::EndIfStmt, parser::EndWhereStmt>; in Pre()
238 std::tuple<parser::EndFunctionStmt, parser::EndMpSubprogramStmt, in Pre()
239 parser::EndProgramStmt, parser::EndSubroutineStmt>; in Pre()
243 } else if constexpr (std::is_same_v<A, parser::EndSelectStmt>) { in Pre()
258 bool Pre(const parser::ProgramUnit &) { return InitializeNewScopeContext(); } in Pre()
259 bool Pre(const parser::InternalSubprogram &) { in Pre()
262 bool Pre(const parser::ModuleSubprogram &) { in Pre()
265 bool Pre(const parser::AssociateConstruct &associateConstruct) { in Pre()
268 bool Pre(const parser::BlockConstruct &blockConstruct) { in Pre()
271 bool Pre(const parser::ChangeTeamConstruct &changeTeamConstruct) { in Pre()
274 bool Pre(const parser::CriticalConstruct &criticalConstruct) { in Pre()
277 bool Pre(const parser::DoConstruct &doConstruct) { in Pre()
280 bool Pre(const parser::IfConstruct &ifConstruct) { in Pre()
283 bool Pre(const parser::IfConstruct::ElseIfBlock &) { in Pre()
286 bool Pre(const parser::IfConstruct::ElseBlock &) { in Pre()
289 bool Pre(const parser::CaseConstruct &caseConstruct) { in Pre()
292 void Post(const parser::SelectCaseStmt &) { PushScope(); } in Post()
293 bool Pre(const parser::CaseConstruct::Case &) { return SwitchToNewScope(); } in Pre()
294 bool Pre(const parser::SelectRankConstruct &selectRankConstruct) { in Pre()
297 void Post(const parser::SelectRankStmt &) { PushScope(); } in Post()
298 bool Pre(const parser::SelectRankConstruct::RankCase &) { in Pre()
301 bool Pre(const parser::SelectTypeConstruct &selectTypeConstruct) { in Pre()
304 void Post(const parser::SelectTypeStmt &) { PushScope(); } in Post()
305 bool Pre(const parser::SelectTypeConstruct::TypeCase &) { in Pre()
308 void Post(const parser::EndSelectStmt &) { PopScope(); } in Post()
309 bool Pre(const parser::WhereConstruct &whereConstruct) { in Pre()
312 bool Pre(const parser::ForallConstruct &forallConstruct) { in Pre()
316 void Post(const parser::AssociateConstruct &associateConstruct) { in Post()
319 void Post(const parser::BlockConstruct &blockConstruct) { in Post()
322 void Post(const parser::ChangeTeamConstruct &changeTeamConstruct) { in Post()
325 void Post(const parser::CriticalConstruct &criticalConstruct) { in Post()
328 void Post(const parser::DoConstruct &doConstruct) { in Post()
331 void Post(const parser::IfConstruct &ifConstruct) { in Post()
334 void Post(const parser::CaseConstruct &caseConstruct) { in Post()
337 void Post(const parser::SelectRankConstruct &selectRankConstruct) { in Post()
340 void Post(const parser::SelectTypeConstruct &selectTypeConstruct) { in Post()
343 void Post(const parser::WhereConstruct &whereConstruct) { in Post()
346 void Post(const parser::ForallConstruct &forallConstruct) { in Post()
356 const parser::Statement<STMT> &stmt) { in CheckOptionalName()
357 if (const parser::CharBlock * name{GetStmtName(stmt)}) { in CheckOptionalName()
358 const auto &firstStmt{std::get<parser::Statement<FIRST>>(a.t)}; in CheckOptionalName()
359 if (const parser::CharBlock * firstName{GetStmtName(firstStmt)}) { in CheckOptionalName()
372 void Post(const parser::BlockData &blockData) { in Post()
373 CheckOptionalName<parser::BlockDataStmt>("BLOCK DATA subprogram", blockData, in Post()
374 std::get<parser::Statement<parser::EndBlockDataStmt>>(blockData.t)); in Post()
378 void Post(const parser::InterfaceBody::Function &func) { in Post()
379 CheckOptionalName<parser::FunctionStmt>("FUNCTION", func, in Post()
380 std::get<parser::Statement<parser::EndFunctionStmt>>(func.t)); in Post()
384 void Post(const parser::FunctionSubprogram &functionSubprogram) { in Post()
385 CheckOptionalName<parser::FunctionStmt>("FUNCTION", functionSubprogram, in Post()
386 std::get<parser::Statement<parser::EndFunctionStmt>>( in Post()
391 void Post(const parser::InterfaceBlock &interfaceBlock) { in Post()
393 std::get<parser::Statement<parser::EndInterfaceStmt>>( in Post()
397 std::get<parser::Statement<parser::InterfaceStmt>>(interfaceBlock.t)}; in Post()
398 if (std::holds_alternative<parser::Abstract>(interfaceStmt.statement.u)) { in Post()
406 std::get<std::optional<parser::GenericSpec>>( in Post()
412 std::get_if<parser::DefinedOperator>(&endGenericSpec->u)}; in Post()
413 const auto *op{std::get_if<parser::DefinedOperator>(&genericSpec->u)}; in Post()
416 std::get_if<parser::DefinedOperator::IntrinsicOperator>( in Post()
419 std::get_if<parser::DefinedOperator::IntrinsicOperator>( in Post()
442 void Post(const parser::Module &module) { in Post()
443 CheckOptionalName<parser::ModuleStmt>("MODULE", module, in Post()
444 std::get<parser::Statement<parser::EndModuleStmt>>(module.t)); in Post()
448 void Post(const parser::SeparateModuleSubprogram &separateModuleSubprogram) { in Post()
449 CheckOptionalName<parser::MpSubprogramStmt>("MODULE PROCEDURE", in Post()
451 std::get<parser::Statement<parser::EndMpSubprogramStmt>>( in Post()
456 void Post(const parser::MainProgram &mainProgram) { in Post()
457 if (const parser::CharBlock * in Post()
458 endName{GetStmtName(std::get<parser::Statement<parser::EndProgramStmt>>( in Post()
461 std::get<std::optional<parser::Statement<parser::ProgramStmt>>>( in Post()
475 void Post(const parser::Submodule &submodule) { in Post()
476 CheckOptionalName<parser::SubmoduleStmt>("SUBMODULE", submodule, in Post()
477 std::get<parser::Statement<parser::EndSubmoduleStmt>>(submodule.t)); in Post()
481 void Post(const parser::InterfaceBody::Subroutine &sub) { in Post()
482 CheckOptionalName<parser::SubroutineStmt>("SUBROUTINE", sub, in Post()
483 std::get<parser::Statement<parser::EndSubroutineStmt>>(sub.t)); in Post()
487 void Post(const parser::SubroutineSubprogram &subroutineSubprogram) { in Post()
488 CheckOptionalName<parser::SubroutineStmt>("SUBROUTINE", in Post()
490 std::get<parser::Statement<parser::EndSubroutineStmt>>( in Post()
495 void Post(const parser::DerivedTypeDef &derivedTypeDef) { in Post()
496 CheckOptionalName<parser::DerivedTypeStmt>("derived type definition", in Post()
498 std::get<parser::Statement<parser::EndTypeStmt>>(derivedTypeDef.t)); in Post()
501 void Post(const parser::LabelDoStmt &labelDoStmt) { in Post()
502 AddLabelReferenceFromDoStmt(std::get<parser::Label>(labelDoStmt.t)); in Post()
504 void Post(const parser::GotoStmt &gotoStmt) { AddLabelReference(gotoStmt.v); } in Post()
505 void Post(const parser::ComputedGotoStmt &computedGotoStmt) { in Post()
506 AddLabelReference(std::get<std::list<parser::Label>>(computedGotoStmt.t)); in Post()
508 void Post(const parser::ArithmeticIfStmt &arithmeticIfStmt) { in Post()
513 void Post(const parser::AssignStmt &assignStmt) { in Post()
514 AddLabelReferenceFromAssignStmt(std::get<parser::Label>(assignStmt.t)); in Post()
516 void Post(const parser::AssignedGotoStmt &assignedGotoStmt) { in Post()
517 AddLabelReference(std::get<std::list<parser::Label>>(assignedGotoStmt.t)); in Post()
519 void Post(const parser::AltReturnSpec &altReturnSpec) { in Post()
523 void Post(const parser::ErrLabel &errLabel) { AddLabelReference(errLabel.v); } in Post()
524 void Post(const parser::EndLabel &endLabel) { AddLabelReference(endLabel.v); } in Post()
525 void Post(const parser::EorLabel &eorLabel) { AddLabelReference(eorLabel.v); } in Post()
526 void Post(const parser::Format &format) { in Post()
527 if (const auto *labelPointer{std::get_if<parser::Label>(&format.u)}) { in Post()
531 void Post(const parser::CycleStmt &cycleStmt) { in Post()
536 void Post(const parser::ExitStmt &exitStmt) { in Post()
586 !(std::is_same_v<A, parser::DoConstruct> || in PushConstructName()
587 std::is_same_v<A, parser::IfConstruct> || in PushConstructName()
588 std::is_same_v<A, parser::CaseConstruct>); in PushConstructName()
591 bool PushConstructName(const parser::BlockConstruct &blockConstruct) { in PushConstructName()
593 std::get<parser::Statement<parser::BlockStmt>>(blockConstruct.t) in PushConstructName()
607 void PopConstructNameIfPresent(const parser::BlockConstruct &blockConstruct) { in PopConstructNameIfPresent()
609 std::get<parser::Statement<parser::BlockStmt>>(blockConstruct.t) in PopConstructNameIfPresent()
625 CheckEndName<FIRST, parser::EndSelectStmt>(tag, construct); in CheckSelectNames()
628 tag, construct, std::get<parser::Statement<CASE>>(inner.t)); in CheckSelectNames()
633 void PopConstructName(const parser::CaseConstruct &caseConstruct) { in PopConstructName()
634 CheckSelectNames<parser::SelectCaseStmt, parser::CaseConstruct::Case, in PopConstructName()
635 parser::CaseStmt>("SELECT CASE", caseConstruct); in PopConstructName()
642 const parser::SelectRankConstruct &selectRankConstruct) { in PopConstructName()
643 CheckSelectNames<parser::SelectRankStmt, in PopConstructName()
644 parser::SelectRankConstruct::RankCase, parser::SelectRankCaseStmt>( in PopConstructName()
652 const parser::SelectTypeConstruct &selectTypeConstruct) { in PopConstructName()
653 CheckSelectNames<parser::SelectTypeStmt, in PopConstructName()
654 parser::SelectTypeConstruct::TypeCase, parser::TypeGuardStmt>( in PopConstructName()
664 const auto &constructStmt{std::get<parser::Statement<FIRST>>(a.t)}; in CheckEndName()
665 const auto &endStmt{std::get<parser::Statement<END>>(a.t)}; in CheckEndName()
666 const parser::CharBlock *endName{GetStmtName(endStmt)}; in CheckEndName()
667 if (const parser::CharBlock * constructName{GetStmtName(constructStmt)}) { in CheckEndName()
691 void CheckName(const parser::AssociateConstruct &associateConstruct) { in CheckName()
692 CheckEndName<parser::AssociateStmt, parser::EndAssociateStmt>( in CheckName()
696 void CheckName(const parser::CriticalConstruct &criticalConstruct) { in CheckName()
697 CheckEndName<parser::CriticalStmt, parser::EndCriticalStmt>( in CheckName()
701 void CheckName(const parser::DoConstruct &doConstruct) { in CheckName()
702 CheckEndName<parser::NonLabelDoStmt, parser::EndDoStmt>("DO", doConstruct); in CheckName()
705 void CheckName(const parser::ForallConstruct &forallConstruct) { in CheckName()
706 CheckEndName<parser::ForallConstructStmt, parser::EndForallStmt>( in CheckName()
711 void CheckName(const parser::BlockConstruct &blockConstruct) { in CheckName()
712 CheckEndName<parser::BlockStmt, parser::EndBlockStmt>( in CheckName()
716 void CheckName(const parser::ChangeTeamConstruct &changeTeamConstruct) { in CheckName()
717 CheckEndName<parser::ChangeTeamStmt, parser::EndChangeTeamStmt>( in CheckName()
722 void CheckName(const parser::IfConstruct &ifConstruct) { in CheckName()
723 CheckEndName<parser::IfThenStmt, parser::EndIfStmt>("IF", ifConstruct); in CheckName()
725 std::get<std::list<parser::IfConstruct::ElseIfBlock>>(ifConstruct.t)) { in CheckName()
726 CheckOptionalName<parser::IfThenStmt>("IF construct", ifConstruct, in CheckName()
727 std::get<parser::Statement<parser::ElseIfStmt>>(elseIfBlock.t)); in CheckName()
730 std::get<std::optional<parser::IfConstruct::ElseBlock>>( in CheckName()
732 CheckOptionalName<parser::IfThenStmt>("IF construct", ifConstruct, in CheckName()
733 std::get<parser::Statement<parser::ElseStmt>>(elseBlock->t)); in CheckName()
738 void CheckName(const parser::WhereConstruct &whereConstruct) { in CheckName()
739 CheckEndName<parser::WhereConstructStmt, parser::EndWhereStmt>( in CheckName()
742 std::get<std::list<parser::WhereConstruct::MaskedElsewhere>>( in CheckName()
744 CheckOptionalName<parser::WhereConstructStmt>("WHERE construct", in CheckName()
746 std::get<parser::Statement<parser::MaskedElsewhereStmt>>( in CheckName()
750 std::get<std::optional<parser::WhereConstruct::Elsewhere>>( in CheckName()
752 CheckOptionalName<parser::WhereConstructStmt>("WHERE construct", in CheckName()
754 std::get<parser::Statement<parser::ElsewhereStmt>>(elsewhere->t)); in CheckName()
760 const char *const stmtString, const parser::CharBlock &constructName) { in CheckLabelContext()
770 void CheckLabelInRange(parser::Label label) { in CheckLabelInRange()
778 void AddTargetLabelDefinition(parser::Label label, in AddTargetLabelDefinition()
791 void AddLabelReferenceFromDoStmt(parser::Label label) { in AddLabelReferenceFromDoStmt()
797 void AddLabelReferenceToFormatStmt(parser::Label label) { in AddLabelReferenceToFormatStmt()
803 void AddLabelReferenceFromAssignStmt(parser::Label label) { in AddLabelReferenceFromAssignStmt()
809 void AddLabelReference(parser::Label label) { in AddLabelReference()
815 void AddLabelReference(const std::list<parser::Label> &labels) { in AddLabelReference()
816 for (const parser::Label &label : labels) { in AddLabelReference()
823 parser::CharBlock currentPosition_;
839 SemanticsContext &context, const parser::Program &program) { in LabelAnalysis()
845 bool InBody(const parser::CharBlock &position, in InBody()
846 const std::pair<parser::CharBlock, parser::CharBlock> &pair) { in InBody()
856 const TargetStmtMap &labels, const parser::Label &label) { in GetLabel()
901 parser::CharBlock SkipLabel(const parser::CharBlock &position) { in SkipLabel()
903 if (maxPosition && parser::IsDecimalDigit(position[0])) { in SkipLabel()
905 for (; (i < maxPosition) && parser::IsDecimalDigit(position[i]); ++i) { in SkipLabel()
909 return parser::CharBlock{position.begin() + i, position.end()}; in SkipLabel()
1116 bool ValidateLabels(SemanticsContext &context, const parser::Program &program) { in ValidateLabels()