xref: /llvm-project/flang/lib/Parser/expr-parsers.h (revision b98ad941a40c96c841bceb171725c925500fce6c)
164ab3302SCarolineConcatto //===-- lib/Parser/expr-parsers.h -------------------------------*- C++ -*-===//
264ab3302SCarolineConcatto //
364ab3302SCarolineConcatto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
464ab3302SCarolineConcatto // See https://llvm.org/LICENSE.txt for license information.
564ab3302SCarolineConcatto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
664ab3302SCarolineConcatto //
764ab3302SCarolineConcatto //===----------------------------------------------------------------------===//
864ab3302SCarolineConcatto 
964ab3302SCarolineConcatto #ifndef FORTRAN_PARSER_EXPR_PARSERS_H_
1064ab3302SCarolineConcatto #define FORTRAN_PARSER_EXPR_PARSERS_H_
1164ab3302SCarolineConcatto 
1264ab3302SCarolineConcatto #include "basic-parsers.h"
1364ab3302SCarolineConcatto #include "token-parsers.h"
1464ab3302SCarolineConcatto #include "type-parsers.h"
1564ab3302SCarolineConcatto #include "flang/Parser/parse-tree.h"
1664ab3302SCarolineConcatto 
1764ab3302SCarolineConcatto namespace Fortran::parser {
1864ab3302SCarolineConcatto 
1964ab3302SCarolineConcatto // R403 scalar-xyz -> xyz
2064ab3302SCarolineConcatto // Also define constant-xyz, int-xyz, default-char-xyz.
scalar(const PA & p)2164ab3302SCarolineConcatto template <typename PA> inline constexpr auto scalar(const PA &p) {
2264ab3302SCarolineConcatto   return construct<Scalar<typename PA::resultType>>(p); // scalar-p
2364ab3302SCarolineConcatto }
2464ab3302SCarolineConcatto 
constant(const PA & p)2564ab3302SCarolineConcatto template <typename PA> inline constexpr auto constant(const PA &p) {
2664ab3302SCarolineConcatto   return construct<Constant<typename PA::resultType>>(p); // constant-p
2764ab3302SCarolineConcatto }
2864ab3302SCarolineConcatto 
integer(const PA & p)2964ab3302SCarolineConcatto template <typename PA> inline constexpr auto integer(const PA &p) {
3064ab3302SCarolineConcatto   return construct<Integer<typename PA::resultType>>(p); // int-p
3164ab3302SCarolineConcatto }
3264ab3302SCarolineConcatto 
logical(const PA & p)3364ab3302SCarolineConcatto template <typename PA> inline constexpr auto logical(const PA &p) {
3464ab3302SCarolineConcatto   return construct<Logical<typename PA::resultType>>(p); // logical-p
3564ab3302SCarolineConcatto }
3664ab3302SCarolineConcatto 
defaultChar(const PA & p)3764ab3302SCarolineConcatto template <typename PA> inline constexpr auto defaultChar(const PA &p) {
3864ab3302SCarolineConcatto   return construct<DefaultChar<typename PA::resultType>>(p); // default-char-p
3964ab3302SCarolineConcatto }
4064ab3302SCarolineConcatto 
4164ab3302SCarolineConcatto // N.B. charLiteralConstantWithoutKind does not skip preceding space.
4264ab3302SCarolineConcatto constexpr auto charLiteralConstantWithoutKind{
4364ab3302SCarolineConcatto     "'"_ch >> CharLiteral<'\''>{} || "\""_ch >> CharLiteral<'"'>{}};
4464ab3302SCarolineConcatto 
4564ab3302SCarolineConcatto // R904 logical-variable -> variable
4664ab3302SCarolineConcatto // Appears only as part of scalar-logical-variable.
4764ab3302SCarolineConcatto constexpr auto scalarLogicalVariable{scalar(logical(variable))};
4864ab3302SCarolineConcatto 
4964ab3302SCarolineConcatto // R906 default-char-variable -> variable
5064ab3302SCarolineConcatto // Appears only as part of scalar-default-char-variable.
5164ab3302SCarolineConcatto constexpr auto scalarDefaultCharVariable{scalar(defaultChar(variable))};
5264ab3302SCarolineConcatto 
5364ab3302SCarolineConcatto // R907 int-variable -> variable
5464ab3302SCarolineConcatto // Appears only as part of scalar-int-variable.
5564ab3302SCarolineConcatto constexpr auto scalarIntVariable{scalar(integer(variable))};
5664ab3302SCarolineConcatto 
5764ab3302SCarolineConcatto // R930 errmsg-variable -> scalar-default-char-variable
5864ab3302SCarolineConcatto // R1207 iomsg-variable -> scalar-default-char-variable
5964ab3302SCarolineConcatto constexpr auto msgVariable{construct<MsgVariable>(scalarDefaultCharVariable)};
6064ab3302SCarolineConcatto 
6164ab3302SCarolineConcatto // R1024 logical-expr -> expr
6264ab3302SCarolineConcatto constexpr auto logicalExpr{logical(indirect(expr))};
6364ab3302SCarolineConcatto constexpr auto scalarLogicalExpr{scalar(logicalExpr)};
6464ab3302SCarolineConcatto 
6564ab3302SCarolineConcatto // R1025 default-char-expr -> expr
6664ab3302SCarolineConcatto constexpr auto defaultCharExpr{defaultChar(indirect(expr))};
6764ab3302SCarolineConcatto constexpr auto scalarDefaultCharExpr{scalar(defaultCharExpr)};
6864ab3302SCarolineConcatto 
6964ab3302SCarolineConcatto // R1026 int-expr -> expr
7064ab3302SCarolineConcatto constexpr auto intExpr{integer(indirect(expr))};
7164ab3302SCarolineConcatto constexpr auto scalarIntExpr{scalar(intExpr)};
7264ab3302SCarolineConcatto 
7364ab3302SCarolineConcatto // R1029 constant-expr -> expr
7464ab3302SCarolineConcatto constexpr auto constantExpr{constant(indirect(expr))};
7564ab3302SCarolineConcatto constexpr auto scalarExpr{scalar(indirect(expr))};
7664ab3302SCarolineConcatto 
7764ab3302SCarolineConcatto // R1030 default-char-constant-expr -> default-char-expr
7864ab3302SCarolineConcatto constexpr auto scalarDefaultCharConstantExpr{scalar(defaultChar(constantExpr))};
7964ab3302SCarolineConcatto 
8064ab3302SCarolineConcatto // R1031 int-constant-expr -> int-expr
8164ab3302SCarolineConcatto constexpr auto intConstantExpr{integer(constantExpr)};
8264ab3302SCarolineConcatto constexpr auto scalarIntConstantExpr{scalar(intConstantExpr)};
8364ab3302SCarolineConcatto 
8464ab3302SCarolineConcatto // R935 lower-bound-expr -> scalar-int-expr
8564ab3302SCarolineConcatto // R936 upper-bound-expr -> scalar-int-expr
8664ab3302SCarolineConcatto constexpr auto boundExpr{scalarIntExpr};
8764ab3302SCarolineConcatto 
8864ab3302SCarolineConcatto // R1115 team-value -> scalar-expr
8964ab3302SCarolineConcatto constexpr auto teamValue{scalar(indirect(expr))};
9064ab3302SCarolineConcatto 
9164ab3302SCarolineConcatto // R1124 do-variable -> scalar-int-variable-name
9264ab3302SCarolineConcatto constexpr auto doVariable{scalar(integer(name))};
9364ab3302SCarolineConcatto 
9464ab3302SCarolineConcatto // NOTE: In loop-control we allow REAL name and bounds too.
9564ab3302SCarolineConcatto // This means parse them without the integer constraint and check later.
loopBounds(decltype (scalarExpr)& p)9664ab3302SCarolineConcatto inline constexpr auto loopBounds(decltype(scalarExpr) &p) {
9764ab3302SCarolineConcatto   return construct<LoopBounds<ScalarName, ScalarExpr>>(
9864ab3302SCarolineConcatto       scalar(name) / "=", p / ",", p, maybe("," >> p));
9964ab3302SCarolineConcatto }
loopBounds(const PA & p)10064ab3302SCarolineConcatto template <typename PA> inline constexpr auto loopBounds(const PA &p) {
10164ab3302SCarolineConcatto   return construct<LoopBounds<DoVariable, typename PA::resultType>>(
10264ab3302SCarolineConcatto       doVariable / "=", p / ",", p, maybe("," >> p));
10364ab3302SCarolineConcatto }
104*1f879005STim Keith } // namespace Fortran::parser
10564ab3302SCarolineConcatto #endif
106