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 >>
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{consumedAllInput ||
38 withMessage(
"expected end of line"_err_en_US,
"\n"_ch >> ok)};
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 skipToNextLineIfAny{consumedAllInput ||
SkipPast<
'\n'>{}};
45constexpr auto forceEndOfStmt{recovery(endOfStmt, skipToNextLineIfAny)};
47template <
typename PA>
inline constexpr auto statement(
const PA &p) {
48 return unterminatedStatement(p) / endOfStmt;
53template <
typename PA>
inline constexpr auto unlabeledStatement(
const PA &p) {
64template <
typename PA>
inline constexpr auto unambiguousStatement(
const PA &p) {
65 return unterminatedStatement(p) / forceEndOfStmt;
68constexpr auto ignoredStatementPrefix{
69 skipStuffBeforeStatement >> maybe(label) >> maybe(name /
":") >> space};
73constexpr auto inStmtErrorRecovery{!
"END"_tok >> !
"CONTAINS"_tok >>
74 (consumedAllInput ||
SkipTo<
'\n'>{}) >> construct<ErrorRecovery>()};
78constexpr auto skipStmtErrorRecovery{!
"END"_tok >> !
"CONTAINS"_tok >>
79 (consumedAllInput ||
SkipPast<
'\n'>{}) >> construct<ErrorRecovery>()};
83constexpr auto stmtErrorRecoveryStart{ignoredStatementPrefix};
84constexpr auto skipBadLine{skipToNextLineIfAny >> construct<ErrorRecovery>()};
85constexpr auto executionPartErrorRecovery{stmtErrorRecoveryStart >>
86 !
"END"_tok >> !
"CONTAINS"_tok >> !
"ELSE"_tok >> !
"CASE"_tok >>
87 !
"TYPE IS"_tok >> !
"CLASS"_tok >> !
"RANK"_tok >>
88 !(
"!$ACC "_sptok >>
"END"_tok) >>
89 !(
"!$OMP "_sptok >> (
"END"_tok ||
"SECTION"_id)) >> skipBadLine};
92constexpr auto missingOptionalName{pure<std::optional<Name>>()};
93constexpr auto noNameEnd{
"END" >> missingOptionalName};
97constexpr auto progUnitEndStmt{consumedAllInput ||
98 "END" >> (lookAhead(
"\n"_ch) ||
"SUBROUTINE"_tok ||
"FUNCTION"_tok ||
99 "PROCEDURE"_tok ||
"MODULE"_tok ||
"SUBMODULE"_tok ||
100 "PROGRAM"_tok ||
"BLOCK DATA"_tok)};
101constexpr auto constructEndStmtErrorRecovery{
102 !progUnitEndStmt >> (
"END"_tok >>
SkipTo<
'\n'>{} || ok)};
103constexpr auto namedConstructEndStmtErrorRecovery{
104 constructEndStmtErrorRecovery >> missingOptionalName};
106constexpr auto progUnitEndStmtErrorRecovery{
107 many(!
"END"_tok >>
SkipPast<
'\n'>{}) >>
108 maybe(
"END"_tok >>
SkipTo<
'\n'>{}) >> missingOptionalName};
110constexpr auto beginDirective{skipStuffBeforeStatement >>
"!"_ch};
111constexpr auto endDirective{space >> endOfLine};
Definition check-expression.h:19
Definition token-parsers.h:559
Definition token-parsers.h:575
Definition parse-tree.h:355
Definition parse-tree.h:350