Lines Matching refs:parser

19 using namespace parser::literals;
26 using IndexList = std::vector<std::pair<parser::CharBlock, parser::CharBlock>>;
38 parser::CharBlock parserCharBlock;
42 using TargetStmtMap = std::map<parser::Label, LabeledStatementInfoTuplePOD>;
44 SourceStatementInfoTuplePOD(const parser::Label &parserLabel,
46 const parser::CharBlock &parserCharBlock)
49 parser::Label parserLabel;
51 parser::CharBlock parserCharBlock;
60 constexpr Legality IsLegalDoTerm(const parser::Statement<A> &) {
61 if (std::is_same_v<A, common::Indirection<parser::EndDoStmt>> ||
62 std::is_same_v<A, parser::EndDoStmt>) {
64 } else if (std::is_same_v<A, parser::EndForallStmt> ||
65 std::is_same_v<A, parser::EndWhereStmt>) {
76 const parser::Statement<parser::ActionStmt> &actionStmt) {
77 if (std::holds_alternative<parser::ContinueStmt>(actionStmt.statement.u)) {
81 common::Indirection<parser::ArithmeticIfStmt>>(
83 std::holds_alternative<common::Indirection<parser::CycleStmt>>(
85 std::holds_alternative<common::Indirection<parser::ExitStmt>>(
87 std::holds_alternative<common::Indirection<parser::StopStmt>>(
89 std::holds_alternative<common::Indirection<parser::GotoStmt>>(
92 common::Indirection<parser::ReturnStmt>>(
100 template <typename A> constexpr bool IsFormat(const parser::Statement<A> &) {
101 return std::is_same_v<A, common::Indirection<parser::FormatStmt>>;
105 constexpr Legality IsLegalBranchTarget(const parser::Statement<A> &) {
106 if (std::is_same_v<A, parser::ActionStmt> ||
107 std::is_same_v<A, parser::AssociateStmt> ||
108 std::is_same_v<A, parser::EndAssociateStmt> ||
109 std::is_same_v<A, parser::IfThenStmt> ||
110 std::is_same_v<A, parser::EndIfStmt> ||
111 std::is_same_v<A, parser::SelectCaseStmt> ||
112 std::is_same_v<A, parser::EndSelectStmt> ||
113 std::is_same_v<A, parser::SelectRankStmt> ||
114 std::is_same_v<A, parser::SelectTypeStmt> ||
115 std::is_same_v<A, common::Indirection<parser::LabelDoStmt>> ||
116 std::is_same_v<A, parser::NonLabelDoStmt> ||
117 std::is_same_v<A, parser::EndDoStmt> ||
118 std::is_same_v<A, common::Indirection<parser::EndDoStmt>> ||
119 std::is_same_v<A, parser::BlockStmt> ||
120 std::is_same_v<A, parser::EndBlockStmt> ||
121 std::is_same_v<A, parser::CriticalStmt> ||
122 std::is_same_v<A, parser::EndCriticalStmt> ||
123 std::is_same_v<A, parser::ForallConstructStmt> ||
124 std::is_same_v<A, parser::WhereConstructStmt> ||
125 std::is_same_v<A, parser::ChangeTeamStmt> ||
126 std::is_same_v<A, parser::EndChangeTeamStmt> ||
127 std::is_same_v<A, parser::EndFunctionStmt> ||
128 std::is_same_v<A, parser::EndMpSubprogramStmt> ||
129 std::is_same_v<A, parser::EndProgramStmt> ||
130 std::is_same_v<A, parser::EndSubroutineStmt>) {
139 const parser::Statement<A> &statement) {
157 static unsigned SayLabel(parser::Label label) {
176 const parser::CharBlock *GetStmtName(const parser::Statement<A> &stmt) {
177 const std::optional<parser::Name> *name{nullptr};
179 if constexpr (std::is_same_v<decltype(A::v), parser::Name>) {
184 } else if constexpr (std::is_same_v<A, parser::SelectRankStmt> ||
185 std::is_same_v<A, parser::SelectTypeStmt>) {
187 } else if constexpr (common::HasMember<parser::Name,
189 return &std::get<parser::Name>(stmt.statement.t).source;
191 name = &std::get<std::optional<parser::Name>>(stmt.statement.t);
206 std::tuple<parser::MainProgram, parser::FunctionSubprogram,
207 parser::SubroutineSubprogram, parser::SeparateModuleSubprogram>;
224 template <typename A> bool Pre(const parser::Statement<A> &statement) {
230 using LabeledConstructStmts = std::tuple<parser::AssociateStmt,
231 parser::BlockStmt, parser::ChangeTeamStmt, parser::CriticalStmt,
232 parser::IfThenStmt, parser::NonLabelDoStmt, parser::SelectCaseStmt,
233 parser::SelectRankStmt, parser::SelectTypeStmt,
234 parser::ForallConstructStmt, parser::WhereConstructStmt>;
235 using LabeledConstructEndStmts = std::tuple<parser::EndAssociateStmt,
236 parser::EndBlockStmt, parser::EndChangeTeamStmt,
237 parser::EndCriticalStmt, parser::EndDoStmt, parser::EndForallStmt,
238 parser::EndIfStmt, parser::EndWhereStmt>;
240 std::tuple<parser::EndFunctionStmt, parser::EndMpSubprogramStmt,
241 parser::EndProgramStmt, parser::EndSubroutineStmt>;
246 } else if constexpr (std::is_same_v<A, parser::EndIfStmt> ||
247 std::is_same_v<A, parser::EndSelectStmt>) {
263 bool Pre(const parser::ProgramUnit &) { return InitializeNewScopeContext(); }
264 bool Pre(const parser::InternalSubprogram &) {
267 bool Pre(const parser::ModuleSubprogram &) {
270 bool Pre(const parser::AssociateConstruct &associateConstruct) {
273 bool Pre(const parser::BlockConstruct &blockConstruct) {
276 bool Pre(const parser::ChangeTeamConstruct &changeTeamConstruct) {
279 bool Pre(const parser::CriticalConstruct &criticalConstruct) {
282 bool Pre(const parser::DoConstruct &doConstruct) {
283 const auto &optionalName{std::get<std::optional<parser::Name>>(
284 std::get<parser::Statement<parser::NonLabelDoStmt>>(doConstruct.t)
294 Pre(std::get<parser::Statement<parser::NonLabelDoStmt>>(doConstruct.t));
295 Walk(std::get<parser::Block>(doConstruct.t), *this);
296 Pre(std::get<parser::Statement<parser::EndDoStmt>>(doConstruct.t));
300 void Post(const parser::EndDoStmt &endDoStmt) {
307 bool Pre(const parser::IfConstruct &ifConstruct) {
310 void Post(const parser::IfThenStmt &) { PushScope(false); }
311 bool Pre(const parser::IfConstruct::ElseIfBlock &) {
314 bool Pre(const parser::IfConstruct::ElseBlock &) {
317 bool Pre(const parser::EndIfStmt &) {
321 bool Pre(const parser::CaseConstruct &caseConstruct) {
324 void Post(const parser::SelectCaseStmt &) { PushScope(false); }
325 bool Pre(const parser::CaseConstruct::Case &) { return SwitchToNewScope(); }
326 bool Pre(const parser::SelectRankConstruct &selectRankConstruct) {
329 void Post(const parser::SelectRankStmt &) { PushScope(true); }
330 bool Pre(const parser::SelectRankConstruct::RankCase &) {
333 bool Pre(const parser::SelectTypeConstruct &selectTypeConstruct) {
336 void Post(const parser::SelectTypeStmt &) { PushScope(true); }
337 bool Pre(const parser::SelectTypeConstruct::TypeCase &) {
340 void Post(const parser::EndSelectStmt &) { PopScope(); }
341 bool Pre(const parser::WhereConstruct &whereConstruct) {
344 bool Pre(const parser::ForallConstruct &forallConstruct) {
348 void Post(const parser::AssociateConstruct &associateConstruct) {
351 void Post(const parser::BlockConstruct &blockConstruct) {
354 void Post(const parser::ChangeTeamConstruct &changeTeamConstruct) {
357 void Post(const parser::CriticalConstruct &criticalConstruct) {
360 void Post(const parser::IfConstruct &ifConstruct) {
363 void Post(const parser::CaseConstruct &caseConstruct) {
366 void Post(const parser::SelectRankConstruct &selectRankConstruct) {
369 void Post(const parser::SelectTypeConstruct &selectTypeConstruct) {
372 void Post(const parser::WhereConstruct &whereConstruct) {
375 void Post(const parser::ForallConstruct &forallConstruct) {
385 const parser::Statement<STMT> &stmt) {
386 if (const parser::CharBlock * name{GetStmtName(stmt)}) {
387 const auto &firstStmt{std::get<parser::Statement<FIRST>>(a.t)};
388 if (const parser::CharBlock * firstName{GetStmtName(firstStmt)}) {
401 void Post(const parser::BlockData &blockData) {
402 CheckOptionalName<parser::BlockDataStmt>("BLOCK DATA subprogram", blockData,
403 std::get<parser::Statement<parser::EndBlockDataStmt>>(blockData.t));
406 bool Pre(const parser::InterfaceBody &) {
410 void Post(const parser::InterfaceBody &) { PopDisposableMap(); }
413 void Post(const parser::InterfaceBody::Function &func) {
414 CheckOptionalName<parser::FunctionStmt>("FUNCTION", func,
415 std::get<parser::Statement<parser::EndFunctionStmt>>(func.t));
419 void Post(const parser::FunctionSubprogram &functionSubprogram) {
420 CheckOptionalName<parser::FunctionStmt>("FUNCTION", functionSubprogram,
421 std::get<parser::Statement<parser::EndFunctionStmt>>(
426 void Post(const parser::InterfaceBlock &interfaceBlock) {
428 std::get<parser::Statement<parser::EndInterfaceStmt>>(
432 std::get<parser::Statement<parser::InterfaceStmt>>(interfaceBlock.t)};
433 if (std::holds_alternative<parser::Abstract>(interfaceStmt.statement.u)) {
441 std::get<std::optional<parser::GenericSpec>>(
447 std::get_if<parser::DefinedOperator>(&endGenericSpec->u)};
448 const auto *op{std::get_if<parser::DefinedOperator>(&genericSpec->u)};
451 std::get_if<parser::DefinedOperator::IntrinsicOperator>(
454 std::get_if<parser::DefinedOperator::IntrinsicOperator>(
477 void Post(const parser::Module &module) {
478 CheckOptionalName<parser::ModuleStmt>("MODULE", module,
479 std::get<parser::Statement<parser::EndModuleStmt>>(module.t));
483 void Post(const parser::SeparateModuleSubprogram &separateModuleSubprogram) {
484 CheckOptionalName<parser::MpSubprogramStmt>("MODULE PROCEDURE",
486 std::get<parser::Statement<parser::EndMpSubprogramStmt>>(
491 void Post(const parser::MainProgram &mainProgram) {
492 if (const parser::CharBlock *
493 endName{GetStmtName(std::get<parser::Statement<parser::EndProgramStmt>>(
496 std::get<std::optional<parser::Statement<parser::ProgramStmt>>>(
510 void Post(const parser::Submodule &submodule) {
511 CheckOptionalName<parser::SubmoduleStmt>("SUBMODULE", submodule,
512 std::get<parser::Statement<parser::EndSubmoduleStmt>>(submodule.t));
516 void Post(const parser::InterfaceBody::Subroutine &sub) {
517 CheckOptionalName<parser::SubroutineStmt>("SUBROUTINE", sub,
518 std::get<parser::Statement<parser::EndSubroutineStmt>>(sub.t));
522 void Post(const parser::SubroutineSubprogram &subroutineSubprogram) {
523 CheckOptionalName<parser::SubroutineStmt>("SUBROUTINE",
525 std::get<parser::Statement<parser::EndSubroutineStmt>>(
530 bool Pre(const parser::DerivedTypeDef &) {
534 void Post(const parser::DerivedTypeDef &derivedTypeDef) {
535 CheckOptionalName<parser::DerivedTypeStmt>("derived type definition",
537 std::get<parser::Statement<parser::EndTypeStmt>>(derivedTypeDef.t));
541 void Post(const parser::LabelDoStmt &labelDoStmt) {
542 AddLabelReferenceFromDoStmt(std::get<parser::Label>(labelDoStmt.t));
544 void Post(const parser::GotoStmt &gotoStmt) { AddLabelReference(gotoStmt.v); }
545 void Post(const parser::ComputedGotoStmt &computedGotoStmt) {
546 AddLabelReference(std::get<std::list<parser::Label>>(computedGotoStmt.t));
548 void Post(const parser::ArithmeticIfStmt &arithmeticIfStmt) {
553 void Post(const parser::AssignStmt &assignStmt) {
554 AddLabelReferenceFromAssignStmt(std::get<parser::Label>(assignStmt.t));
556 void Post(const parser::AssignedGotoStmt &assignedGotoStmt) {
557 AddLabelReference(std::get<std::list<parser::Label>>(assignedGotoStmt.t));
559 void Post(const parser::AltReturnSpec &altReturnSpec) {
563 void Post(const parser::ErrLabel &errLabel) { AddLabelReference(errLabel.v); }
564 void Post(const parser::EndLabel &endLabel) { AddLabelReference(endLabel.v); }
565 void Post(const parser::EorLabel &eorLabel) { AddLabelReference(eorLabel.v); }
566 void Post(const parser::Format &format) {
567 if (const auto *labelPointer{std::get_if<parser::Label>(&format.u)}) {
571 void Post(const parser::CycleStmt &cycleStmt) {
576 void Post(const parser::ExitStmt &exitStmt) {
624 PushScope(!(std::is_same_v<A, parser::DoConstruct> ||
625 std::is_same_v<A, parser::IfConstruct> ||
626 std::is_same_v<A, parser::CaseConstruct>));
629 bool PushConstructName(const parser::BlockConstruct &blockConstruct) {
631 std::get<parser::Statement<parser::BlockStmt>>(blockConstruct.t)
645 void PopConstructNameIfPresent(const parser::BlockConstruct &blockConstruct) {
647 std::get<parser::Statement<parser::BlockStmt>>(blockConstruct.t)
663 CheckEndName<FIRST, parser::EndSelectStmt>(tag, construct);
666 tag, construct, std::get<parser::Statement<CASE>>(inner.t));
671 void PopConstructName(const parser::CaseConstruct &caseConstruct) {
672 CheckSelectNames<parser::SelectCaseStmt, parser::CaseConstruct::Case,
673 parser::CaseStmt>("SELECT CASE", caseConstruct);
680 const parser::SelectRankConstruct &selectRankConstruct) {
681 CheckSelectNames<parser::SelectRankStmt,
682 parser::SelectRankConstruct::RankCase, parser::SelectRankCaseStmt>(
690 const parser::SelectTypeConstruct &selectTypeConstruct) {
691 CheckSelectNames<parser::SelectTypeStmt,
692 parser::SelectTypeConstruct::TypeCase, parser::TypeGuardStmt>(
702 const auto &constructStmt{std::get<parser::Statement<FIRST>>(a.t)};
703 const auto &endStmt{std::get<parser::Statement<END>>(a.t)};
704 const parser::CharBlock *endName{GetStmtName(endStmt)};
705 if (const parser::CharBlock * constructName{GetStmtName(constructStmt)}) {
729 void CheckName(const parser::AssociateConstruct &associateConstruct) {
730 CheckEndName<parser::AssociateStmt, parser::EndAssociateStmt>(
734 void CheckName(const parser::CriticalConstruct &criticalConstruct) {
735 CheckEndName<parser::CriticalStmt, parser::EndCriticalStmt>(
739 void CheckName(const parser::DoConstruct &doConstruct) {
740 CheckEndName<parser::NonLabelDoStmt, parser::EndDoStmt>("DO", doConstruct);
741 if (auto label{std::get<std::optional<parser::Label>>(
742 std::get<parser::Statement<parser::NonLabelDoStmt>>(doConstruct.t)
745 std::get<parser::Statement<parser::EndDoStmt>>(doConstruct.t)};
751 .Attach(std::get<parser::Statement<parser::NonLabelDoStmt>>(
759 void CheckName(const parser::ForallConstruct &forallConstruct) {
760 CheckEndName<parser::ForallConstructStmt, parser::EndForallStmt>(
765 void CheckName(const parser::BlockConstruct &blockConstruct) {
766 CheckEndName<parser::BlockStmt, parser::EndBlockStmt>(
770 void CheckName(const parser::ChangeTeamConstruct &changeTeamConstruct) {
771 CheckEndName<parser::ChangeTeamStmt, parser::EndChangeTeamStmt>(
776 void CheckName(const parser::IfConstruct &ifConstruct) {
777 CheckEndName<parser::IfThenStmt, parser::EndIfStmt>("IF", ifConstruct);
779 std::get<std::list<parser::IfConstruct::ElseIfBlock>>(ifConstruct.t)) {
780 CheckOptionalName<parser::IfThenStmt>("IF construct", ifConstruct,
781 std::get<parser::Statement<parser::ElseIfStmt>>(elseIfBlock.t));
784 std::get<std::optional<parser::IfConstruct::ElseBlock>>(
786 CheckOptionalName<parser::IfThenStmt>("IF construct", ifConstruct,
787 std::get<parser::Statement<parser::ElseStmt>>(elseBlock->t));
792 void CheckName(const parser::WhereConstruct &whereConstruct) {
793 CheckEndName<parser::WhereConstructStmt, parser::EndWhereStmt>(
796 std::get<std::list<parser::WhereConstruct::MaskedElsewhere>>(
798 CheckOptionalName<parser::WhereConstructStmt>("WHERE construct",
800 std::get<parser::Statement<parser::MaskedElsewhereStmt>>(
804 std::get<std::optional<parser::WhereConstruct::Elsewhere>>(
806 CheckOptionalName<parser::WhereConstructStmt>("WHERE construct",
808 std::get<parser::Statement<parser::ElsewhereStmt>>(elsewhere->t));
814 const char *const stmtString, const parser::CharBlock &constructName) {
824 void CheckLabelInRange(parser::Label label) {
832 void AddTargetLabelDefinition(parser::Label label,
848 void AddLabelReferenceFromDoStmt(parser::Label label) {
854 void AddLabelReferenceToFormatStmt(parser::Label label) {
860 void AddLabelReferenceFromAssignStmt(parser::Label label) {
866 void AddLabelReference(parser::Label label) {
872 void AddLabelReference(const std::list<parser::Label> &labels) {
873 for (const parser::Label &label : labels) {
883 parser::CharBlock currentPosition_;
904 SemanticsContext &context, const parser::Program &program) {
910 bool InBody(const parser::CharBlock &position,
911 const std::pair<parser::CharBlock, parser::CharBlock> &pair) {
921 const TargetStmtMap &labels, const parser::Label &label) {
969 parser::CharBlock SkipLabel(const parser::CharBlock &position) {
971 if (maxPosition && parser::IsDecimalDigit(position[0])) {
973 for (; (i < maxPosition) && parser::IsDecimalDigit(position[i]); ++i) {
975 for (; (i < maxPosition) && parser::IsWhiteSpace(position[i]); ++i) {
977 return parser::CharBlock{position.begin() + i, position.end()};
1160 parser::Message *msg{nullptr};
1206 bool ValidateLabels(SemanticsContext &context, const parser::Program &program) {