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. 2164ab3302SCarolineConcatto template <typename PA> inline constexpr auto scalar(const PA &p) { 2264ab3302SCarolineConcatto return construct<Scalar<typename PA::resultType>>(p); // scalar-p 2364ab3302SCarolineConcatto } 2464ab3302SCarolineConcatto 2564ab3302SCarolineConcatto template <typename PA> inline constexpr auto constant(const PA &p) { 2664ab3302SCarolineConcatto return construct<Constant<typename PA::resultType>>(p); // constant-p 2764ab3302SCarolineConcatto } 2864ab3302SCarolineConcatto 2964ab3302SCarolineConcatto template <typename PA> inline constexpr auto integer(const PA &p) { 3064ab3302SCarolineConcatto return construct<Integer<typename PA::resultType>>(p); // int-p 3164ab3302SCarolineConcatto } 3264ab3302SCarolineConcatto 3364ab3302SCarolineConcatto template <typename PA> inline constexpr auto logical(const PA &p) { 3464ab3302SCarolineConcatto return construct<Logical<typename PA::resultType>>(p); // logical-p 3564ab3302SCarolineConcatto } 3664ab3302SCarolineConcatto 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. 9664ab3302SCarolineConcatto inline constexpr auto loopBounds(decltype(scalarExpr) &p) { 9764ab3302SCarolineConcatto return construct<LoopBounds<ScalarName, ScalarExpr>>( 9864ab3302SCarolineConcatto scalar(name) / "=", p / ",", p, maybe("," >> p)); 9964ab3302SCarolineConcatto } 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