// R1403 end-program-stmt -> END [PROGRAM [program-name]]
TYPE_CONTEXT_PARSER("END PROGRAM statement"_en_US,
- construct<EndProgramStmt>(recovery("END PROGRAM" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+ construct<EndProgramStmt>(recovery(
+ "END PROGRAM" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
// R1404 module ->
// module-stmt [specification-part] [module-subprogram-part]
// R1406 end-module-stmt -> END [MODULE [module-name]]
TYPE_CONTEXT_PARSER("END MODULE statement"_en_US,
- construct<EndModuleStmt>(recovery("END MODULE" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+ construct<EndModuleStmt>(recovery(
+ "END MODULE" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
// R1407 module-subprogram-part -> contains-stmt [module-subprogram]...
TYPE_CONTEXT_PARSER("module subprogram part"_en_US,
TYPE_CONTEXT_PARSER("END SUBMODULE statement"_en_US,
construct<EndSubmoduleStmt>(
recovery("END SUBMODULE" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+ progUnitEndStmtErrorRecovery)))
// R1420 block-data -> block-data-stmt [specification-part] end-block-data-stmt
TYPE_CONTEXT_PARSER("BLOCK DATA subprogram"_en_US,
TYPE_CONTEXT_PARSER("END BLOCK DATA statement"_en_US,
construct<EndBlockDataStmt>(
recovery("END BLOCK DATA" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+ progUnitEndStmtErrorRecovery)))
// R1501 interface-block ->
// interface-stmt [interface-specification]... end-interface-stmt
"RESULT" >> parenthesized(name), maybe(languageBindingSpec)))
// R1533 end-function-stmt -> END [FUNCTION [function-name]]
-TYPE_PARSER(construct<EndFunctionStmt>(
- recovery("END FUNCTION" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+TYPE_PARSER(construct<EndFunctionStmt>(recovery(
+ "END FUNCTION" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
// R1534 subroutine-subprogram ->
// subroutine-stmt [specification-part] [execution-part]
TYPE_PARSER(construct<DummyArg>(name) || construct<DummyArg>(star))
// R1537 end-subroutine-stmt -> END [SUBROUTINE [subroutine-name]]
-TYPE_PARSER(construct<EndSubroutineStmt>(
- recovery("END SUBROUTINE" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+TYPE_PARSER(construct<EndSubroutineStmt>(recovery(
+ "END SUBROUTINE" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
// R1538 separate-module-subprogram ->
// mp-subprogram-stmt [specification-part] [execution-part]
TYPE_CONTEXT_PARSER("END PROCEDURE statement"_en_US,
construct<EndMpSubprogramStmt>(
recovery("END PROCEDURE" >> maybe(name) || bareEnd,
- unterminatedEndStmtErrorRecovery)))
+ progUnitEndStmtErrorRecovery)))
// R1541 entry-stmt -> ENTRY entry-name [( [dummy-arg-list] ) [suffix]]
TYPE_PARSER(
constexpr auto noNameEnd{"END" >> missingOptionalName};
constexpr auto bareEnd{noNameEnd / lookAhead(endOfStmt)};
constexpr auto endStmtErrorRecovery{
- ("END"_tok / SkipPast<'\n'>{} || consumedAllInput) >> missingOptionalName};
-constexpr auto unterminatedEndStmtErrorRecovery{
- ("END"_tok / SkipTo<'\n'>{} || consumedAllInput) >> missingOptionalName};
+ ("END"_tok >> SkipPast<'\n'>{} || consumedAllInput) >> missingOptionalName};
+constexpr auto progUnitEndStmtErrorRecovery{
+ (many(!"END"_tok >> SkipPast<'\n'>{}) >>
+ ("END"_tok >> SkipTo<'\n'>{} || consumedAllInput)) >>
+ missingOptionalName};
} // namespace Fortran::parser
#endif // FORTRAN_PARSER_STMT_PARSER_H_