9#ifndef FORTRAN_PARSER_STMT_PARSER_H_
10#define FORTRAN_PARSER_STMT_PARSER_H_
14#include "basic-parsers.h"
15#include "token-parsers.h"
24constexpr auto label{space >> digitString64 / spaceCheck};
27inline constexpr auto unterminatedStatement(
const PA &p) {
28 return skipStuffBeforeStatement >>
29 sourced(construct<Statement<typename PA::resultType>>(
30 maybe(label), space >> p));
33constexpr auto atEndOfStmt{space >>
34 withMessage(
"expected end of statement"_err_en_US, lookAhead(
";\n"_ch))};
35constexpr auto checkEndOfKnownStmt{recovery(atEndOfStmt, SkipTo<
'\n'>{})};
37constexpr auto endOfLine{
38 "\n"_ch >> ok || fail(
"expected end of line"_err_en_US)};
40constexpr auto semicolons{
";"_ch >> skipMany(
";"_tok) / space / maybe(
"\n"_ch)};
41constexpr auto endOfStmt{
42 space >> withMessage(
"expected end of statement"_err_en_US,
43 semicolons || endOfLine)};
44constexpr auto forceEndOfStmt{recovery(endOfStmt, SkipPast<
'\n'>{})};
46template <
typename PA>
inline constexpr auto statement(
const PA &p) {
47 return unterminatedStatement(p) / endOfStmt;
52template <
typename PA>
inline constexpr auto unlabeledStatement(
const PA &p) {
54 sourced(construct<UnlabeledStatement<typename PA::resultType>>(p));
63template <
typename PA>
inline constexpr auto unambiguousStatement(
const PA &p) {
64 return unterminatedStatement(p) / forceEndOfStmt;
67constexpr auto ignoredStatementPrefix{
68 skipStuffBeforeStatement >> maybe(label) >> maybe(name /
":") >> space};
72constexpr auto inStmtErrorRecovery{!
"END"_tok >> !
"CONTAINS"_tok >>
73 SkipTo<
'\n'>{} >> construct<ErrorRecovery>()};
77constexpr auto skipStmtErrorRecovery{!
"END"_tok >> !
"CONTAINS"_tok >>
78 SkipPast<
'\n'>{} >> construct<ErrorRecovery>()};
82constexpr auto stmtErrorRecoveryStart{ignoredStatementPrefix};
83constexpr auto skipBadLine{SkipPast<
'\n'>{} >> construct<ErrorRecovery>()};
84constexpr auto executionPartErrorRecovery{stmtErrorRecoveryStart >>
85 !
"END"_tok >> !
"CONTAINS"_tok >> !
"ELSE"_tok >> !
"CASE"_tok >>
86 !
"TYPE IS"_tok >> !
"CLASS"_tok >> !
"RANK"_tok >>
87 !(
"!$ACC "_sptok >>
"END"_tok) >>
88 !(
"!$OMP "_sptok >> (
"END"_tok ||
"SECTION"_id)) >> skipBadLine};
91constexpr auto missingOptionalName{pure<std::optional<Name>>()};
92constexpr auto noNameEnd{
"END" >> missingOptionalName};
96constexpr auto progUnitEndStmt{
97 "END" >> (lookAhead(
"\n"_ch) ||
"SUBROUTINE"_tok ||
"FUNCTION"_tok ||
98 "PROCEDURE"_tok ||
"MODULE"_tok ||
"SUBMODULE"_tok ||
99 "PROGRAM"_tok ||
"BLOCK DATA"_tok)};
100constexpr auto constructEndStmtErrorRecovery{
101 !progUnitEndStmt >> (
"END"_tok >> SkipTo<
'\n'>{} || ok)};
102constexpr auto namedConstructEndStmtErrorRecovery{
103 constructEndStmtErrorRecovery >> missingOptionalName};
105constexpr auto progUnitEndStmtErrorRecovery{
106 (many(!
"END"_tok >> SkipPast<
'\n'>{}) >>
107 (
"END"_tok >> SkipTo<
'\n'>{} || consumedAllInput)) >>
108 missingOptionalName};
110constexpr auto beginDirective{skipStuffBeforeStatement >>
"!"_ch};
111constexpr auto endDirective{space >> endOfLine};
Definition: check-expression.h:19