[flang] Even better program unit END statement error recovery.
Original-commit: flang-compiler/f18@31f456ebc5 Reviewed-on: https://github.com/flang-compiler/f18/pull/156 Tree-same-pre-rewrite: false
This commit is contained in:
parent
6135c20380
commit
e1b584468c
2 changed files with 16 additions and 16 deletions
|
@ -2975,8 +2975,8 @@ TYPE_CONTEXT_PARSER("PROGRAM statement"_en_US,
|
||||||
|
|
||||||
// R1403 end-program-stmt -> END [PROGRAM [program-name]]
|
// R1403 end-program-stmt -> END [PROGRAM [program-name]]
|
||||||
TYPE_CONTEXT_PARSER("END PROGRAM statement"_en_US,
|
TYPE_CONTEXT_PARSER("END PROGRAM statement"_en_US,
|
||||||
construct<EndProgramStmt>(recovery("END PROGRAM" >> maybe(name) || bareEnd,
|
construct<EndProgramStmt>(recovery(
|
||||||
unterminatedEndStmtErrorRecovery)))
|
"END PROGRAM" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
|
||||||
|
|
||||||
// R1404 module ->
|
// R1404 module ->
|
||||||
// module-stmt [specification-part] [module-subprogram-part]
|
// module-stmt [specification-part] [module-subprogram-part]
|
||||||
|
@ -2992,8 +2992,8 @@ TYPE_CONTEXT_PARSER(
|
||||||
|
|
||||||
// R1406 end-module-stmt -> END [MODULE [module-name]]
|
// R1406 end-module-stmt -> END [MODULE [module-name]]
|
||||||
TYPE_CONTEXT_PARSER("END MODULE statement"_en_US,
|
TYPE_CONTEXT_PARSER("END MODULE statement"_en_US,
|
||||||
construct<EndModuleStmt>(recovery("END MODULE" >> maybe(name) || bareEnd,
|
construct<EndModuleStmt>(recovery(
|
||||||
unterminatedEndStmtErrorRecovery)))
|
"END MODULE" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
|
||||||
|
|
||||||
// R1407 module-subprogram-part -> contains-stmt [module-subprogram]...
|
// R1407 module-subprogram-part -> contains-stmt [module-subprogram]...
|
||||||
TYPE_CONTEXT_PARSER("module subprogram part"_en_US,
|
TYPE_CONTEXT_PARSER("module subprogram part"_en_US,
|
||||||
|
@ -3055,7 +3055,7 @@ TYPE_PARSER(construct<ParentIdentifier>(name, maybe(":" >> name)))
|
||||||
TYPE_CONTEXT_PARSER("END SUBMODULE statement"_en_US,
|
TYPE_CONTEXT_PARSER("END SUBMODULE statement"_en_US,
|
||||||
construct<EndSubmoduleStmt>(
|
construct<EndSubmoduleStmt>(
|
||||||
recovery("END SUBMODULE" >> maybe(name) || bareEnd,
|
recovery("END SUBMODULE" >> maybe(name) || bareEnd,
|
||||||
unterminatedEndStmtErrorRecovery)))
|
progUnitEndStmtErrorRecovery)))
|
||||||
|
|
||||||
// R1420 block-data -> block-data-stmt [specification-part] end-block-data-stmt
|
// R1420 block-data -> block-data-stmt [specification-part] end-block-data-stmt
|
||||||
TYPE_CONTEXT_PARSER("BLOCK DATA subprogram"_en_US,
|
TYPE_CONTEXT_PARSER("BLOCK DATA subprogram"_en_US,
|
||||||
|
@ -3071,7 +3071,7 @@ TYPE_CONTEXT_PARSER("BLOCK DATA statement"_en_US,
|
||||||
TYPE_CONTEXT_PARSER("END BLOCK DATA statement"_en_US,
|
TYPE_CONTEXT_PARSER("END BLOCK DATA statement"_en_US,
|
||||||
construct<EndBlockDataStmt>(
|
construct<EndBlockDataStmt>(
|
||||||
recovery("END BLOCK DATA" >> maybe(name) || bareEnd,
|
recovery("END BLOCK DATA" >> maybe(name) || bareEnd,
|
||||||
unterminatedEndStmtErrorRecovery)))
|
progUnitEndStmtErrorRecovery)))
|
||||||
|
|
||||||
// R1501 interface-block ->
|
// R1501 interface-block ->
|
||||||
// interface-stmt [interface-specification]... end-interface-stmt
|
// interface-stmt [interface-specification]... end-interface-stmt
|
||||||
|
@ -3253,9 +3253,8 @@ TYPE_PARSER(construct<Suffix>(
|
||||||
"RESULT" >> parenthesized(name), maybe(languageBindingSpec)))
|
"RESULT" >> parenthesized(name), maybe(languageBindingSpec)))
|
||||||
|
|
||||||
// R1533 end-function-stmt -> END [FUNCTION [function-name]]
|
// R1533 end-function-stmt -> END [FUNCTION [function-name]]
|
||||||
TYPE_PARSER(construct<EndFunctionStmt>(
|
TYPE_PARSER(construct<EndFunctionStmt>(recovery(
|
||||||
recovery("END FUNCTION" >> maybe(name) || bareEnd,
|
"END FUNCTION" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
|
||||||
unterminatedEndStmtErrorRecovery)))
|
|
||||||
|
|
||||||
// R1534 subroutine-subprogram ->
|
// R1534 subroutine-subprogram ->
|
||||||
// subroutine-stmt [specification-part] [execution-part]
|
// subroutine-stmt [specification-part] [execution-part]
|
||||||
|
@ -3279,9 +3278,8 @@ TYPE_PARSER(
|
||||||
TYPE_PARSER(construct<DummyArg>(name) || construct<DummyArg>(star))
|
TYPE_PARSER(construct<DummyArg>(name) || construct<DummyArg>(star))
|
||||||
|
|
||||||
// R1537 end-subroutine-stmt -> END [SUBROUTINE [subroutine-name]]
|
// R1537 end-subroutine-stmt -> END [SUBROUTINE [subroutine-name]]
|
||||||
TYPE_PARSER(construct<EndSubroutineStmt>(
|
TYPE_PARSER(construct<EndSubroutineStmt>(recovery(
|
||||||
recovery("END SUBROUTINE" >> maybe(name) || bareEnd,
|
"END SUBROUTINE" >> maybe(name) || bareEnd, progUnitEndStmtErrorRecovery)))
|
||||||
unterminatedEndStmtErrorRecovery)))
|
|
||||||
|
|
||||||
// R1538 separate-module-subprogram ->
|
// R1538 separate-module-subprogram ->
|
||||||
// mp-subprogram-stmt [specification-part] [execution-part]
|
// mp-subprogram-stmt [specification-part] [execution-part]
|
||||||
|
@ -3299,7 +3297,7 @@ TYPE_CONTEXT_PARSER("MODULE PROCEDURE statement"_en_US,
|
||||||
TYPE_CONTEXT_PARSER("END PROCEDURE statement"_en_US,
|
TYPE_CONTEXT_PARSER("END PROCEDURE statement"_en_US,
|
||||||
construct<EndMpSubprogramStmt>(
|
construct<EndMpSubprogramStmt>(
|
||||||
recovery("END PROCEDURE" >> maybe(name) || bareEnd,
|
recovery("END PROCEDURE" >> maybe(name) || bareEnd,
|
||||||
unterminatedEndStmtErrorRecovery)))
|
progUnitEndStmtErrorRecovery)))
|
||||||
|
|
||||||
// R1541 entry-stmt -> ENTRY entry-name [( [dummy-arg-list] ) [suffix]]
|
// R1541 entry-stmt -> ENTRY entry-name [( [dummy-arg-list] ) [suffix]]
|
||||||
TYPE_PARSER(
|
TYPE_PARSER(
|
||||||
|
|
|
@ -85,9 +85,11 @@ constexpr auto missingOptionalName{defaulted(cut >> maybe(name))};
|
||||||
constexpr auto noNameEnd{"END" >> missingOptionalName};
|
constexpr auto noNameEnd{"END" >> missingOptionalName};
|
||||||
constexpr auto bareEnd{noNameEnd / lookAhead(endOfStmt)};
|
constexpr auto bareEnd{noNameEnd / lookAhead(endOfStmt)};
|
||||||
constexpr auto endStmtErrorRecovery{
|
constexpr auto endStmtErrorRecovery{
|
||||||
("END"_tok / SkipPast<'\n'>{} || consumedAllInput) >> missingOptionalName};
|
("END"_tok >> SkipPast<'\n'>{} || consumedAllInput) >> missingOptionalName};
|
||||||
constexpr auto unterminatedEndStmtErrorRecovery{
|
constexpr auto progUnitEndStmtErrorRecovery{
|
||||||
("END"_tok / SkipTo<'\n'>{} || consumedAllInput) >> missingOptionalName};
|
(many(!"END"_tok >> SkipPast<'\n'>{}) >>
|
||||||
|
("END"_tok >> SkipTo<'\n'>{} || consumedAllInput)) >>
|
||||||
|
missingOptionalName};
|
||||||
|
|
||||||
} // namespace Fortran::parser
|
} // namespace Fortran::parser
|
||||||
#endif // FORTRAN_PARSER_STMT_PARSER_H_
|
#endif // FORTRAN_PARSER_STMT_PARSER_H_
|
||||||
|
|
Loading…
Reference in a new issue