12#ifndef FORTRAN_PARSER_MISC_PARSERS_H_
13#define FORTRAN_PARSER_MISC_PARSERS_H_
15#include "basic-parsers.h"
16#include "token-parsers.h"
17#include "type-parsers.h"
18#include "flang/Parser/message.h"
19#include "flang/Parser/parse-tree.h"
24template <
typename PA>
inline constexpr auto nonemptyList(
const PA &p) {
25 return nonemptySeparated(p,
","_tok);
29inline constexpr auto nonemptyList(MessageFixedText error,
const PA &p) {
30 return withMessage(error, nonemptySeparated(p,
","_tok));
33template <
typename PA>
inline constexpr auto optionalList(
const PA &p) {
34 return defaulted(nonemptySeparated(p,
","_tok));
40constexpr auto keyword{construct<Keyword>(name)};
43constexpr auto block{many(executionPartConstruct)};
45constexpr auto listOfNames{nonemptyList(
"expected names"_err_en_US, name)};
47constexpr auto star{construct<Star>(
"*"_tok)};
48constexpr auto allocatable{construct<Allocatable>(
"ALLOCATABLE"_tok)};
49constexpr auto contiguous{construct<Contiguous>(
"CONTIGUOUS"_tok)};
50constexpr auto optional{construct<Optional>(
"OPTIONAL"_tok)};
51constexpr auto pointer{construct<Pointer>(
"POINTER"_tok)};
52constexpr auto protectedAttr{construct<Protected>(
"PROTECTED"_tok)};
53constexpr auto save{construct<Save>(
"SAVE"_tok)};
55template <
typename A> common::IfNoLvalue<std::list<A>, A> singletonList(A &&x) {
57 result.emplace_back(std::move(x));
62common::IfNoLvalue<std::optional<A>, A> presentOptional(A &&x) {
63 return std::make_optional(std::move(x));
Definition: check-expression.h:19