#ifndef FORTRAN_PARSER_EXPR_PARSERS_H_
#define FORTRAN_PARSER_EXPR_PARSERS_H_
#include "basic-parsers.h"
#include "token-parsers.h"
#include "type-parsers.h"
#include "flang/Parser/parse-tree.h"
namespace Fortran::parser {
template <typename PA> inline constexpr auto scalar(const PA &p) {
return construct<Scalar<typename PA::resultType>>(p);
}
template <typename PA> inline constexpr auto constant(const PA &p) {
return construct<Constant<typename PA::resultType>>(p);
}
template <typename PA> inline constexpr auto integer(const PA &p) {
return construct<Integer<typename PA::resultType>>(p);
}
template <typename PA> inline constexpr auto logical(const PA &p) {
return construct<Logical<typename PA::resultType>>(p);
}
template <typename PA> inline constexpr auto defaultChar(const PA &p) {
return construct<DefaultChar<typename PA::resultType>>(p);
}
constexpr auto charLiteralConstantWithoutKind{
"'"_ch >> CharLiteral<'\''>{} || "\""_ch >> CharLiteral<'"'>{}};
constexpr auto scalarLogicalVariable{scalar(logical(variable))};
constexpr auto scalarDefaultCharVariable{scalar(defaultChar(variable))};
constexpr auto scalarIntVariable{scalar(integer(variable))};
constexpr auto msgVariable{construct<MsgVariable>(scalarDefaultCharVariable)};
constexpr auto logicalExpr{logical(indirect(expr))};
constexpr auto scalarLogicalExpr{scalar(logicalExpr)};
constexpr auto defaultCharExpr{defaultChar(indirect(expr))};
constexpr auto scalarDefaultCharExpr{scalar(defaultCharExpr)};
constexpr auto intExpr{integer(indirect(expr))};
constexpr auto scalarIntExpr{scalar(intExpr)};
constexpr auto constantExpr{constant(indirect(expr))};
constexpr auto scalarExpr{scalar(indirect(expr))};
constexpr auto scalarDefaultCharConstantExpr{scalar(defaultChar(constantExpr))};
constexpr auto intConstantExpr{integer(constantExpr)};
constexpr auto scalarIntConstantExpr{scalar(intConstantExpr)};
constexpr auto boundExpr{scalarIntExpr};
constexpr auto teamValue{scalar(indirect(expr))};
constexpr auto doVariable{scalar(integer(name))};
inline constexpr auto loopBounds(decltype(scalarExpr) &p) {
return construct<LoopBounds<ScalarName, ScalarExpr>>(
scalar(name) / "=", p / ",", p, maybe("," >> p));
}
template <typename PA> inline constexpr auto loopBounds(const PA &p) {
return construct<LoopBounds<DoVariable, typename PA::resultType>>(
doVariable / "=", p / ",", p, maybe("," >> p));
}
}
#endif