peter klausler | 204a50d | 2019-02-27 20:30:57 | [diff] [blame] | 1 | // Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. |
Tim Keith | 18cee3e | 2018-05-01 19:50:34 | [diff] [blame] | 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 15 | // Generates Fortran from the content of a parse tree, using the |
| 16 | // traversal templates in parse-tree-visitor.h. |
| 17 | |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 18 | #include "unparse.h" |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 19 | #include "characters.h" |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 20 | #include "parse-tree-visitor.h" |
| 21 | #include "parse-tree.h" |
peter klausler | ab74d1a | 2019-02-28 18:48:41 | [diff] [blame] | 22 | #include "../common/Fortran.h" |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 23 | #include "../common/idioms.h" |
| 24 | #include "../common/indirection.h" |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 25 | #include <algorithm> |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 26 | #include <cinttypes> |
| 27 | #include <cstddef> |
peter klausler | 4e354d8 | 2018-03-30 22:23:37 | [diff] [blame] | 28 | #include <set> |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 29 | |
Tim Keith | 7f66c0a | 2018-05-02 20:48:12 | [diff] [blame] | 30 | namespace Fortran::parser { |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 31 | |
| 32 | class UnparseVisitor { |
| 33 | public: |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 34 | UnparseVisitor(std::ostream &out, int indentationAmount, Encoding encoding, |
peter klausler | 888786b | 2018-07-19 22:35:55 | [diff] [blame] | 35 | bool capitalize, bool backslashEscapes, preStatementType *preStatement) |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 36 | : out_{out}, indentationAmount_{indentationAmount}, encoding_{encoding}, |
peter klausler | 888786b | 2018-07-19 22:35:55 | [diff] [blame] | 37 | capitalizeKeywords_{capitalize}, backslashEscapes_{backslashEscapes}, |
| 38 | preStatement_{preStatement} {} |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 39 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 40 | // In nearly all cases, this code avoids defining Boolean-valued Pre() |
| 41 | // callbacks for the parse tree walking framework in favor of two void |
| 42 | // functions, Before() and Unparse(), which imply true and false return |
| 43 | // values for Pre() respectively. |
| 44 | template<typename T> void Before(const T &) {} |
| 45 | template<typename T> double Unparse(const T &); // not void, never used |
| 46 | |
peter klausler | 022a91b | 2018-04-26 22:44:29 | [diff] [blame] | 47 | template<typename T> bool Pre(const T &x) { |
| 48 | if constexpr (std::is_void_v<decltype(Unparse(x))>) { |
| 49 | // There is a local definition of Unparse() for this type. It |
| 50 | // overrides the parse tree walker's default Walk() over the descendents. |
| 51 | Before(x); |
| 52 | Unparse(x); |
| 53 | Post(x); |
| 54 | return false; // Walk() does not visit descendents |
| 55 | } else { |
| 56 | Before(x); |
| 57 | return true; // there's no Unparse() defined here, Walk() the descendents |
| 58 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 59 | } |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 60 | template<typename T> void Post(const T &) {} |
| 61 | |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 62 | // Emit simple types as-is. |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 63 | void Unparse(const std::string &x) { Put(x); } |
| 64 | void Unparse(int x) { Put(std::to_string(x)); } |
Tim Keith | 03435d9 | 2018-10-10 14:24:27 | [diff] [blame] | 65 | void Unparse(unsigned int x) { Put(std::to_string(x)); } |
| 66 | void Unparse(long x) { Put(std::to_string(x)); } |
| 67 | void Unparse(unsigned long x) { Put(std::to_string(x)); } |
| 68 | void Unparse(long long x) { Put(std::to_string(x)); } |
| 69 | void Unparse(unsigned long long x) { Put(std::to_string(x)); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 70 | void Unparse(char x) { Put(x); } |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 71 | |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 72 | // Statement labels and ends of lines |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 73 | template<typename T> void Before(const Statement<T> &x) { |
Tim Keith | 89840b5 | 2018-06-26 22:01:42 | [diff] [blame] | 74 | if (preStatement_) { |
| 75 | (*preStatement_)(x.source, out_, indent_); |
| 76 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 77 | Walk(x.label, " "); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 78 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 79 | template<typename T> void Post(const Statement<T> &) { Put('\n'); } |
| 80 | |
| 81 | // The special-case formatting functions for these productions are |
| 82 | // ordered to correspond roughly to their order of appearance in |
| 83 | // the Fortran 2018 standard (and parse-tree.h). |
| 84 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 85 | void Unparse(const Program &x) { // R501 |
| 86 | Walk("", x.v, "\n"); // put blank lines between ProgramUnits |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 87 | } |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 88 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 89 | void Unparse(const Name &x) { // R603 |
peter klausler | 938d1eb | 2018-03-23 21:18:59 | [diff] [blame] | 90 | Put(x.ToString()); |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 91 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 92 | void Unparse(const DefinedOperator::IntrinsicOperator &x) { // R608 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 93 | switch (x) { |
| 94 | case DefinedOperator::IntrinsicOperator::Power: Put("**"); break; |
| 95 | case DefinedOperator::IntrinsicOperator::Multiply: Put('*'); break; |
| 96 | case DefinedOperator::IntrinsicOperator::Divide: Put('/'); break; |
| 97 | case DefinedOperator::IntrinsicOperator::Add: Put('+'); break; |
| 98 | case DefinedOperator::IntrinsicOperator::Subtract: Put('-'); break; |
| 99 | case DefinedOperator::IntrinsicOperator::Concat: Put("//"); break; |
| 100 | case DefinedOperator::IntrinsicOperator::LT: Put('<'); break; |
| 101 | case DefinedOperator::IntrinsicOperator::LE: Put("<="); break; |
| 102 | case DefinedOperator::IntrinsicOperator::EQ: Put("=="); break; |
| 103 | case DefinedOperator::IntrinsicOperator::NE: Put("/="); break; |
| 104 | case DefinedOperator::IntrinsicOperator::GE: Put(">="); break; |
| 105 | case DefinedOperator::IntrinsicOperator::GT: Put('>'); break; |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 106 | default: Put('.'), Word(DefinedOperator::EnumToString(x)), Put('.'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 107 | } |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 108 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 109 | void Post(const Star &) { Put('*'); } // R701 &c. |
| 110 | void Post(const TypeParamValue::Deferred &) { Put(':'); } // R701 |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 111 | void Unparse(const DeclarationTypeSpec::Type &x) { // R703 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 112 | Word("TYPE("), Walk(x.derived), Put(')'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 113 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 114 | void Unparse(const DeclarationTypeSpec::Class &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 115 | Word("CLASS("), Walk(x.derived), Put(')'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 116 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 117 | void Post(const DeclarationTypeSpec::ClassStar &) { Word("CLASS(*)"); } |
| 118 | void Post(const DeclarationTypeSpec::TypeStar &) { Word("TYPE(*)"); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 119 | void Unparse(const DeclarationTypeSpec::Record &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 120 | Word("RECORD/"), Walk(x.v), Put('/'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 121 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 122 | void Before(const IntrinsicTypeSpec::Real &x) { // R704 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 123 | Word("REAL"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 124 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 125 | void Before(const IntrinsicTypeSpec::Complex &x) { Word("COMPLEX"); } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 126 | void Post(const IntrinsicTypeSpec::DoublePrecision &) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 127 | Word("DOUBLE PRECISION"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 128 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 129 | void Before(const IntrinsicTypeSpec::Character &x) { Word("CHARACTER"); } |
| 130 | void Before(const IntrinsicTypeSpec::Logical &x) { Word("LOGICAL"); } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 131 | void Post(const IntrinsicTypeSpec::DoubleComplex &) { |
| 132 | Word("DOUBLE COMPLEX"); |
| 133 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 134 | void Before(const IntrinsicTypeSpec::NCharacter &x) { Word("NCHARACTER"); } |
| 135 | void Before(const IntegerTypeSpec &x) { // R705 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 136 | Word("INTEGER"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 137 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 138 | void Unparse(const KindSelector &x) { // R706 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 139 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 140 | common::visitors{ |
| 141 | [&](const ScalarIntConstantExpr &y) { |
| 142 | Put('('), Word("KIND="), Walk(y), Put(')'); |
| 143 | }, |
| 144 | [&](const KindSelector::StarSize &y) { Put('*'), Walk(y.v); }, |
| 145 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 146 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 147 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 148 | void Unparse(const SignedIntLiteralConstant &x) { // R707 |
peter klausler | 822810f | 2019-03-22 21:27:18 | [diff] [blame^] | 149 | Put(std::get<CharBlock>(x.t).ToString()); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 150 | Walk("_", std::get<std::optional<KindParam>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 151 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 152 | void Unparse(const IntLiteralConstant &x) { // R708 |
peter klausler | 822810f | 2019-03-22 21:27:18 | [diff] [blame^] | 153 | Put(std::get<CharBlock>(x.t).ToString()); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 154 | Walk("_", std::get<std::optional<KindParam>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 155 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 156 | void Unparse(const Sign &x) { // R712 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 157 | Put(x == Sign::Negative ? '-' : '+'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 158 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 159 | void Unparse(const RealLiteralConstant &x) { // R714, R715 |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 160 | Put(x.real.source.ToString()), Walk("_", x.kind); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 161 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 162 | void Unparse(const ComplexLiteralConstant &x) { // R718 - R720 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 163 | Put('('), Walk(x.t, ","), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 164 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 165 | void Unparse(const CharSelector::LengthAndKind &x) { // R721 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 166 | Put('('), Word("KIND="), Walk(x.kind); |
| 167 | Walk(", LEN=", x.length), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 168 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 169 | void Unparse(const LengthSelector &x) { // R722 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 170 | std::visit( |
| 171 | common::visitors{ |
| 172 | [&](const TypeParamValue &y) { |
| 173 | Put('('), Word("LEN="), Walk(y), Put(')'); |
| 174 | }, |
| 175 | [&](const CharLength &y) { Put('*'), Walk(y); }, |
| 176 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 177 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 178 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 179 | void Unparse(const CharLength &x) { // R723 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 180 | std::visit( |
| 181 | common::visitors{ |
| 182 | [&](const TypeParamValue &y) { Put('('), Walk(y), Put(')'); }, |
| 183 | [&](const std::int64_t &y) { Walk(y); }, |
| 184 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 185 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 186 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 187 | void Unparse(const CharLiteralConstant &x) { // R724 |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 188 | if (const auto &k{std::get<std::optional<KindParam>>(x.t)}) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 189 | if (std::holds_alternative<KindParam::Kanji>(k->u)) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 190 | Word("NC"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 191 | } else { |
| 192 | Walk(*k), Put('_'); |
| 193 | } |
| 194 | } |
peter klausler | 888786b | 2018-07-19 22:35:55 | [diff] [blame] | 195 | Put(QuoteCharacterLiteral( |
| 196 | std::get<std::string>(x.t), true, backslashEscapes_)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 197 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 198 | void Before(const HollerithLiteralConstant &x) { |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 199 | std::optional<std::size_t> chars{CountCharacters(x.v.data(), x.v.size(), |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 200 | encoding_ == Encoding::EUC_JP ? EUC_JPCharacterBytes |
| 201 | : UTF8CharacterBytes)}; |
| 202 | if (chars.has_value()) { |
peter klausler | 81b92ae | 2018-07-31 19:32:09 | [diff] [blame] | 203 | Unparse(*chars); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 204 | } else { |
peter klausler | 81b92ae | 2018-07-31 19:32:09 | [diff] [blame] | 205 | Unparse(x.v.size()); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 206 | } |
| 207 | Put('H'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 208 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 209 | void Unparse(const LogicalLiteralConstant &x) { // R725 |
peter klausler | 42b72c4 | 2018-03-15 17:59:46 | [diff] [blame] | 210 | Put(std::get<bool>(x.t) ? ".TRUE." : ".FALSE."); |
| 211 | Walk("_", std::get<std::optional<KindParam>>(x.t)); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 212 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 213 | void Unparse(const DerivedTypeStmt &x) { // R727 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 214 | Word("TYPE"), Walk(", ", std::get<std::list<TypeAttrSpec>>(x.t), ", "); |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 215 | Put(" :: "), Walk(std::get<Name>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 216 | Walk("(", std::get<std::list<Name>>(x.t), ", ", ")"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 217 | Indent(); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 218 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 219 | void Unparse(const Abstract &x) { // R728, &c. |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 220 | Word("ABSTRACT"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 221 | } |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 222 | void Post(const TypeAttrSpec::BindC &) { Word("BIND(C)"); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 223 | void Unparse(const TypeAttrSpec::Extends &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 224 | Word("EXTENDS("), Walk(x.v), Put(')'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 225 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 226 | void Unparse(const EndTypeStmt &x) { // R730 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 227 | Outdent(), Word("END TYPE"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 228 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 229 | void Unparse(const SequenceStmt &x) { // R731 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 230 | Word("SEQUENCE"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 231 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 232 | void Unparse(const TypeParamDefStmt &x) { // R732 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 233 | Walk(std::get<IntegerTypeSpec>(x.t)); |
Tim Keith | 9037307 | 2018-09-05 23:02:41 | [diff] [blame] | 234 | Put(", "), Walk(std::get<common::TypeParamAttr>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 235 | Put(" :: "), Walk(std::get<std::list<TypeParamDecl>>(x.t), ", "); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 236 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 237 | void Unparse(const TypeParamDecl &x) { // R733 |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 238 | Walk(std::get<Name>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 239 | Walk("=", std::get<std::optional<ScalarIntConstantExpr>>(x.t)); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 240 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 241 | void Unparse(const DataComponentDefStmt &x) { // R737 |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 242 | const auto &dts{std::get<DeclarationTypeSpec>(x.t)}; |
| 243 | const auto &attrs{std::get<std::list<ComponentAttrSpec>>(x.t)}; |
| 244 | const auto &decls{std::get<std::list<ComponentDecl>>(x.t)}; |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 245 | Walk(dts), Walk(", ", attrs, ", "); |
| 246 | if (!attrs.empty() || |
| 247 | (!std::holds_alternative<DeclarationTypeSpec::Record>(dts.u) && |
| 248 | std::none_of( |
| 249 | decls.begin(), decls.end(), [](const ComponentDecl &d) { |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 250 | const auto &init{ |
| 251 | std::get<std::optional<Initialization>>(d.t)}; |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 252 | return init.has_value() && |
| 253 | std::holds_alternative< |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 254 | std::list<common::Indirection<DataStmtValue>>>( |
| 255 | init->u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 256 | }))) { |
| 257 | Put(" ::"); |
| 258 | } |
| 259 | Put(' '), Walk(decls, ", "); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 260 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 261 | void Unparse(const Allocatable &x) { // R738 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 262 | Word("ALLOCATABLE"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 263 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 264 | void Unparse(const Pointer &x) { Word("POINTER"); } |
| 265 | void Unparse(const Contiguous &x) { Word("CONTIGUOUS"); } |
| 266 | void Before(const ComponentAttrSpec &x) { |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 267 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 268 | common::visitors{ |
| 269 | [&](const CoarraySpec &) { Word("CODIMENSION["); }, |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 270 | [&](const ComponentArraySpec &) { Word("DIMENSION("); }, |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 271 | [](const auto &) {}, |
| 272 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 273 | x.u); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 274 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 275 | void Post(const ComponentAttrSpec &x) { |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 276 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 277 | common::visitors{ |
| 278 | [&](const CoarraySpec &) { Put(']'); }, |
| 279 | [&](const ComponentArraySpec &) { Put(')'); }, |
| 280 | [](const auto &) {}, |
| 281 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 282 | x.u); |
| 283 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 284 | void Unparse(const ComponentDecl &x) { // R739 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 285 | Walk(std::get<ObjectName>(x.t)); |
| 286 | Walk("(", std::get<std::optional<ComponentArraySpec>>(x.t), ")"); |
| 287 | Walk("[", std::get<std::optional<CoarraySpec>>(x.t), "]"); |
| 288 | Walk("*", std::get<std::optional<CharLength>>(x.t)); |
| 289 | Walk(std::get<std::optional<Initialization>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 290 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 291 | void Unparse(const ComponentArraySpec &x) { // R740 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 292 | std::visit( |
| 293 | common::visitors{ |
| 294 | [&](const std::list<ExplicitShapeSpec> &y) { Walk(y, ","); }, |
| 295 | [&](const DeferredShapeSpecList &y) { Walk(y); }, |
| 296 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 297 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 298 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 299 | void Unparse(const ProcComponentDefStmt &x) { // R741 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 300 | Word("PROCEDURE("); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 301 | Walk(std::get<std::optional<ProcInterface>>(x.t)), Put(')'); |
| 302 | Walk(", ", std::get<std::list<ProcComponentAttrSpec>>(x.t), ", "); |
| 303 | Put(" :: "), Walk(std::get<std::list<ProcDecl>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 304 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 305 | void Unparse(const NoPass &x) { // R742 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 306 | Word("NOPASS"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 307 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 308 | void Unparse(const Pass &x) { Word("PASS"), Walk("(", x.v, ")"); } |
| 309 | void Unparse(const Initialization &x) { // R743 & R805 |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 310 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 311 | common::visitors{ |
| 312 | [&](const ConstantExpr &y) { Put(" = "), Walk(y); }, |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 313 | [&](const NullInit &y) { Put(" => "), Walk(y); }, |
| 314 | [&](const InitialDataTarget &y) { Put(" => "), Walk(y); }, |
| 315 | [&](const std::list<common::Indirection<DataStmtValue>> &y) { |
| 316 | Walk("/", y, ", ", "/"); |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 317 | }, |
| 318 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 319 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 320 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 321 | void Unparse(const PrivateStmt &x) { // R745 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 322 | Word("PRIVATE"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 323 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 324 | void Unparse(const TypeBoundProcedureStmt::WithoutInterface &x) { // R749 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 325 | Word("PROCEDURE"), Walk(", ", x.attributes, ", "); |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 326 | Put(" :: "), Walk(x.declarations, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 327 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 328 | void Unparse(const TypeBoundProcedureStmt::WithInterface &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 329 | Word("PROCEDURE("), Walk(x.interfaceName), Put("), "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 330 | Walk(x.attributes); |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 331 | Put(" :: "), Walk(x.bindingNames, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 332 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 333 | void Unparse(const TypeBoundProcDecl &x) { // R750 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 334 | Walk(std::get<Name>(x.t)); |
| 335 | Walk(" => ", std::get<std::optional<Name>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 336 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 337 | void Unparse(const TypeBoundGenericStmt &x) { // R751 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 338 | Word("GENERIC"), Walk(", ", std::get<std::optional<AccessSpec>>(x.t)); |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 339 | Put(" :: "), Walk(std::get<common::Indirection<GenericSpec>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 340 | Put(" => "), Walk(std::get<std::list<Name>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 341 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 342 | void Post(const BindAttr::Deferred &) { Word("DEFERRED"); } // R752 |
| 343 | void Post(const BindAttr::Non_Overridable &) { Word("NON_OVERRIDABLE"); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 344 | void Unparse(const FinalProcedureStmt &x) { // R753 |
peter klausler | 62d9cdd | 2018-03-15 00:02:21 | [diff] [blame] | 345 | Word("FINAL :: "), Walk(x.v, ", "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 346 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 347 | void Unparse(const DerivedTypeSpec &x) { // R754 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 348 | Walk(std::get<Name>(x.t)); |
| 349 | Walk("(", std::get<std::list<TypeParamSpec>>(x.t), ",", ")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 350 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 351 | void Unparse(const TypeParamSpec &x) { // R755 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 352 | Walk(std::get<std::optional<Keyword>>(x.t), "="); |
| 353 | Walk(std::get<TypeParamValue>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 354 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 355 | void Unparse(const StructureConstructor &x) { // R756 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 356 | Walk(std::get<DerivedTypeSpec>(x.t)); |
| 357 | Put('('), Walk(std::get<std::list<ComponentSpec>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 358 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 359 | void Unparse(const ComponentSpec &x) { // R757 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 360 | Walk(std::get<std::optional<Keyword>>(x.t), "="); |
| 361 | Walk(std::get<ComponentDataSource>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 362 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 363 | void Unparse(const EnumDefStmt &) { // R760 |
peter klausler | 62d9cdd | 2018-03-15 00:02:21 | [diff] [blame] | 364 | Word("ENUM, BIND(C)"), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 365 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 366 | void Unparse(const EnumeratorDefStmt &x) { // R761 |
peter klausler | 62d9cdd | 2018-03-15 00:02:21 | [diff] [blame] | 367 | Word("ENUMERATOR :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 368 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 369 | void Unparse(const Enumerator &x) { // R762 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 370 | Walk(std::get<NamedConstant>(x.t)); |
| 371 | Walk(" = ", std::get<std::optional<ScalarIntConstantExpr>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 372 | } |
| 373 | void Post(const EndEnumStmt &) { // R763 |
peter klausler | 62d9cdd | 2018-03-15 00:02:21 | [diff] [blame] | 374 | Outdent(), Word("END ENUM"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 375 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 376 | void Unparse(const BOZLiteralConstant &x) { // R764 - R767 |
peter klausler | 9e90c99 | 2018-08-08 23:30:58 | [diff] [blame] | 377 | Put(x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 378 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 379 | void Unparse(const AcValue::Triplet &x) { // R773 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 380 | Walk(std::get<0>(x.t)), Put(':'), Walk(std::get<1>(x.t)); |
| 381 | Walk(":", std::get<std::optional<ScalarIntExpr>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 382 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 383 | void Unparse(const ArrayConstructor &x) { // R769 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 384 | Put('['), Walk(x.v), Put(']'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 385 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 386 | void Unparse(const AcSpec &x) { // R770 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 387 | Walk(x.type, "::"), Walk(x.values, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 388 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 389 | template<typename A> void Unparse(const LoopBounds<A> &x) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 390 | Walk(x.name), Put('='), Walk(x.lower), Put(','), Walk(x.upper); |
| 391 | Walk(",", x.step); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 392 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 393 | void Unparse(const AcImpliedDo &x) { // R774 |
peter klausler | 46c3538 | 2018-03-14 00:11:26 | [diff] [blame] | 394 | Put('('), Walk(std::get<std::list<AcValue>>(x.t), ", "); |
| 395 | Put(", "), Walk(std::get<AcImpliedDoControl>(x.t)), Put(')'); |
peter klausler | 46c3538 | 2018-03-14 00:11:26 | [diff] [blame] | 396 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 397 | void Unparse(const AcImpliedDoControl &x) { // R775 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 398 | Walk(std::get<std::optional<IntegerTypeSpec>>(x.t), "::"); |
| 399 | Walk(std::get<LoopBounds<ScalarIntExpr>>(x.t)); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 400 | } |
| 401 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 402 | void Unparse(const TypeDeclarationStmt &x) { // R801 |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 403 | const auto &dts{std::get<DeclarationTypeSpec>(x.t)}; |
| 404 | const auto &attrs{std::get<std::list<AttrSpec>>(x.t)}; |
| 405 | const auto &decls{std::get<std::list<EntityDecl>>(x.t)}; |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 406 | Walk(dts), Walk(", ", attrs, ", "); |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 407 | |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 408 | static const auto isInitializerOldStyle{[](const Initialization &i) { |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 409 | return std::holds_alternative< |
| 410 | std::list<common::Indirection<DataStmtValue>>>(i.u); |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 411 | }}; |
| 412 | static const auto hasAssignmentInitializer{[](const EntityDecl &d) { |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 413 | // Does a declaration have a new-style =x initializer? |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 414 | const auto &init{std::get<std::optional<Initialization>>(d.t)}; |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 415 | return init.has_value() && !isInitializerOldStyle(*init); |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 416 | }}; |
| 417 | static const auto hasSlashDelimitedInitializer{[](const EntityDecl &d) { |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 418 | // Does a declaration have an old-style /x/ initializer? |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 419 | const auto &init{std::get<std::optional<Initialization>>(d.t)}; |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 420 | return init.has_value() && isInitializerOldStyle(*init); |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 421 | }}; |
| 422 | const auto useDoubledColons{[&]() { |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 423 | bool isRecord{std::holds_alternative<DeclarationTypeSpec::Record>(dts.u)}; |
| 424 | if (!attrs.empty()) { |
| 425 | // Attributes after the type require :: before the entities. |
| 426 | CHECK(!isRecord); |
| 427 | return true; |
| 428 | } |
| 429 | if (std::any_of(decls.begin(), decls.end(), hasAssignmentInitializer)) { |
| 430 | // Always use :: with new style standard initializers (=x), |
| 431 | // since the standard requires them to appear (even in free form, |
| 432 | // where mandatory spaces already disambiguate INTEGER J=666). |
| 433 | CHECK(!isRecord); |
| 434 | return true; |
| 435 | } |
| 436 | if (isRecord) { |
| 437 | // Never put :: in a legacy extension RECORD// statement. |
| 438 | return false; |
| 439 | } |
| 440 | // The :: is optional for this declaration. Avoid usage that can |
| 441 | // crash the pgf90 compiler. |
| 442 | if (std::any_of( |
| 443 | decls.begin(), decls.end(), hasSlashDelimitedInitializer)) { |
| 444 | // Don't use :: when a declaration uses legacy DATA-statement-like |
| 445 | // /x/ initialization. |
| 446 | return false; |
| 447 | } |
| 448 | // Don't use :: with intrinsic types. Otherwise, use it. |
| 449 | return !std::holds_alternative<IntrinsicTypeSpec>(dts.u); |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 450 | }}; |
peter klausler | 92bcb7ce | 2018-03-19 23:17:23 | [diff] [blame] | 451 | |
| 452 | if (useDoubledColons()) { |
| 453 | Put(" ::"); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 454 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 455 | Put(' '), Walk(std::get<std::list<EntityDecl>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 456 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 457 | void Before(const AttrSpec &x) { // R802 |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 458 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 459 | common::visitors{ |
| 460 | [&](const CoarraySpec &y) { Word("CODIMENSION["); }, |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 461 | [&](const ArraySpec &y) { Word("DIMENSION("); }, |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 462 | [](const auto &) {}, |
| 463 | }, |
peter klausler | d39a33f | 2018-03-13 23:59:30 | [diff] [blame] | 464 | x.u); |
peter klausler | d39a33f | 2018-03-13 23:59:30 | [diff] [blame] | 465 | } |
| 466 | void Post(const AttrSpec &x) { |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 467 | std::visit( |
| 468 | common::visitors{ |
| 469 | [&](const CoarraySpec &y) { Put(']'); }, |
| 470 | [&](const ArraySpec &y) { Put(')'); }, |
| 471 | [](const auto &) {}, |
| 472 | }, |
peter klausler | d39a33f | 2018-03-13 23:59:30 | [diff] [blame] | 473 | x.u); |
| 474 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 475 | void Unparse(const EntityDecl &x) { // R803 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 476 | Walk(std::get<ObjectName>(x.t)); |
| 477 | Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")"); |
| 478 | Walk("[", std::get<std::optional<CoarraySpec>>(x.t), "]"); |
| 479 | Walk("*", std::get<std::optional<CharLength>>(x.t)); |
| 480 | Walk(std::get<std::optional<Initialization>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 481 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 482 | void Unparse(const NullInit &x) { // R806 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 483 | Word("NULL()"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 484 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 485 | void Unparse(const LanguageBindingSpec &x) { // R808 & R1528 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 486 | Word("BIND(C"), Walk(", NAME=", x.v), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 487 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 488 | void Unparse(const CoarraySpec &x) { // R809 |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 489 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 490 | common::visitors{ |
| 491 | [&](const DeferredCoshapeSpecList &y) { Walk(y); }, |
| 492 | [&](const ExplicitCoshapeSpec &y) { Walk(y); }, |
| 493 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 494 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 495 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 496 | void Unparse(const DeferredCoshapeSpecList &x) { // R810 |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 497 | for (auto j{x.v}; j > 0; --j) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 498 | Put(':'); |
| 499 | if (j > 1) { |
| 500 | Put(','); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 501 | } |
| 502 | } |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 503 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 504 | void Unparse(const ExplicitCoshapeSpec &x) { // R811 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 505 | Walk(std::get<std::list<ExplicitShapeSpec>>(x.t), ",", ","); |
| 506 | Walk(std::get<std::optional<SpecificationExpr>>(x.t), ":"), Put('*'); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 507 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 508 | void Unparse(const ExplicitShapeSpec &x) { // R812 - R813 & R816 - R818 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 509 | Walk(std::get<std::optional<SpecificationExpr>>(x.t), ":"); |
| 510 | Walk(std::get<SpecificationExpr>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 511 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 512 | void Unparse(const ArraySpec &x) { // R815 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 513 | std::visit( |
| 514 | common::visitors{ |
| 515 | [&](const std::list<ExplicitShapeSpec> &y) { Walk(y, ","); }, |
| 516 | [&](const std::list<AssumedShapeSpec> &y) { Walk(y, ","); }, |
| 517 | [&](const DeferredShapeSpecList &y) { Walk(y); }, |
| 518 | [&](const AssumedSizeSpec &y) { Walk(y); }, |
| 519 | [&](const ImpliedShapeSpec &y) { Walk(y); }, |
| 520 | [&](const AssumedRankSpec &y) { Walk(y); }, |
| 521 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 522 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 523 | } |
| 524 | void Post(const AssumedShapeSpec &) { Put(':'); } // R819 |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 525 | void Unparse(const DeferredShapeSpecList &x) { // R820 |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 526 | for (auto j{x.v}; j > 0; --j) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 527 | Put(':'); |
| 528 | if (j > 1) { |
| 529 | Put(','); |
| 530 | } |
| 531 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 532 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 533 | void Unparse(const AssumedImpliedSpec &x) { // R821 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 534 | Walk(x.v, ":"); |
| 535 | Put('*'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 536 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 537 | void Unparse(const AssumedSizeSpec &x) { // R822 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 538 | Walk(std::get<std::list<ExplicitShapeSpec>>(x.t), ",", ","); |
| 539 | Walk(std::get<AssumedImpliedSpec>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 540 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 541 | void Unparse(const ImpliedShapeSpec &x) { // R823 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 542 | Walk(x.v, ","); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 543 | } |
| 544 | void Post(const AssumedRankSpec &) { Put(".."); } // R825 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 545 | void Post(const Asynchronous &) { Word("ASYNCHRONOUS"); } |
| 546 | void Post(const External &) { Word("EXTERNAL"); } |
| 547 | void Post(const Intrinsic &) { Word("INTRINSIC"); } |
| 548 | void Post(const Optional &) { Word("OPTIONAL"); } |
| 549 | void Post(const Parameter &) { Word("PARAMETER"); } |
| 550 | void Post(const Protected &) { Word("PROTECTED"); } |
| 551 | void Post(const Save &) { Word("SAVE"); } |
| 552 | void Post(const Target &) { Word("TARGET"); } |
| 553 | void Post(const Value &) { Word("VALUE"); } |
| 554 | void Post(const Volatile &) { Word("VOLATILE"); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 555 | void Unparse(const IntentSpec &x) { // R826 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 556 | Word("INTENT("), Walk(x.v), Put(")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 557 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 558 | void Unparse(const AccessStmt &x) { // R827 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 559 | Walk(std::get<AccessSpec>(x.t)); |
| 560 | Walk(" :: ", std::get<std::list<AccessId>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 561 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 562 | void Unparse(const AllocatableStmt &x) { // R829 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 563 | Word("ALLOCATABLE :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 564 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 565 | void Unparse(const ObjectDecl &x) { // R830 & R860 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 566 | Walk(std::get<ObjectName>(x.t)); |
| 567 | Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")"); |
| 568 | Walk("[", std::get<std::optional<CoarraySpec>>(x.t), "]"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 569 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 570 | void Unparse(const AsynchronousStmt &x) { // R831 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 571 | Word("ASYNCHRONOUS :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 572 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 573 | void Unparse(const BindStmt &x) { // R832 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 574 | Walk(x.t, " :: "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 575 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 576 | void Unparse(const BindEntity &x) { // R833 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 577 | bool isCommon{std::get<BindEntity::Kind>(x.t) == BindEntity::Kind::Common}; |
| 578 | const char *slash{isCommon ? "/" : ""}; |
| 579 | Put(slash), Walk(std::get<Name>(x.t)), Put(slash); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 580 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 581 | void Unparse(const CodimensionStmt &x) { // R834 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 582 | Word("CODIMENSION :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 583 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 584 | void Unparse(const CodimensionDecl &x) { // R835 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 585 | Walk(std::get<Name>(x.t)); |
| 586 | Put('['), Walk(std::get<CoarraySpec>(x.t)), Put(']'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 587 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 588 | void Unparse(const ContiguousStmt &x) { // R836 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 589 | Word("CONTIGUOUS :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 590 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 591 | void Unparse(const DataStmt &x) { // R837 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 592 | Word("DATA "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 593 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 594 | void Unparse(const DataStmtSet &x) { // R838 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 595 | Walk(std::get<std::list<DataStmtObject>>(x.t), ", "); |
| 596 | Put('/'), Walk(std::get<std::list<DataStmtValue>>(x.t), ", "), Put('/'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 597 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 598 | void Unparse(const DataImpliedDo &x) { // R840, R842 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 599 | Put('('), Walk(std::get<std::list<DataIDoObject>>(x.t), ", "), Put(','); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 600 | Walk(std::get<std::optional<IntegerTypeSpec>>(x.t), "::"); |
| 601 | Walk(std::get<LoopBounds<ScalarIntConstantExpr>>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 602 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 603 | void Unparse(const DataStmtValue &x) { // R843 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 604 | Walk(std::get<std::optional<DataStmtRepeat>>(x.t), "*"); |
| 605 | Walk(std::get<DataStmtConstant>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 606 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 607 | void Unparse(const DimensionStmt &x) { // R848 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 608 | Word("DIMENSION :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 609 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 610 | void Unparse(const DimensionStmt::Declaration &x) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 611 | Walk(std::get<Name>(x.t)); |
| 612 | Put('('), Walk(std::get<ArraySpec>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 613 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 614 | void Unparse(const IntentStmt &x) { // R849 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 615 | Walk(x.t, " :: "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 616 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 617 | void Unparse(const OptionalStmt &x) { // R850 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 618 | Word("OPTIONAL :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 619 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 620 | void Unparse(const ParameterStmt &x) { // R851 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 621 | Word("PARAMETER("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 622 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 623 | void Unparse(const NamedConstantDef &x) { // R852 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 624 | Walk(x.t, "="); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 625 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 626 | void Unparse(const PointerStmt &x) { // R853 |
peter klausler | 26b5f57 | 2018-04-09 20:40:20 | [diff] [blame] | 627 | Word("POINTER :: "), Walk(x.v, ", "); |
| 628 | } |
| 629 | void Unparse(const PointerDecl &x) { // R854 |
| 630 | Walk(std::get<Name>(x.t)); |
| 631 | Walk("(", std::get<std::optional<DeferredShapeSpecList>>(x.t), ")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 632 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 633 | void Unparse(const ProtectedStmt &x) { // R855 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 634 | Word("PROTECTED :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 635 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 636 | void Unparse(const SaveStmt &x) { // R856 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 637 | Word("SAVE"), Walk(" :: ", x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 638 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 639 | void Unparse(const SavedEntity &x) { // R857, R858 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 640 | bool isCommon{ |
| 641 | std::get<SavedEntity::Kind>(x.t) == SavedEntity::Kind::Common}; |
| 642 | const char *slash{isCommon ? "/" : ""}; |
| 643 | Put(slash), Walk(std::get<Name>(x.t)), Put(slash); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 644 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 645 | void Unparse(const TargetStmt &x) { // R859 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 646 | Word("TARGET :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 647 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 648 | void Unparse(const ValueStmt &x) { // R861 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 649 | Word("VALUE :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 650 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 651 | void Unparse(const VolatileStmt &x) { // R862 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 652 | Word("VOLATILE :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 653 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 654 | void Unparse(const ImplicitStmt &x) { // R863 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 655 | Word("IMPLICIT "); |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 656 | std::visit( |
| 657 | common::visitors{ |
| 658 | [&](const std::list<ImplicitSpec> &y) { Walk(y, ", "); }, |
| 659 | [&](const std::list<ImplicitStmt::ImplicitNoneNameSpec> &y) { |
| 660 | Word("NONE"), Walk(" (", y, ", ", ")"); |
| 661 | }, |
| 662 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 663 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 664 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 665 | void Unparse(const ImplicitSpec &x) { // R864 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 666 | Walk(std::get<DeclarationTypeSpec>(x.t)); |
| 667 | Put('('), Walk(std::get<std::list<LetterSpec>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 668 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 669 | void Unparse(const LetterSpec &x) { // R865 |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 670 | Put(*std::get<const char *>(x.t)); |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 671 | auto second{std::get<std::optional<const char *>>(x.t)}; |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 672 | if (second.has_value()) { |
| 673 | Put('-'), Put(**second); |
| 674 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 675 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 676 | void Unparse(const ImportStmt &x) { // R867 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 677 | Word("IMPORT"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 678 | switch (x.kind) { |
Tim Keith | 37476ee | 2018-08-23 18:45:49 | [diff] [blame] | 679 | case common::ImportKind::Default: Walk(" :: ", x.names, ", "); break; |
| 680 | case common::ImportKind::Only: |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 681 | Put(", "), Word("ONLY: "); |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 682 | Walk(x.names, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 683 | break; |
Tim Keith | 37476ee | 2018-08-23 18:45:49 | [diff] [blame] | 684 | case common::ImportKind::None: Word(", NONE"); break; |
| 685 | case common::ImportKind::All: Word(", ALL"); break; |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 686 | default: CRASH_NO_CASE; |
| 687 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 688 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 689 | void Unparse(const NamelistStmt &x) { // R868 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 690 | Word("NAMELIST"), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 691 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 692 | void Unparse(const NamelistStmt::Group &x) { |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 693 | Put('/'), Walk(std::get<Name>(x.t)), Put('/'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 694 | Walk(std::get<std::list<Name>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 695 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 696 | void Unparse(const EquivalenceStmt &x) { // R870, R871 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 697 | Word("EQUIVALENCE"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 698 | const char *separator{" "}; |
| 699 | for (const std::list<EquivalenceObject> &y : x.v) { |
| 700 | Put(separator), Put('('), Walk(y), Put(')'); |
| 701 | separator = ", "; |
| 702 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 703 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 704 | void Unparse(const CommonStmt &x) { // R873 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 705 | Word("COMMON "); |
Tim Keith | b60fd092 | 2019-02-13 00:13:58 | [diff] [blame] | 706 | Walk(x.blocks); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 707 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 708 | void Unparse(const CommonBlockObject &x) { // R874 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 709 | Walk(std::get<Name>(x.t)); |
| 710 | Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 711 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 712 | void Unparse(const CommonStmt::Block &x) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 713 | Walk("/", std::get<std::optional<Name>>(x.t), "/"); |
| 714 | Walk(std::get<std::list<CommonBlockObject>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 715 | } |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 716 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 717 | void Unparse(const Substring &x) { // R908, R909 |
peter klausler | 2884b2e | 2018-04-13 21:21:13 | [diff] [blame] | 718 | Walk(std::get<DataRef>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 719 | Put('('), Walk(std::get<SubstringRange>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 720 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 721 | void Unparse(const CharLiteralConstantSubstring &x) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 722 | Walk(std::get<CharLiteralConstant>(x.t)); |
| 723 | Put('('), Walk(std::get<SubstringRange>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 724 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 725 | void Unparse(const SubstringRange &x) { // R910 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 726 | Walk(x.t, ":"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 727 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 728 | void Unparse(const PartRef &x) { // R912 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 729 | Walk(x.name); |
| 730 | Walk("(", x.subscripts, ",", ")"); |
| 731 | Walk(x.imageSelector); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 732 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 733 | void Unparse(const StructureComponent &x) { // R913 |
peter klausler | 4e354d8 | 2018-03-30 22:23:37 | [diff] [blame] | 734 | Walk(x.base); |
| 735 | if (structureComponents_.find(x.component.source) != |
| 736 | structureComponents_.end()) { |
| 737 | Put('.'); |
| 738 | } else { |
| 739 | Put('%'); |
| 740 | } |
| 741 | Walk(x.component); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 742 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 743 | void Unparse(const ArrayElement &x) { // R917 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 744 | Walk(x.base); |
| 745 | Put('('), Walk(x.subscripts, ","), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 746 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 747 | void Unparse(const SubscriptTriplet &x) { // R921 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 748 | Walk(std::get<0>(x.t)), Put(':'), Walk(std::get<1>(x.t)); |
| 749 | Walk(":", std::get<2>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 750 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 751 | void Unparse(const ImageSelector &x) { // R924 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 752 | Put('['), Walk(std::get<std::list<Cosubscript>>(x.t), ","); |
| 753 | Walk(",", std::get<std::list<ImageSelectorSpec>>(x.t), ","), Put(']'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 754 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 755 | void Before(const ImageSelectorSpec::Stat &) { // R926 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 756 | Word("STAT="); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 757 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 758 | void Before(const ImageSelectorSpec::Team &) { Word("TEAM="); } |
| 759 | void Before(const ImageSelectorSpec::Team_Number &) { Word("TEAM_NUMBER="); } |
| 760 | void Unparse(const AllocateStmt &x) { // R927 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 761 | Word("ALLOCATE("); |
| 762 | Walk(std::get<std::optional<TypeSpec>>(x.t), "::"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 763 | Walk(std::get<std::list<Allocation>>(x.t), ", "); |
| 764 | Walk(", ", std::get<std::list<AllocOpt>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 765 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 766 | void Before(const AllocOpt &x) { // R928, R931 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 767 | std::visit( |
| 768 | common::visitors{ |
| 769 | [&](const AllocOpt::Mold &) { Word("MOLD="); }, |
| 770 | [&](const AllocOpt::Source &) { Word("SOURCE="); }, |
| 771 | [](const StatOrErrmsg &) {}, |
| 772 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 773 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 774 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 775 | void Unparse(const Allocation &x) { // R932 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 776 | Walk(std::get<AllocateObject>(x.t)); |
| 777 | Walk("(", std::get<std::list<AllocateShapeSpec>>(x.t), ",", ")"); |
| 778 | Walk("[", std::get<std::optional<AllocateCoarraySpec>>(x.t), "]"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 779 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 780 | void Unparse(const AllocateShapeSpec &x) { // R934 & R938 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 781 | Walk(std::get<std::optional<BoundExpr>>(x.t), ":"); |
| 782 | Walk(std::get<BoundExpr>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 783 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 784 | void Unparse(const AllocateCoarraySpec &x) { // R937 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 785 | Walk(std::get<std::list<AllocateCoshapeSpec>>(x.t), ",", ","); |
| 786 | Walk(std::get<std::optional<BoundExpr>>(x.t), ":"), Put('*'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 787 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 788 | void Unparse(const NullifyStmt &x) { // R939 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 789 | Word("NULLIFY("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 790 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 791 | void Unparse(const DeallocateStmt &x) { // R941 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 792 | Word("DEALLOCATE("); |
| 793 | Walk(std::get<std::list<AllocateObject>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 794 | Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 795 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 796 | void Before(const StatOrErrmsg &x) { // R942 & R1165 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 797 | std::visit( |
| 798 | common::visitors{ |
| 799 | [&](const StatVariable &) { Word("STAT="); }, |
| 800 | [&](const MsgVariable &) { Word("ERRMSG="); }, |
| 801 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 802 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 803 | } |
| 804 | |
| 805 | // R1001 - R1022 |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 806 | void Unparse(const Expr::Parentheses &x) { Put('('), Walk(x.v), Put(')'); } |
| 807 | void Before(const Expr::UnaryPlus &x) { Put("+"); } |
| 808 | void Before(const Expr::Negate &x) { Put("-"); } |
| 809 | void Before(const Expr::NOT &x) { Word(".NOT."); } |
| 810 | void Unparse(const Expr::PercentLoc &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 811 | Word("%LOC("), Walk(x.v), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 812 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 813 | void Unparse(const Expr::Power &x) { Walk(x.t, "**"); } |
| 814 | void Unparse(const Expr::Multiply &x) { Walk(x.t, "*"); } |
| 815 | void Unparse(const Expr::Divide &x) { Walk(x.t, "/"); } |
| 816 | void Unparse(const Expr::Add &x) { Walk(x.t, "+"); } |
| 817 | void Unparse(const Expr::Subtract &x) { Walk(x.t, "-"); } |
| 818 | void Unparse(const Expr::Concat &x) { Walk(x.t, "//"); } |
| 819 | void Unparse(const Expr::LT &x) { Walk(x.t, "<"); } |
| 820 | void Unparse(const Expr::LE &x) { Walk(x.t, "<="); } |
| 821 | void Unparse(const Expr::EQ &x) { Walk(x.t, "=="); } |
| 822 | void Unparse(const Expr::NE &x) { Walk(x.t, "/="); } |
| 823 | void Unparse(const Expr::GE &x) { Walk(x.t, ">="); } |
| 824 | void Unparse(const Expr::GT &x) { Walk(x.t, ">"); } |
| 825 | void Unparse(const Expr::AND &x) { Walk(x.t, ".AND."); } |
| 826 | void Unparse(const Expr::OR &x) { Walk(x.t, ".OR."); } |
| 827 | void Unparse(const Expr::EQV &x) { Walk(x.t, ".EQV."); } |
| 828 | void Unparse(const Expr::NEQV &x) { Walk(x.t, ".NEQV."); } |
| 829 | void Unparse(const Expr::XOR &x) { Walk(x.t, ".XOR."); } |
| 830 | void Unparse(const Expr::ComplexConstructor &x) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 831 | Put('('), Walk(x.t, ","), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 832 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 833 | void Unparse(const Expr::DefinedBinary &x) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 834 | Walk(std::get<1>(x.t)); // left |
| 835 | Walk(std::get<DefinedOpName>(x.t)); |
| 836 | Walk(std::get<2>(x.t)); // right |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 837 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 838 | void Unparse(const DefinedOpName &x) { // R1003, R1023, R1414, & R1415 |
peter klausler | 0c78d8b | 2019-03-20 21:17:12 | [diff] [blame] | 839 | Walk(x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 840 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 841 | void Unparse(const AssignmentStmt &x) { // R1032 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 842 | Walk(x.t, " = "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 843 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 844 | void Unparse(const PointerAssignmentStmt &x) { // R1033, R1034, R1038 |
peter klausler | 2884b2e | 2018-04-13 21:21:13 | [diff] [blame] | 845 | Walk(std::get<DataRef>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 846 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 847 | common::visitors{ |
| 848 | [&](const std::list<BoundsRemapping> &y) { |
| 849 | Put('('), Walk(y), Put(')'); |
| 850 | }, |
| 851 | [&](const std::list<BoundsSpec> &y) { Walk("(", y, ", ", ")"); }, |
| 852 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 853 | std::get<PointerAssignmentStmt::Bounds>(x.t).u); |
| 854 | Put(" => "), Walk(std::get<Expr>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 855 | } |
| 856 | void Post(const BoundsSpec &) { // R1035 |
| 857 | Put(':'); |
| 858 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 859 | void Unparse(const BoundsRemapping &x) { // R1036 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 860 | Walk(x.t, ":"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 861 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 862 | void Unparse(const WhereStmt &x) { // R1041, R1045, R1046 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 863 | Word("WHERE ("), Walk(x.t, ") "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 864 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 865 | void Unparse(const WhereConstructStmt &x) { // R1043 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 866 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 867 | Word("WHERE ("), Walk(std::get<LogicalExpr>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 868 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 869 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 870 | void Unparse(const MaskedElsewhereStmt &x) { // R1047 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 871 | Outdent(); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 872 | Word("ELSEWHERE ("), Walk(std::get<LogicalExpr>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 873 | Walk(" ", std::get<std::optional<Name>>(x.t)); |
| 874 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 875 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 876 | void Unparse(const ElsewhereStmt &x) { // R1048 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 877 | Outdent(), Word("ELSEWHERE"), Walk(" ", x.v), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 878 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 879 | void Unparse(const EndWhereStmt &x) { // R1049 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 880 | Outdent(), Word("END WHERE"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 881 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 882 | void Unparse(const ForallConstructStmt &x) { // R1051 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 883 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 884 | Word("FORALL"), Walk(std::get<common::Indirection<ConcurrentHeader>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 885 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 886 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 887 | void Unparse(const EndForallStmt &x) { // R1054 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 888 | Outdent(), Word("END FORALL"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 889 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 890 | void Before(const ForallStmt &) { // R1055 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 891 | Word("FORALL"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 892 | } |
| 893 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 894 | void Unparse(const AssociateStmt &x) { // R1103 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 895 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 896 | Word("ASSOCIATE ("); |
| 897 | Walk(std::get<std::list<Association>>(x.t), ", "), Put(')'), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 898 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 899 | void Unparse(const Association &x) { // R1104 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 900 | Walk(x.t, " => "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 901 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 902 | void Unparse(const EndAssociateStmt &x) { // R1106 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 903 | Outdent(), Word("END ASSOCIATE"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 904 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 905 | void Unparse(const BlockStmt &x) { // R1108 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 906 | Walk(x.v, ": "), Word("BLOCK"), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 907 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 908 | void Unparse(const EndBlockStmt &x) { // R1110 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 909 | Outdent(), Word("END BLOCK"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 910 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 911 | void Unparse(const ChangeTeamStmt &x) { // R1112 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 912 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 913 | Word("CHANGE TEAM ("), Walk(std::get<TeamVariable>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 914 | Walk(", ", std::get<std::list<CoarrayAssociation>>(x.t), ", "); |
| 915 | Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')'); |
| 916 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 917 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 918 | void Unparse(const CoarrayAssociation &x) { // R1113 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 919 | Walk(x.t, " => "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 920 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 921 | void Unparse(const EndChangeTeamStmt &x) { // R1114 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 922 | Outdent(), Word("END TEAM ("); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 923 | Walk(std::get<std::list<StatOrErrmsg>>(x.t), ", "); |
| 924 | Put(')'), Walk(" ", std::get<std::optional<Name>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 925 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 926 | void Unparse(const CriticalStmt &x) { // R1117 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 927 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 928 | Word("CRITICAL ("), Walk(std::get<std::list<StatOrErrmsg>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 929 | Put(')'), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 930 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 931 | void Unparse(const EndCriticalStmt &x) { // R1118 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 932 | Outdent(), Word("END CRITICAL"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 933 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 934 | void Unparse(const DoConstruct &x) { // R1119, R1120 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 935 | Walk(std::get<Statement<NonLabelDoStmt>>(x.t)); |
| 936 | Indent(), Walk(std::get<Block>(x.t), ""), Outdent(); |
| 937 | Walk(std::get<Statement<EndDoStmt>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 938 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 939 | void Unparse(const LabelDoStmt &x) { // R1121 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 940 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 941 | Word("DO "), Walk(std::get<Label>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 942 | Walk(" ", std::get<std::optional<LoopControl>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 943 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 944 | void Unparse(const NonLabelDoStmt &x) { // R1122 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 945 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 946 | Word("DO "), Walk(std::get<std::optional<LoopControl>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 947 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 948 | void Unparse(const LoopControl &x) { // R1123 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 949 | std::visit( |
| 950 | common::visitors{ |
| 951 | [&](const ScalarLogicalExpr &y) { |
| 952 | Word("WHILE ("), Walk(y), Put(')'); |
| 953 | }, |
| 954 | [&](const auto &y) { Walk(y); }, |
| 955 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 956 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 957 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 958 | void Unparse(const ConcurrentHeader &x) { // R1125 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 959 | Put('('), Walk(std::get<std::optional<IntegerTypeSpec>>(x.t), "::"); |
| 960 | Walk(std::get<std::list<ConcurrentControl>>(x.t), ", "); |
| 961 | Walk(", ", std::get<std::optional<ScalarLogicalExpr>>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 962 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 963 | void Unparse(const ConcurrentControl &x) { // R1126 - R1128 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 964 | Walk(std::get<Name>(x.t)), Put('='), Walk(std::get<1>(x.t)); |
| 965 | Put(':'), Walk(std::get<2>(x.t)); |
| 966 | Walk(":", std::get<std::optional<ScalarIntExpr>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 967 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 968 | void Before(const LoopControl::Concurrent &x) { // R1129 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 969 | Word("CONCURRENT"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 970 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 971 | void Unparse(const LocalitySpec::Local &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 972 | Word("LOCAL("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 973 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 974 | void Unparse(const LocalitySpec::LocalInit &x) { |
peter klausler | c71aecb | 2018-10-01 22:00:09 | [diff] [blame] | 975 | Word("LOCAL_INIT("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 976 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 977 | void Unparse(const LocalitySpec::Shared &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 978 | Word("SHARED("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 979 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 980 | void Post(const LocalitySpec::DefaultNone &x) { Word("DEFAULT(NONE)"); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 981 | void Unparse(const EndDoStmt &x) { // R1132 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 982 | Word("END DO"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 983 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 984 | void Unparse(const CycleStmt &x) { // R1133 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 985 | Word("CYCLE"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 986 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 987 | void Unparse(const IfThenStmt &x) { // R1135 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 988 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 989 | Word("IF ("), Walk(std::get<ScalarLogicalExpr>(x.t)); |
| 990 | Put(") "), Word("THEN"), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 991 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 992 | void Unparse(const ElseIfStmt &x) { // R1136 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 993 | Outdent(), Word("ELSE IF ("); |
| 994 | Walk(std::get<ScalarLogicalExpr>(x.t)), Put(") "), Word("THEN"); |
| 995 | Walk(" ", std::get<std::optional<Name>>(x.t)), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 996 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 997 | void Unparse(const ElseStmt &x) { // R1137 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 998 | Outdent(), Word("ELSE"), Walk(" ", x.v), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 999 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1000 | void Unparse(const EndIfStmt &x) { // R1138 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1001 | Outdent(), Word("END IF"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1002 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1003 | void Unparse(const IfStmt &x) { // R1139 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1004 | Word("IF ("), Walk(x.t, ") "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1005 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1006 | void Unparse(const SelectCaseStmt &x) { // R1141, R1144 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1007 | Walk(std::get<std::optional<Name>>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1008 | Word("SELECT CASE ("); |
| 1009 | Walk(std::get<Scalar<Expr>>(x.t)), Put(')'), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1010 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1011 | void Unparse(const CaseStmt &x) { // R1142 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1012 | Outdent(), Word("CASE "), Walk(std::get<CaseSelector>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1013 | Walk(" ", std::get<std::optional<Name>>(x.t)), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1014 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1015 | void Unparse(const EndSelectStmt &x) { // R1143 & R1151 & R1155 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1016 | Outdent(), Word("END SELECT"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1017 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1018 | void Unparse(const CaseSelector &x) { // R1145 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1019 | std::visit( |
| 1020 | common::visitors{ |
| 1021 | [&](const std::list<CaseValueRange> &y) { |
| 1022 | Put('('), Walk(y), Put(')'); |
| 1023 | }, |
| 1024 | [&](const Default &) { Word("DEFAULT"); }, |
| 1025 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1026 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1027 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1028 | void Unparse(const CaseValueRange::Range &x) { // R1146 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1029 | Walk(x.lower), Put(':'), Walk(x.upper); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1030 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1031 | void Unparse(const SelectRankStmt &x) { // R1149 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1032 | Walk(std::get<0>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1033 | Word("SELECT RANK ("), Walk(std::get<1>(x.t), " => "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1034 | Walk(std::get<Selector>(x.t)), Put(')'), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1035 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1036 | void Unparse(const SelectRankCaseStmt &x) { // R1150 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1037 | Outdent(), Word("RANK "); |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1038 | std::visit( |
| 1039 | common::visitors{ |
| 1040 | [&](const ScalarIntConstantExpr &y) { |
| 1041 | Put('('), Walk(y), Put(')'); |
| 1042 | }, |
| 1043 | [&](const Star &) { Put("(*)"); }, |
| 1044 | [&](const Default &) { Word("DEFAULT"); }, |
| 1045 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1046 | std::get<SelectRankCaseStmt::Rank>(x.t).u); |
| 1047 | Walk(" ", std::get<std::optional<Name>>(x.t)), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1048 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1049 | void Unparse(const SelectTypeStmt &x) { // R1153 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1050 | Walk(std::get<0>(x.t), ": "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1051 | Word("SELECT TYPE ("), Walk(std::get<1>(x.t), " => "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1052 | Walk(std::get<Selector>(x.t)), Put(')'), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1053 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1054 | void Unparse(const TypeGuardStmt &x) { // R1154 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1055 | Outdent(), Walk(std::get<TypeGuardStmt::Guard>(x.t)); |
| 1056 | Walk(" ", std::get<std::optional<Name>>(x.t)), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1057 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1058 | void Unparse(const TypeGuardStmt::Guard &x) { |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1059 | std::visit( |
| 1060 | common::visitors{ |
| 1061 | [&](const TypeSpec &y) { Word("TYPE IS ("), Walk(y), Put(')'); }, |
| 1062 | [&](const DerivedTypeSpec &y) { |
| 1063 | Word("CLASS IS ("), Walk(y), Put(')'); |
| 1064 | }, |
| 1065 | [&](const Default &) { Word("CLASS DEFAULT"); }, |
| 1066 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1067 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1068 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1069 | void Unparse(const ExitStmt &x) { // R1156 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1070 | Word("EXIT"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1071 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1072 | void Before(const GotoStmt &x) { // R1157 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1073 | Word("GO TO "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1074 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1075 | void Unparse(const ComputedGotoStmt &x) { // R1158 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1076 | Word("GO TO ("), Walk(x.t, "), "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1077 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1078 | void Unparse(const ContinueStmt &x) { // R1159 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1079 | Word("CONTINUE"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1080 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1081 | void Unparse(const StopStmt &x) { // R1160, R1161 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1082 | if (std::get<StopStmt::Kind>(x.t) == StopStmt::Kind::ErrorStop) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1083 | Word("ERROR "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1084 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1085 | Word("STOP"), Walk(" ", std::get<std::optional<StopCode>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1086 | Walk(", QUIET=", std::get<std::optional<ScalarLogicalExpr>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1087 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1088 | void Unparse(const FailImageStmt &x) { // R1163 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1089 | Word("FAIL IMAGE"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1090 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1091 | void Unparse(const SyncAllStmt &x) { // R1164 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1092 | Word("SYNC ALL ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1093 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1094 | void Unparse(const SyncImagesStmt &x) { // R1166 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1095 | Word("SYNC IMAGES ("); |
| 1096 | Walk(std::get<SyncImagesStmt::ImageSet>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1097 | Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1098 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1099 | void Unparse(const SyncMemoryStmt &x) { // R1168 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1100 | Word("SYNC MEMORY ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1101 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1102 | void Unparse(const SyncTeamStmt &x) { // R1169 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1103 | Word("SYNC TEAM ("), Walk(std::get<TeamVariable>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1104 | Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1105 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1106 | void Unparse(const EventPostStmt &x) { // R1170 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1107 | Word("EVENT POST ("), Walk(std::get<EventVariable>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1108 | Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1109 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1110 | void Before(const EventWaitStmt::EventWaitSpec &x) { // R1173, R1174 |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1111 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1112 | common::visitors{ |
| 1113 | [&](const ScalarIntExpr &x) { Word("UNTIL_COUNT="); }, |
| 1114 | [](const StatOrErrmsg &) {}, |
| 1115 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1116 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1117 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1118 | void Unparse(const EventWaitStmt &x) { // R1170 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1119 | Word("EVENT WAIT ("), Walk(std::get<EventVariable>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1120 | Walk(", ", std::get<std::list<EventWaitStmt::EventWaitSpec>>(x.t), ", "); |
| 1121 | Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1122 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1123 | void Unparse(const FormTeamStmt &x) { // R1175 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1124 | Word("FORM TEAM ("), Walk(std::get<ScalarIntExpr>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1125 | Put(','), Walk(std::get<TeamVariable>(x.t)); |
| 1126 | Walk(", ", std::get<std::list<FormTeamStmt::FormTeamSpec>>(x.t), ", "); |
| 1127 | Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1128 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1129 | void Before(const FormTeamStmt::FormTeamSpec &x) { // R1176, R1177 |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1130 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1131 | common::visitors{ |
| 1132 | [&](const ScalarIntExpr &x) { Word("NEW_INDEX="); }, |
| 1133 | [](const StatOrErrmsg &) {}, |
| 1134 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1135 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1136 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1137 | void Unparse(const LockStmt &x) { // R1178 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1138 | Word("LOCK ("), Walk(std::get<LockVariable>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1139 | Walk(", ", std::get<std::list<LockStmt::LockStat>>(x.t), ", "); |
| 1140 | Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1141 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1142 | void Before(const LockStmt::LockStat &x) { // R1179 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1143 | std::visit( |
| 1144 | common::visitors{ |
| 1145 | [&](const ScalarLogicalVariable &) { Word("ACQUIRED_LOCK="); }, |
| 1146 | [](const StatOrErrmsg &y) {}, |
| 1147 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1148 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1149 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1150 | void Unparse(const UnlockStmt &x) { // R1180 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1151 | Word("UNLOCK ("), Walk(std::get<LockVariable>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1152 | Walk(", ", std::get<std::list<StatOrErrmsg>>(x.t), ", "); |
| 1153 | Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1154 | } |
| 1155 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1156 | void Unparse(const OpenStmt &x) { // R1204 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1157 | Word("OPEN ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1158 | } |
| 1159 | bool Pre(const ConnectSpec &x) { // R1205 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1160 | return std::visit( |
| 1161 | common::visitors{ |
| 1162 | [&](const FileUnitNumber &) { |
| 1163 | Word("UNIT="); |
| 1164 | return true; |
| 1165 | }, |
| 1166 | [&](const FileNameExpr &) { |
| 1167 | Word("FILE="); |
| 1168 | return true; |
| 1169 | }, |
| 1170 | [&](const ConnectSpec::CharExpr &y) { |
| 1171 | Walk(y.t, "="); |
| 1172 | return false; |
| 1173 | }, |
| 1174 | [&](const MsgVariable &) { |
| 1175 | Word("IOMSG="); |
| 1176 | return true; |
| 1177 | }, |
| 1178 | [&](const StatVariable &) { |
| 1179 | Word("IOSTAT="); |
| 1180 | return true; |
| 1181 | }, |
| 1182 | [&](const ConnectSpec::Recl &) { |
| 1183 | Word("RECL="); |
| 1184 | return true; |
| 1185 | }, |
| 1186 | [&](const ConnectSpec::Newunit &) { |
| 1187 | Word("NEWUNIT="); |
| 1188 | return true; |
| 1189 | }, |
| 1190 | [&](const ErrLabel &) { |
| 1191 | Word("ERR="); |
| 1192 | return true; |
| 1193 | }, |
| 1194 | [&](const StatusExpr &) { |
| 1195 | Word("STATUS="); |
| 1196 | return true; |
| 1197 | }, |
| 1198 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1199 | x.u); |
| 1200 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1201 | void Unparse(const CloseStmt &x) { // R1208 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1202 | Word("CLOSE ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1203 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1204 | void Before(const CloseStmt::CloseSpec &x) { // R1209 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1205 | std::visit( |
| 1206 | common::visitors{ |
| 1207 | [&](const FileUnitNumber &) { Word("UNIT="); }, |
| 1208 | [&](const StatVariable &) { Word("IOSTAT="); }, |
| 1209 | [&](const MsgVariable &) { Word("IOMSG="); }, |
| 1210 | [&](const ErrLabel &) { Word("ERR="); }, |
| 1211 | [&](const StatusExpr &) { Word("STATUS="); }, |
| 1212 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1213 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1214 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1215 | void Unparse(const ReadStmt &x) { // R1210 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1216 | Word("READ "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1217 | if (x.iounit) { |
| 1218 | Put('('), Walk(x.iounit); |
| 1219 | if (x.format) { |
| 1220 | Put(", "), Walk(x.format); |
| 1221 | } |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 1222 | Walk(", ", x.controls, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1223 | Put(')'); |
| 1224 | } else if (x.format) { |
| 1225 | Walk(x.format); |
| 1226 | if (!x.items.empty()) { |
| 1227 | Put(", "); |
| 1228 | } |
| 1229 | } else { |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 1230 | Put('('), Walk(x.controls, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1231 | } |
| 1232 | Walk(" ", x.items, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1233 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1234 | void Unparse(const WriteStmt &x) { // R1211 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1235 | Word("WRITE ("); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1236 | if (x.iounit) { |
| 1237 | Walk(x.iounit); |
| 1238 | if (x.format) { |
| 1239 | Put(", "), Walk(x.format); |
| 1240 | } |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 1241 | Walk(", ", x.controls, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1242 | } else { |
peter klausler | dcd0942 | 2018-03-15 23:03:28 | [diff] [blame] | 1243 | Walk(x.controls, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1244 | } |
| 1245 | Put(')'), Walk(" ", x.items, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1246 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1247 | void Unparse(const PrintStmt &x) { // R1212 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1248 | Word("PRINT "), Walk(std::get<Format>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1249 | Walk(", ", std::get<std::list<OutputItem>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1250 | } |
| 1251 | bool Pre(const IoControlSpec &x) { // R1213 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1252 | return std::visit( |
| 1253 | common::visitors{ |
| 1254 | [&](const IoUnit &) { |
| 1255 | Word("UNIT="); |
| 1256 | return true; |
| 1257 | }, |
| 1258 | [&](const Format &) { |
| 1259 | Word("FMT="); |
| 1260 | return true; |
| 1261 | }, |
| 1262 | [&](const Name &) { |
| 1263 | Word("NML="); |
| 1264 | return true; |
| 1265 | }, |
| 1266 | [&](const IoControlSpec::CharExpr &y) { |
| 1267 | Walk(y.t, "="); |
| 1268 | return false; |
| 1269 | }, |
| 1270 | [&](const IoControlSpec::Asynchronous &) { |
| 1271 | Word("ASYNCHRONOUS="); |
| 1272 | return true; |
| 1273 | }, |
| 1274 | [&](const EndLabel &) { |
| 1275 | Word("END="); |
| 1276 | return true; |
| 1277 | }, |
| 1278 | [&](const EorLabel &) { |
| 1279 | Word("EOR="); |
| 1280 | return true; |
| 1281 | }, |
| 1282 | [&](const ErrLabel &) { |
| 1283 | Word("ERR="); |
| 1284 | return true; |
| 1285 | }, |
| 1286 | [&](const IdVariable &) { |
| 1287 | Word("ID="); |
| 1288 | return true; |
| 1289 | }, |
| 1290 | [&](const MsgVariable &) { |
| 1291 | Word("IOMSG="); |
| 1292 | return true; |
| 1293 | }, |
| 1294 | [&](const StatVariable &) { |
| 1295 | Word("IOSTAT="); |
| 1296 | return true; |
| 1297 | }, |
| 1298 | [&](const IoControlSpec::Pos &) { |
| 1299 | Word("POS="); |
| 1300 | return true; |
| 1301 | }, |
| 1302 | [&](const IoControlSpec::Rec &) { |
| 1303 | Word("REC="); |
| 1304 | return true; |
| 1305 | }, |
| 1306 | [&](const IoControlSpec::Size &) { |
| 1307 | Word("SIZE="); |
| 1308 | return true; |
| 1309 | }, |
| 1310 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1311 | x.u); |
| 1312 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1313 | void Unparse(const InputImpliedDo &x) { // R1218 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1314 | Put('('), Walk(std::get<std::list<InputItem>>(x.t), ", "), Put(", "); |
| 1315 | Walk(std::get<IoImpliedDoControl>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1316 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1317 | void Unparse(const OutputImpliedDo &x) { // R1219 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1318 | Put('('), Walk(std::get<std::list<OutputItem>>(x.t), ", "), Put(", "); |
| 1319 | Walk(std::get<IoImpliedDoControl>(x.t)), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1320 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1321 | void Unparse(const WaitStmt &x) { // R1222 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1322 | Word("WAIT ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1323 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1324 | void Before(const WaitSpec &x) { // R1223 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1325 | std::visit( |
| 1326 | common::visitors{ |
| 1327 | [&](const FileUnitNumber &) { Word("UNIT="); }, |
| 1328 | [&](const EndLabel &) { Word("END="); }, |
| 1329 | [&](const EorLabel &) { Word("EOR="); }, |
| 1330 | [&](const ErrLabel &) { Word("ERR="); }, |
| 1331 | [&](const IdExpr &) { Word("ID="); }, |
| 1332 | [&](const MsgVariable &) { Word("IOMSG="); }, |
| 1333 | [&](const StatVariable &) { Word("IOSTAT="); }, |
| 1334 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1335 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1336 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1337 | void Unparse(const BackspaceStmt &x) { // R1224 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1338 | Word("BACKSPACE ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1339 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1340 | void Unparse(const EndfileStmt &x) { // R1225 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1341 | Word("ENDFILE ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1342 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1343 | void Unparse(const RewindStmt &x) { // R1226 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1344 | Word("REWIND ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1345 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1346 | void Before(const PositionOrFlushSpec &x) { // R1227 & R1229 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1347 | std::visit( |
| 1348 | common::visitors{ |
| 1349 | [&](const FileUnitNumber &) { Word("UNIT="); }, |
| 1350 | [&](const MsgVariable &) { Word("IOMSG="); }, |
| 1351 | [&](const StatVariable &) { Word("IOSTAT="); }, |
| 1352 | [&](const ErrLabel &) { Word("ERR="); }, |
| 1353 | }, |
peter klausler | ad4adc2 | 2018-03-16 00:09:27 | [diff] [blame] | 1354 | x.u); |
peter klausler | ad4adc2 | 2018-03-16 00:09:27 | [diff] [blame] | 1355 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1356 | void Unparse(const FlushStmt &x) { // R1228 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1357 | Word("FLUSH ("), Walk(x.v, ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1358 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1359 | void Unparse(const InquireStmt &x) { // R1230 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1360 | Word("INQUIRE ("); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1361 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1362 | common::visitors{ |
| 1363 | [&](const InquireStmt::Iolength &y) { |
| 1364 | Word("IOLENGTH="), Walk(y.t, ") "); |
| 1365 | }, |
| 1366 | [&](const std::list<InquireSpec> &y) { Walk(y, ", "), Put(')'); }, |
| 1367 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1368 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1369 | } |
| 1370 | bool Pre(const InquireSpec &x) { // R1231 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1371 | return std::visit( |
| 1372 | common::visitors{ |
| 1373 | [&](const FileUnitNumber &) { |
| 1374 | Word("UNIT="); |
| 1375 | return true; |
| 1376 | }, |
| 1377 | [&](const FileNameExpr &) { |
| 1378 | Word("FILE="); |
| 1379 | return true; |
| 1380 | }, |
| 1381 | [&](const InquireSpec::CharVar &y) { |
| 1382 | Walk(y.t, "="); |
| 1383 | return false; |
| 1384 | }, |
| 1385 | [&](const InquireSpec::IntVar &y) { |
| 1386 | Walk(y.t, "="); |
| 1387 | return false; |
| 1388 | }, |
| 1389 | [&](const InquireSpec::LogVar &y) { |
| 1390 | Walk(y.t, "="); |
| 1391 | return false; |
| 1392 | }, |
| 1393 | [&](const IdExpr &) { |
| 1394 | Word("ID="); |
| 1395 | return true; |
| 1396 | }, |
| 1397 | [&](const ErrLabel &) { |
| 1398 | Word("ERR="); |
| 1399 | return true; |
| 1400 | }, |
| 1401 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1402 | x.u); |
| 1403 | } |
| 1404 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1405 | void Before(const FormatStmt &) { // R1301 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1406 | Word("FORMAT"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1407 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1408 | void Unparse(const format::FormatSpecification &x) { // R1302, R1303, R1305 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1409 | Put('('), Walk("", x.items, ",", x.unlimitedItems.empty() ? "" : ","); |
| 1410 | Walk("*(", x.unlimitedItems, ",", ")"), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1411 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1412 | void Unparse(const format::FormatItem &x) { // R1304, R1306, R1321 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1413 | if (x.repeatCount.has_value()) { |
| 1414 | Walk(*x.repeatCount); |
| 1415 | } |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1416 | std::visit( |
| 1417 | common::visitors{ |
| 1418 | [&](const std::string &y) { |
| 1419 | Put(QuoteCharacterLiteral(y, true, backslashEscapes_)); |
| 1420 | }, |
| 1421 | [&](const std::list<format::FormatItem> &y) { |
| 1422 | Walk("(", y, ",", ")"); |
| 1423 | }, |
| 1424 | [&](const auto &y) { Walk(y); }, |
| 1425 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1426 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1427 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1428 | void Unparse( |
| 1429 | const format::IntrinsicTypeDataEditDesc &x) { // R1307(1/2) - R1311 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1430 | switch (x.kind) { |
| 1431 | #define FMT(x) \ |
| 1432 | case format::IntrinsicTypeDataEditDesc::Kind::x: Put(#x); break |
| 1433 | FMT(I); |
| 1434 | FMT(B); |
| 1435 | FMT(O); |
| 1436 | FMT(Z); |
| 1437 | FMT(F); |
| 1438 | FMT(E); |
| 1439 | FMT(EN); |
| 1440 | FMT(ES); |
| 1441 | FMT(EX); |
| 1442 | FMT(G); |
| 1443 | FMT(L); |
| 1444 | FMT(A); |
| 1445 | FMT(D); |
| 1446 | #undef FMT |
| 1447 | default: CRASH_NO_CASE; |
| 1448 | } |
| 1449 | Walk(x.width), Walk(".", x.digits), Walk("E", x.exponentWidth); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1450 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1451 | void Unparse(const format::DerivedTypeDataEditDesc &x) { // R1307(2/2), R1312 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1452 | Word("DT"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1453 | if (!x.type.empty()) { |
| 1454 | Put('"'), Put(x.type), Put('"'); |
| 1455 | } |
| 1456 | Walk("(", x.parameters, ",", ")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1457 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1458 | void Unparse(const format::ControlEditDesc &x) { // R1313, R1315-R1320 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1459 | switch (x.kind) { |
| 1460 | case format::ControlEditDesc::Kind::T: |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1461 | Word("T"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1462 | Walk(x.count); |
| 1463 | break; |
| 1464 | case format::ControlEditDesc::Kind::TL: |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1465 | Word("TL"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1466 | Walk(x.count); |
| 1467 | break; |
| 1468 | case format::ControlEditDesc::Kind::TR: |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1469 | Word("TR"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1470 | Walk(x.count); |
| 1471 | break; |
| 1472 | case format::ControlEditDesc::Kind::X: |
| 1473 | if (x.count != 1) { |
| 1474 | Walk(x.count); |
| 1475 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1476 | Word("X"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1477 | break; |
| 1478 | case format::ControlEditDesc::Kind::Slash: |
| 1479 | if (x.count != 1) { |
| 1480 | Walk(x.count); |
| 1481 | } |
| 1482 | Put('/'); |
| 1483 | break; |
| 1484 | case format::ControlEditDesc::Kind::Colon: Put(':'); break; |
| 1485 | case format::ControlEditDesc::Kind::P: |
| 1486 | Walk(x.count); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1487 | Word("P"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1488 | break; |
| 1489 | #define FMT(x) \ |
| 1490 | case format::ControlEditDesc::Kind::x: Put(#x); break |
| 1491 | FMT(SS); |
| 1492 | FMT(SP); |
| 1493 | FMT(S); |
| 1494 | FMT(BN); |
| 1495 | FMT(BZ); |
| 1496 | FMT(RU); |
| 1497 | FMT(RD); |
| 1498 | FMT(RZ); |
| 1499 | FMT(RN); |
| 1500 | FMT(RC); |
| 1501 | FMT(RP); |
| 1502 | FMT(DC); |
| 1503 | FMT(DP); |
| 1504 | #undef FMT |
| 1505 | default: CRASH_NO_CASE; |
| 1506 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1507 | } |
| 1508 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1509 | void Before(const MainProgram &x) { // R1401 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1510 | if (!std::get<std::optional<Statement<ProgramStmt>>>(x.t)) { |
| 1511 | Indent(); |
| 1512 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1513 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1514 | void Before(const ProgramStmt &x) { // R1402 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1515 | Word("PROGRAM "), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1516 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1517 | void Unparse(const EndProgramStmt &x) { // R1403 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1518 | EndSubprogram("PROGRAM", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1519 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1520 | void Before(const ModuleStmt &) { // R1405 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1521 | Word("MODULE "), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1522 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1523 | void Unparse(const EndModuleStmt &x) { // R1406 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1524 | EndSubprogram("MODULE", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1525 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1526 | void Unparse(const UseStmt &x) { // R1409 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1527 | Word("USE"), Walk(", ", x.nature), Put(" :: "), Walk(x.moduleName); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1528 | std::visit( |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1529 | common::visitors{ |
| 1530 | [&](const std::list<Rename> &y) { Walk(", ", y, ", "); }, |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1531 | [&](const std::list<Only> &y) { Walk(", ONLY: ", y, ", "); }, |
| 1532 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1533 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1534 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1535 | void Unparse(const Rename &x) { // R1411 |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1536 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1537 | common::visitors{ |
| 1538 | [&](const Rename::Names &y) { Walk(y.t, " => "); }, |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1539 | [&](const Rename::Operators &y) { |
| 1540 | Word("OPERATOR("), Walk(y.t, ") => OPERATOR("), Put(")"); |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1541 | }, |
| 1542 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1543 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1544 | } |
peter klausler | 31cfbea | 2018-07-17 20:35:41 | [diff] [blame] | 1545 | void Unparse(const SubmoduleStmt &x) { // R1417 |
peter klausler | 1732d04 | 2018-07-17 19:51:54 | [diff] [blame] | 1546 | Word("SUBMODULE ("), WalkTupleElements(x.t, ")"), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1547 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1548 | void Unparse(const ParentIdentifier &x) { // R1418 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1549 | Walk(std::get<Name>(x.t)), Walk(":", std::get<std::optional<Name>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1550 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1551 | void Unparse(const EndSubmoduleStmt &x) { // R1419 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1552 | EndSubprogram("SUBMODULE", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1553 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1554 | void Unparse(const BlockDataStmt &x) { // R1421 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1555 | Word("BLOCK DATA"), Walk(" ", x.v), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1556 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1557 | void Unparse(const EndBlockDataStmt &x) { // R1422 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1558 | EndSubprogram("BLOCK DATA", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1559 | } |
| 1560 | |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1561 | void Unparse(const InterfaceStmt &x) { // R1503 |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1562 | std::visit( |
| 1563 | common::visitors{ |
| 1564 | [&](const std::optional<GenericSpec> &y) { |
| 1565 | Word("INTERFACE"), Walk(" ", y); |
| 1566 | }, |
| 1567 | [&](const Abstract &) { Word("ABSTRACT INTERFACE"); }, |
| 1568 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1569 | x.u); |
| 1570 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1571 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1572 | void Unparse(const EndInterfaceStmt &x) { // R1504 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1573 | Outdent(), Word("END INTERFACE"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1574 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1575 | void Unparse(const ProcedureStmt &x) { // R1506 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1576 | if (std::get<ProcedureStmt::Kind>(x.t) == |
| 1577 | ProcedureStmt::Kind::ModuleProcedure) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1578 | Word("MODULE "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1579 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1580 | Word("PROCEDURE :: "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1581 | Walk(std::get<std::list<Name>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1582 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1583 | void Before(const GenericSpec &x) { // R1508, R1509 |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 1584 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1585 | common::visitors{ |
| 1586 | [&](const DefinedOperator &x) { Word("OPERATOR("); }, |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 1587 | [&](const GenericSpec::Assignment &) { Word("ASSIGNMENT(=)"); }, |
| 1588 | [&](const GenericSpec::ReadFormatted &) { |
| 1589 | Word("READ(FORMATTED)"); |
| 1590 | }, |
| 1591 | [&](const GenericSpec::ReadUnformatted &) { |
| 1592 | Word("READ(UNFORMATTED)"); |
| 1593 | }, |
| 1594 | [&](const GenericSpec::WriteFormatted &) { |
| 1595 | Word("WRITE(FORMATTED)"); |
| 1596 | }, |
| 1597 | [&](const GenericSpec::WriteUnformatted &) { |
| 1598 | Word("WRITE(UNFORMATTED)"); |
| 1599 | }, |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1600 | [](const auto &) {}, |
| 1601 | }, |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1602 | x.u); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1603 | } |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 1604 | void Post(const GenericSpec &x) { |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1605 | std::visit( |
| 1606 | common::visitors{ |
| 1607 | [&](const DefinedOperator &x) { Put(')'); }, |
| 1608 | [](const auto &) {}, |
| 1609 | }, |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 1610 | x.u); |
| 1611 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1612 | void Unparse(const GenericStmt &x) { // R1510 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1613 | Word("GENERIC"), Walk(", ", std::get<std::optional<AccessSpec>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1614 | Put(" :: "), Walk(std::get<GenericSpec>(x.t)), Put(" => "); |
| 1615 | Walk(std::get<std::list<Name>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1616 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1617 | void Unparse(const ExternalStmt &x) { // R1511 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1618 | Word("EXTERNAL :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1619 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1620 | void Unparse(const ProcedureDeclarationStmt &x) { // R1512 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1621 | Word("PROCEDURE ("), Walk(std::get<std::optional<ProcInterface>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1622 | Put(')'), Walk(", ", std::get<std::list<ProcAttrSpec>>(x.t), ", "); |
| 1623 | Put(" :: "), Walk(std::get<std::list<ProcDecl>>(x.t), ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1624 | } |
peter klausler | 204a50d | 2019-02-27 20:30:57 | [diff] [blame] | 1625 | void Unparse(const ProcInterface &x) { // R1513 |
| 1626 | std::visit( |
| 1627 | common::visitors{ |
| 1628 | [&](const DeclarationTypeSpec &d) { |
| 1629 | std::visit( |
| 1630 | common::visitors{ |
| 1631 | [&](const IntrinsicTypeSpec &t) { |
| 1632 | // Emit TYPE(REAL) to ensure no conflict with a symbol |
| 1633 | // REAL |
| 1634 | Word("TYPE("), Walk(t), Word(")"); |
| 1635 | }, |
| 1636 | [&](const auto &t) { Walk(t); }, |
| 1637 | }, |
| 1638 | d.u); |
| 1639 | }, |
| 1640 | [&](const Name &n) { Walk(n); }, |
| 1641 | }, |
| 1642 | x.u); |
| 1643 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1644 | void Unparse(const ProcDecl &x) { // R1515 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1645 | Walk(std::get<Name>(x.t)); |
| 1646 | Walk(" => ", std::get<std::optional<ProcPointerInit>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1647 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1648 | void Unparse(const IntrinsicStmt &x) { // R1519 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1649 | Word("INTRINSIC :: "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1650 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1651 | void Unparse(const FunctionReference &x) { // R1520 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1652 | Walk(std::get<ProcedureDesignator>(x.v.t)); |
| 1653 | Put('('), Walk(std::get<std::list<ActualArgSpec>>(x.v.t), ", "), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1654 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1655 | void Unparse(const CallStmt &x) { // R1521 |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 1656 | const auto &pd{std::get<ProcedureDesignator>(x.v.t)}; |
| 1657 | const auto &args{std::get<std::list<ActualArgSpec>>(x.v.t)}; |
peter klausler | ad4adc2 | 2018-03-16 00:09:27 | [diff] [blame] | 1658 | Word("CALL "), Walk(pd); |
| 1659 | if (args.empty()) { |
| 1660 | if (std::holds_alternative<ProcComponentRef>(pd.u)) { |
| 1661 | Put("()"); // pgf90 crashes on CALL to tbp without parentheses |
| 1662 | } |
| 1663 | } else { |
| 1664 | Walk("(", args, ", ", ")"); |
| 1665 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1666 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1667 | void Unparse(const ActualArgSpec &x) { // R1523 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1668 | Walk(std::get<std::optional<Keyword>>(x.t), "="); |
| 1669 | Walk(std::get<ActualArg>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1670 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1671 | void Unparse(const ActualArg::PercentRef &x) { // R1524 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1672 | Word("%REF("), Walk(x.v), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1673 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1674 | void Unparse(const ActualArg::PercentVal &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1675 | Word("%VAL("), Walk(x.v), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1676 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1677 | void Before(const AltReturnSpec &) { // R1525 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1678 | Put('*'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1679 | } |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 1680 | void Post(const PrefixSpec::Elemental) { Word("ELEMENTAL"); } // R1527 |
| 1681 | void Post(const PrefixSpec::Impure) { Word("IMPURE"); } |
| 1682 | void Post(const PrefixSpec::Module) { Word("MODULE"); } |
| 1683 | void Post(const PrefixSpec::Non_Recursive) { Word("NON_RECURSIVE"); } |
| 1684 | void Post(const PrefixSpec::Pure) { Word("PURE"); } |
| 1685 | void Post(const PrefixSpec::Recursive) { Word("RECURSIVE"); } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1686 | void Unparse(const FunctionStmt &x) { // R1530 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1687 | Walk("", std::get<std::list<PrefixSpec>>(x.t), " ", " "); |
peter klausler | 62d9cdd | 2018-03-15 00:02:21 | [diff] [blame] | 1688 | Word("FUNCTION "), Walk(std::get<Name>(x.t)), Put("("); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1689 | Walk(std::get<std::list<Name>>(x.t), ", "), Put(')'); |
| 1690 | Walk(" ", std::get<std::optional<Suffix>>(x.t)), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1691 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1692 | void Unparse(const Suffix &x) { // R1532 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1693 | if (x.resultName) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1694 | Word("RESULT("), Walk(x.resultName), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1695 | Walk(" ", x.binding); |
| 1696 | } else { |
| 1697 | Walk(x.binding); |
| 1698 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1699 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1700 | void Unparse(const EndFunctionStmt &x) { // R1533 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1701 | EndSubprogram("FUNCTION", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1702 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1703 | void Unparse(const SubroutineStmt &x) { // R1535 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1704 | Walk("", std::get<std::list<PrefixSpec>>(x.t), " ", " "); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1705 | Word("SUBROUTINE "), Walk(std::get<Name>(x.t)); |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 1706 | const auto &args{std::get<std::list<DummyArg>>(x.t)}; |
| 1707 | const auto &bind{std::get<std::optional<LanguageBindingSpec>>(x.t)}; |
peter klausler | d71f3cf | 2018-03-14 23:31:41 | [diff] [blame] | 1708 | if (args.empty()) { |
| 1709 | Walk(" () ", bind); |
| 1710 | } else { |
| 1711 | Walk(" (", args, ", ", ")"); |
| 1712 | Walk(" ", bind); |
| 1713 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1714 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1715 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1716 | void Unparse(const EndSubroutineStmt &x) { // R1537 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1717 | EndSubprogram("SUBROUTINE", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1718 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1719 | void Before(const MpSubprogramStmt &) { // R1539 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1720 | Word("MODULE PROCEDURE "), Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1721 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1722 | void Unparse(const EndMpSubprogramStmt &x) { // R1540 |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 1723 | EndSubprogram("PROCEDURE", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1724 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1725 | void Unparse(const EntryStmt &x) { // R1541 |
peter klausler | bdd93dd | 2018-04-09 20:45:30 | [diff] [blame] | 1726 | Word("ENTRY "), Walk(std::get<Name>(x.t)), Put("("); |
| 1727 | Walk(std::get<std::list<DummyArg>>(x.t), ", "), Put(")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1728 | Walk(" ", std::get<std::optional<Suffix>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1729 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1730 | void Unparse(const ReturnStmt &x) { // R1542 |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1731 | Word("RETURN"), Walk(" ", x.v); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1732 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1733 | void Unparse(const ContainsStmt &x) { // R1543 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1734 | Outdent(); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 1735 | Word("CONTAINS"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1736 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1737 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1738 | void Unparse(const StmtFunctionStmt &x) { // R1544 |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1739 | Walk(std::get<Name>(x.t)), Put('('); |
| 1740 | Walk(std::get<std::list<Name>>(x.t), ", "), Put(") = "); |
| 1741 | Walk(std::get<Scalar<Expr>>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 1742 | } |
| 1743 | |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 1744 | // Directives, extensions, and deprecated constructs |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1745 | void Unparse(const CompilerDirective &x) { |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 1746 | std::visit( |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1747 | common::visitors{ |
| 1748 | [&](const std::list<CompilerDirective::IgnoreTKR> &tkr) { |
peter klausler | 3204a1c | 2019-03-14 19:19:26 | [diff] [blame] | 1749 | Word("!DIR$ IGNORE_TKR"); // emitted even if tkr list is empty |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1750 | Walk(" ", tkr, ", "); |
| 1751 | }, |
peter klausler | 3204a1c | 2019-03-14 19:19:26 | [diff] [blame] | 1752 | [&](const std::list<Name> &names) { Walk("!DIR$ ", names, " "); }, |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1753 | }, |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 1754 | x.u); |
| 1755 | Put('\n'); |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 1756 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 1757 | void Unparse(const CompilerDirective::IgnoreTKR &x) { |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 1758 | const auto &list{std::get<std::list<const char *>>(x.t)}; |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 1759 | if (!list.empty()) { |
| 1760 | Put("("); |
| 1761 | for (const char *tkr : list) { |
| 1762 | Put(*tkr); |
| 1763 | } |
| 1764 | Put(") "); |
| 1765 | } |
| 1766 | Walk(std::get<Name>(x.t)); |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 1767 | } |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1768 | // OpenMP Clauses & Directives |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1769 | void Unparse(const OmpObject &x) { |
| 1770 | bool isCommon{std::get<OmpObject::Kind>(x.t) == OmpObject::Kind::Common}; |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1771 | const char *slash{isCommon ? "/" : ""}; |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1772 | Put(slash), Walk(std::get<Designator>(x.t)), Put(slash); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1773 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1774 | void Unparse(const OmpMapType::Always &x) { Word("ALWAYS,"); } |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1775 | void Unparse(const OmpMapClause &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1776 | Word("MAP("); |
| 1777 | Walk(std::get<std::optional<OmpMapType>>(x.t), ":"); |
| 1778 | Walk(std::get<OmpObjectList>(x.t)); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1779 | Put(") "); |
| 1780 | } |
| 1781 | void Unparse(const OmpScheduleModifier &x) { |
| 1782 | Walk(std::get<OmpScheduleModifier::Modifier1>(x.t)); |
| 1783 | Walk(",", std::get<std::optional<OmpScheduleModifier::Modifier2>>(x.t)); |
| 1784 | } |
| 1785 | void Unparse(const OmpScheduleClause &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1786 | Word("SCHEDULE("); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1787 | Walk(std::get<std::optional<OmpScheduleModifier>>(x.t)); |
| 1788 | Walk(std::get<OmpScheduleClause::ScheduleType>(x.t)); |
Hongyon Suauthai | 90aca33 | 2018-06-01 21:36:51 | [diff] [blame] | 1789 | Walk(",", std::get<std::optional<ScalarIntExpr>>(x.t)); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1790 | Put(")"); |
| 1791 | } |
| 1792 | void Unparse(const OmpAlignedClause &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1793 | Word("ALIGNED("), Walk(std::get<std::list<Name>>(x.t), ","); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1794 | Walk(std::get<std::optional<ScalarIntConstantExpr>>(x.t)); |
| 1795 | Put(") "); |
| 1796 | } |
| 1797 | void Unparse(const OmpIfClause &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1798 | Word("IF("), |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1799 | Walk(std::get<std::optional<OmpIfClause::DirectiveNameModifier>>(x.t), |
| 1800 | ":"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1801 | Walk(std::get<ScalarLogicalExpr>(x.t)); |
| 1802 | Put(") "); |
| 1803 | } |
| 1804 | void Unparse(const OmpLinearClause::WithoutModifier &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1805 | Word("LINEAR("), Walk(x.names, ", "); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1806 | Walk(":", x.step); |
| 1807 | Put(")"); |
| 1808 | } |
| 1809 | void Unparse(const OmpLinearClause::WithModifier &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1810 | Word("LINEAR("), Walk(x.modifier), Put("("), Walk(x.names, ","), Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1811 | Walk(":", x.step); |
| 1812 | Put(")"); |
| 1813 | } |
| 1814 | void Unparse(const OmpReductionClause &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1815 | Word("REDUCTION("); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1816 | Walk(std::get<OmpReductionOperator>(x.t)); |
| 1817 | Put(":"); |
| 1818 | Walk(std::get<std::list<Designator>>(x.t), ","); |
| 1819 | Put(")"); |
| 1820 | } |
| 1821 | void Unparse(const OmpDependSinkVecLength &x) { |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1822 | Walk(std::get<common::Indirection<DefinedOperator>>(x.t)); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1823 | Walk(std::get<ScalarIntConstantExpr>(x.t)); |
| 1824 | } |
| 1825 | void Unparse(const OmpDependSinkVec &x) { |
| 1826 | Walk(std::get<Name>(x.t)); |
| 1827 | Walk(std::get<std::optional<OmpDependSinkVecLength>>(x.t)); |
| 1828 | } |
| 1829 | void Unparse(const OmpDependClause::InOut &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1830 | Put("("); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1831 | Walk(std::get<OmpDependenceType>(x.t)); |
| 1832 | Put(":"); |
| 1833 | Walk(std::get<std::list<Designator>>(x.t), ","); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1834 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1835 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1836 | bool Pre(const OmpDependClause &x) { |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 1837 | return std::visit( |
| 1838 | common::visitors{ |
| 1839 | [&](const OmpDependClause::Source &y) { |
| 1840 | Word("DEPEND(SOURCE)"); |
| 1841 | return false; |
| 1842 | }, |
| 1843 | [&](const OmpDependClause::Sink &y) { |
| 1844 | Word("DEPEND(SINK:"); |
| 1845 | Walk(y.v); |
| 1846 | Put(")"); |
| 1847 | return false; |
| 1848 | }, |
| 1849 | [&](const OmpDependClause::InOut &y) { |
| 1850 | Word("DEPEND"); |
| 1851 | return true; |
| 1852 | }, |
| 1853 | }, |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1854 | x.u); |
| 1855 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1856 | bool Pre(const OmpDefaultClause &x) { |
| 1857 | Word("DEFAULT("); |
| 1858 | return true; |
| 1859 | } |
| 1860 | void Post(const OmpDefaultClause &x) { Put(")"); } |
| 1861 | bool Pre(const OmpProcBindClause &x) { |
| 1862 | Word("PROC_BIND("); |
| 1863 | return true; |
| 1864 | } |
| 1865 | void Post(const OmpProcBindClause &x) { Put(")"); } |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1866 | void Before(const OmpClause::Defaultmap &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1867 | Word("DEFAULTMAP(TOFROM:SCALAR)"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1868 | } |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1869 | void Before(const OmpClause::Inbranch &x) { Word("INBRANCH"); } |
| 1870 | void Before(const OmpClause::Mergeable &x) { Word("MERGEABLE"); } |
| 1871 | void Before(const OmpClause::Nogroup &x) { Word("NOGROUP"); } |
| 1872 | void Before(const OmpClause::Notinbranch &x) { Word("NOTINBRANCH"); } |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1873 | void Before(const OmpClause::Untied &x) { Word("UNTIED"); } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1874 | void Unparse(const OmpNowait &) { Word("NOWAIT"); } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1875 | void Unparse(const OmpClause::Collapse &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1876 | Word("COLLAPSE("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1877 | Walk(x.v); |
| 1878 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1879 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1880 | void Unparse(const OmpClause::Copyin &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1881 | Word("COPYIN("); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1882 | Walk(x.v); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1883 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1884 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1885 | void Unparse(const OmpClause::Copyprivate &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1886 | Word("COPYPRIVATE("); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1887 | Walk(x.v); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1888 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1889 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1890 | void Unparse(const OmpClause::Device &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1891 | Word("DEVICE("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1892 | Walk(x.v); |
| 1893 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1894 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1895 | void Unparse(const OmpClause::DistSchedule &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1896 | Word("DIST_SCHEDULE(STATIC,"); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1897 | Walk(x.v); |
| 1898 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1899 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1900 | void Unparse(const OmpClause::Final &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1901 | Word("FINAL("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1902 | Walk(x.v); |
| 1903 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1904 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1905 | void Unparse(const OmpClause::Firstprivate &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1906 | Word("FIRSTPRIVATE("); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1907 | Walk(x.v); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1908 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1909 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1910 | void Unparse(const OmpClause::From &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1911 | Word("FROM("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1912 | Walk(x.v, ","); |
| 1913 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1914 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1915 | void Unparse(const OmpClause::Grainsize &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1916 | Word("GRAINSIZE("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1917 | Walk(x.v); |
| 1918 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1919 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1920 | void Unparse(const OmpClause::Lastprivate &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1921 | Word("LASTPRIVATE("); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1922 | Walk(x.v); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1923 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1924 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1925 | void Unparse(const OmpClause::NumTasks &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1926 | Word("NUM_TASKS("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1927 | Walk(x.v); |
| 1928 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1929 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1930 | void Unparse(const OmpClause::NumTeams &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1931 | Word("NUM_TEAMS("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1932 | Walk(x.v); |
| 1933 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1934 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1935 | void Unparse(const OmpClause::NumThreads &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1936 | Word("NUM_THREADS("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1937 | Walk(x.v); |
| 1938 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1939 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1940 | void Unparse(const OmpClause::Ordered &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1941 | Word("ORDERED"); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1942 | Walk("(", x.v, ")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1943 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1944 | void Unparse(const OmpClause::Priority &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1945 | Word("PRIORITY("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1946 | Walk(x.v); |
| 1947 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1948 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1949 | void Unparse(const OmpClause::Private &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1950 | Word("PRIVATE("); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1951 | Walk(x.v); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1952 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1953 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1954 | void Unparse(const OmpClause::Safelen &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1955 | Word("SAFELEN("); |
| 1956 | Walk(x.v); |
| 1957 | Put(")"); |
| 1958 | } |
| 1959 | void Unparse(const OmpClause::Simdlen &x) { |
| 1960 | Word("SIMDLEN("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1961 | Walk(x.v); |
| 1962 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1963 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1964 | void Unparse(const OmpClause::ThreadLimit &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1965 | Word("THREADLIMIT("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1966 | Walk(x.v); |
| 1967 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1968 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1969 | void Unparse(const OmpClause::Shared &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1970 | Word("SHARED("); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1971 | Walk(x.v); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1972 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1973 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1974 | void Unparse(const OmpClause::To &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1975 | Word("TO("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1976 | Walk(x.v, ","); |
| 1977 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1978 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1979 | void Unparse(const OmpClause::Uniform &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1980 | Word("UNIFORM("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1981 | Walk(x.v, ","); |
| 1982 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1983 | } |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1984 | void Unparse(const OmpClause::UseDevicePtr &x) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1985 | Word("USE_DEVICE_PTR("); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1986 | Walk(x.v, ","); |
| 1987 | Put(")"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 1988 | } |
| 1989 | void Unparse(const OmpLoopDirective &x) { |
| 1990 | std::visit( |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1991 | common::visitors{ |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1992 | [&](const OmpLoopDirective::DistributeParallelDoSimd &) { |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1993 | Word("DISTRIBUTE PARALLEL DO SIMD "); |
peter klausler | b23701f | 2018-06-18 18:03:43 | [diff] [blame] | 1994 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1995 | [&](const OmpLoopDirective::DistributeParallelDo &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1996 | Word("DISTRIBUTE PARALLEL DO "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 1997 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 1998 | [&](const OmpLoopDirective::DistributeSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 1999 | Word("DISTRIBUTE SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2000 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2001 | [&](const OmpLoopDirective::Distribute &) { Word("DISTRIBUTE "); }, |
| 2002 | [&](const OmpLoopDirective::ParallelDoSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2003 | Word("PARALLEL DO SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2004 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2005 | [&](const OmpLoopDirective::ParallelDo &) { Word("PARALLEL DO "); }, |
| 2006 | [&](const OmpLoopDirective::Do &) { Word("DO "); }, |
| 2007 | [&](const OmpLoopDirective::DoSimd &) { Word("Do SIMD "); }, |
| 2008 | [&](const OmpLoopDirective::Simd &) { Word("SIMD "); }, |
| 2009 | [&](const OmpLoopDirective::TargetParallelDoSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2010 | Word("TARGET PARALLEL DO SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2011 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2012 | [&](const OmpLoopDirective::TargetParallelDo &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2013 | Word("TARGET PARALLEL DO "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2014 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2015 | [&](const OmpLoopDirective::TargetTeamsDistributeParallelDoSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2016 | Word("TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2017 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2018 | [&](const OmpLoopDirective::TargetTeamsDistributeParallelDo &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2019 | Word("TARGET TEAMS DISTRIBUTE PARALLEL DO "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2020 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2021 | [&](const OmpLoopDirective::TargetTeamsDistributeSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2022 | Word("TARGET TEAMS DISTRIBUTE SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2023 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2024 | [&](const OmpLoopDirective::TargetTeamsDistribute &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2025 | Word("TARGET TEAMS DISTRIBUTE "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2026 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2027 | [&](const OmpLoopDirective::TargetSimd &) { Word("TARGET SIMD "); }, |
| 2028 | [&](const OmpLoopDirective::TaskloopSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2029 | Word("TASKLOOP SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2030 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2031 | [&](const OmpLoopDirective::Taskloop &) { Word("TASKLOOP "); }, |
| 2032 | [&](const OmpLoopDirective::TeamsDistributeParallelDoSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2033 | Word("TEAMS DISTRIBUTE PARALLEL DO SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2034 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2035 | [&](const OmpLoopDirective::TeamsDistributeParallelDo &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2036 | Word("TEAMS DISTRIBUTE PARALLEL DO "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2037 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2038 | [&](const OmpLoopDirective::TeamsDistributeSimd &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2039 | Word("TEAMS DISTRIBUTE SIMD "); |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2040 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2041 | [&](const OmpLoopDirective::TeamsDistribute &) { |
Hongyon Suauthai | e2c8c21 | 2018-06-01 18:47:24 | [diff] [blame] | 2042 | Word("TEAMS DISTRIBUTE "); |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 2043 | }, |
| 2044 | }, |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2045 | x.u); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2046 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2047 | void Unparse(const OmpObjectList &x) { Walk(x.v, ","); } |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2048 | void Unparse(const OmpStandaloneDirective &x) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2049 | std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 2050 | common::visitors{ |
| 2051 | [&](const OmpStandaloneDirective::TargetEnterData &) { |
| 2052 | Word("TARGET ENTER DATA "); |
| 2053 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2054 | [&](const OmpStandaloneDirective::TargetExitData &) { |
| 2055 | Word("TARGET EXIT DATA "); |
| 2056 | }, |
| 2057 | [&](const OmpStandaloneDirective::TargetUpdate &) { |
| 2058 | Word("TARGET UPDATE "); |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 2059 | }, |
| 2060 | }, |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2061 | x.u); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2062 | } |
| 2063 | void Unparse(const OmpBlockDirective &x) { |
| 2064 | std::visit( |
| 2065 | common::visitors{ |
| 2066 | [&](const OmpBlockDirective::Master &y) { Word("MASTER"); }, |
| 2067 | [&](const OmpBlockDirective::Ordered &) { Word("ORDERED "); }, |
| 2068 | [&](const OmpBlockDirective::ParallelWorkshare &) { |
| 2069 | Word("PARALLEL WORKSHARE "); |
| 2070 | }, |
| 2071 | [&](const OmpBlockDirective::Parallel &) { Word("PARALLEL "); }, |
| 2072 | [&](const OmpBlockDirective::TargetData &) { |
| 2073 | Word("TARGET DATA "); |
| 2074 | }, |
| 2075 | [&](const OmpBlockDirective::TargetParallel &) { |
| 2076 | Word("TARGET PARALLEL "); |
| 2077 | }, |
| 2078 | [&](const OmpBlockDirective::TargetTeams &) { |
| 2079 | Word("TARGET TEAMS "); |
| 2080 | }, |
| 2081 | [&](const OmpBlockDirective::Target &) { Word("TARGET "); }, |
| 2082 | [&](const OmpBlockDirective::Taskgroup &) { Word("TASKGROUP "); }, |
| 2083 | [&](const OmpBlockDirective::Task &) { Word("TASK "); }, |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 2084 | [&](const OmpBlockDirective::Teams &) { Word("TEAMS "); }, |
| 2085 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2086 | x.u); |
| 2087 | } |
| 2088 | void Unparse(const OmpAtomic &x) { |
| 2089 | BeginOpenMP(); |
| 2090 | Word("!$OMP ATOMIC"); |
| 2091 | Walk(std::get<std::optional<OmpAtomic::SeqCst>>(x.t), " SEQ_CST"); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2092 | Put("\n"); |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2093 | EndOpenMP(); |
| 2094 | Walk(std::get<Statement<AssignmentStmt>>(x.t)); |
| 2095 | BeginOpenMP(); |
| 2096 | Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n"); |
| 2097 | EndOpenMP(); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2098 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2099 | void Unparse(const OmpAtomicCapture &x) { |
| 2100 | BeginOpenMP(); |
| 2101 | Word("!$OMP ATOMIC"); |
| 2102 | Walk(std::get<std::optional<OmpAtomicCapture::SeqCst1>>(x.t), " SEQ_CST,"); |
| 2103 | Word(" CAPTURE"); |
| 2104 | Walk(std::get<std::optional<OmpAtomicCapture::SeqCst2>>(x.t), " ,SEQ_CST"); |
| 2105 | Put("\n"); |
| 2106 | EndOpenMP(); |
| 2107 | Walk(std::get<OmpAtomicCapture::Stmt1>(x.t)); |
| 2108 | Put("\n"); |
| 2109 | Walk(std::get<OmpAtomicCapture::Stmt2>(x.t)); |
| 2110 | BeginOpenMP(); |
| 2111 | Word("!$OMP END ATOMIC\n"); |
| 2112 | EndOpenMP(); |
| 2113 | } |
| 2114 | void Unparse(const OmpAtomicRead &x) { |
| 2115 | BeginOpenMP(); |
| 2116 | Word("!$OMP ATOMIC"); |
| 2117 | Walk(std::get<std::optional<OmpAtomicRead::SeqCst1>>(x.t), " SEQ_CST,"); |
| 2118 | Word(" READ"); |
| 2119 | Walk(std::get<std::optional<OmpAtomicRead::SeqCst2>>(x.t), " ,SEQ_CST"); |
| 2120 | Put("\n"); |
| 2121 | EndOpenMP(); |
| 2122 | Walk(std::get<Statement<AssignmentStmt>>(x.t)); |
| 2123 | BeginOpenMP(); |
| 2124 | Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n"); |
| 2125 | EndOpenMP(); |
| 2126 | } |
| 2127 | void Unparse(const OmpAtomicUpdate &x) { |
| 2128 | BeginOpenMP(); |
| 2129 | Word("!$OMP ATOMIC"); |
| 2130 | Walk(std::get<std::optional<OmpAtomicUpdate::SeqCst1>>(x.t), " SEQ_CST,"); |
| 2131 | Word(" UPDATE"); |
| 2132 | Walk(std::get<std::optional<OmpAtomicUpdate::SeqCst2>>(x.t), " ,SEQ_CST"); |
| 2133 | Put("\n"); |
| 2134 | EndOpenMP(); |
| 2135 | Walk(std::get<Statement<AssignmentStmt>>(x.t)); |
| 2136 | BeginOpenMP(); |
| 2137 | Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n"); |
| 2138 | EndOpenMP(); |
| 2139 | } |
| 2140 | void Unparse(const OmpAtomicWrite &x) { |
| 2141 | BeginOpenMP(); |
| 2142 | Word("!$OMP ATOMIC"); |
| 2143 | Walk(std::get<std::optional<OmpAtomicWrite::SeqCst1>>(x.t), " SEQ_CST,"); |
| 2144 | Word(" WRITE"); |
| 2145 | Walk(std::get<std::optional<OmpAtomicWrite::SeqCst2>>(x.t), " ,SEQ_CST"); |
| 2146 | Put("\n"); |
| 2147 | EndOpenMP(); |
| 2148 | Walk(std::get<Statement<AssignmentStmt>>(x.t)); |
| 2149 | BeginOpenMP(); |
| 2150 | Walk(std::get<std::optional<OmpEndAtomic>>(x.t), "!$OMP END ATOMIC\n"); |
| 2151 | EndOpenMP(); |
| 2152 | } |
| 2153 | void Unparse(const OmpEndCritical &x) { |
| 2154 | Walk(" (", x.v, ")"); |
| 2155 | EndOpenMP(); |
| 2156 | } |
| 2157 | void Unparse(const OpenMPCriticalConstruct &x) { |
| 2158 | BeginOpenMP(); |
| 2159 | Word("!$OMP CRITICAL"); |
| 2160 | Walk(" (", std::get<std::optional<Name>>(x.t), ")"); |
| 2161 | Walk(" HINT(", std::get<std::optional<OpenMPCriticalConstruct::Hint>>(x.t), |
| 2162 | ")"); |
| 2163 | Put("\n"); |
| 2164 | EndOpenMP(); |
| 2165 | Walk(std::get<Block>(x.t), ""); |
| 2166 | BeginOpenMP(); |
| 2167 | Word("!$OMP END CRITICAL"); |
| 2168 | Walk(std::get<OmpEndCritical>(x.t)); |
| 2169 | Put("\n"); |
| 2170 | EndOpenMP(); |
| 2171 | } |
| 2172 | void Unparse(const OpenMPDeclareTargetConstruct::WithClause &x) { |
| 2173 | Walk(x.maptype), Put("("), Walk(x.names), Put(")"); |
| 2174 | } |
| 2175 | void Unparse(const OpenMPDeclareTargetConstruct::WithExtendedList &x) { |
| 2176 | Put("("), Walk(x.names), Put(")"); |
| 2177 | } |
| 2178 | void Unparse(const OmpReductionInitializerClause &x) { |
| 2179 | Word(" INITIALIZER(OMP_PRIV = "); |
| 2180 | Walk(x.v); |
| 2181 | Put(")"); |
| 2182 | } |
| 2183 | void Unparse(const OmpReductionCombiner::FunctionCombiner &x) { |
| 2184 | const auto &pd = std::get<ProcedureDesignator>(x.v.t); |
| 2185 | const auto &args = std::get<std::list<ActualArgSpec>>(x.v.t); |
| 2186 | Walk(pd); |
| 2187 | if (args.empty()) { |
| 2188 | if (std::holds_alternative<ProcComponentRef>(pd.u)) { |
| 2189 | Put("()"); |
| 2190 | } |
| 2191 | } else { |
| 2192 | Walk("(", args, ", ", ")"); |
| 2193 | } |
| 2194 | } |
| 2195 | void Unparse(const OpenMPDeclareReductionConstruct &x) { |
| 2196 | Put("("); |
| 2197 | Walk(std::get<OmpReductionOperator>(x.t)), Put(" : "); |
| 2198 | Walk(std::get<std::list<DeclarationTypeSpec>>(x.t), ","), Put(" : "); |
| 2199 | Walk(std::get<OmpReductionCombiner>(x.t)); |
| 2200 | Put(")"); |
| 2201 | Walk(std::get<std::optional<OmpReductionInitializerClause>>(x.t)); |
| 2202 | } |
| 2203 | bool Pre(const OpenMPDeclarativeConstruct &x) { |
| 2204 | BeginOpenMP(); |
| 2205 | Word("!$OMP "); |
| 2206 | return std::visit( |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 2207 | common::visitors{ |
| 2208 | [&](const OpenMPDeclareReductionConstruct &y) { |
| 2209 | Word("DECLARE REDUCTION "); |
| 2210 | return true; |
| 2211 | }, |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2212 | [&](const OpenMPDeclareSimdConstruct &y) { |
| 2213 | Word("DECLARE SIMD "); |
| 2214 | Walk("(", std::get<std::optional<Name>>(y.t), ")"); |
| 2215 | Walk(std::get<OmpClauseList>(y.t)); |
| 2216 | Put("\n"); |
| 2217 | EndOpenMP(); |
| 2218 | return false; |
| 2219 | }, |
| 2220 | [&](const OpenMPDeclareTargetConstruct &y) { |
| 2221 | Word("DECLARE TARGET "); |
| 2222 | return true; |
| 2223 | }, |
| 2224 | [&](const OpenMPDeclarativeConstruct::Threadprivate &y) { |
| 2225 | Word("THREADPRIVATE ("); |
| 2226 | return true; |
Tim Keith | daa0b05 | 2018-11-29 17:27:34 | [diff] [blame] | 2227 | }, |
| 2228 | }, |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2229 | x.u); |
| 2230 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2231 | void Post(const OpenMPDeclarativeConstruct &x) { |
| 2232 | Put("\n"); |
| 2233 | EndOpenMP(); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2234 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2235 | void Post(const OpenMPDeclarativeConstruct::Threadprivate &x) { |
| 2236 | Put(")\n"); |
| 2237 | EndOpenMP(); |
| 2238 | } |
| 2239 | void Unparse(const OmpEndDoSimd &x) { |
| 2240 | BeginOpenMP(); |
| 2241 | Word("DO SIMD "); |
| 2242 | Walk(x.v); |
| 2243 | EndOpenMP(); |
| 2244 | } |
| 2245 | void Unparse(const OmpEndDo &x) { |
| 2246 | BeginOpenMP(); |
| 2247 | Word("DO "); |
| 2248 | Walk(x.v); |
| 2249 | EndOpenMP(); |
| 2250 | } |
| 2251 | bool Pre(const OpenMPBarrierConstruct &x) { |
| 2252 | BeginOpenMP(); |
| 2253 | Word("!$OMP BARRIER"); |
| 2254 | Put("\n"); |
| 2255 | EndOpenMP(); |
| 2256 | return false; |
| 2257 | } |
| 2258 | void Unparse(const OpenMPSingleConstruct &x) { |
| 2259 | BeginOpenMP(); |
| 2260 | Word("!$OMP SINGLE"); |
| 2261 | Walk(std::get<OmpClauseList>(x.t)); |
| 2262 | EndOpenMP(); |
| 2263 | Put("\n"); |
| 2264 | Walk(std::get<Block>(x.t), ""); |
| 2265 | BeginOpenMP(); |
| 2266 | Word("!$OMP END SINGLE "); |
| 2267 | Walk(std::get<OmpEndSingle>(x.t)); |
| 2268 | Put("\n"); |
| 2269 | EndOpenMP(); |
| 2270 | } |
| 2271 | void Unparse(const OmpSection &x) { |
| 2272 | BeginOpenMP(); |
| 2273 | Word("!$OMP SECTION"); |
| 2274 | Put("\n"); |
| 2275 | EndOpenMP(); |
| 2276 | } |
| 2277 | void Unparse(const OpenMPSectionsConstruct &x) { |
| 2278 | BeginOpenMP(); |
| 2279 | Word("!$OMP SECTIONS"); |
| 2280 | Walk(std::get<OmpClauseList>(x.t)); |
| 2281 | Put("\n"); |
| 2282 | EndOpenMP(); |
| 2283 | Walk(std::get<Block>(x.t), ""); |
| 2284 | BeginOpenMP(); |
| 2285 | Word("!$OMP END SECTIONS"); |
| 2286 | Put("\n"); |
| 2287 | EndOpenMP(); |
| 2288 | } |
| 2289 | void Unparse(const OpenMPParallelSectionsConstruct &x) { |
| 2290 | BeginOpenMP(); |
| 2291 | Word("!$OMP PARALLEL SECTIONS"); |
| 2292 | Walk(std::get<OmpClauseList>(x.t)); |
| 2293 | Put("\n"); |
| 2294 | EndOpenMP(); |
| 2295 | Walk(std::get<Block>(x.t), ""); |
| 2296 | BeginOpenMP(); |
| 2297 | Word("!$OMP END PARALLEL SECTIONS"); |
| 2298 | Put("\n"); |
| 2299 | EndOpenMP(); |
| 2300 | } |
| 2301 | void Unparse(const OpenMPWorkshareConstruct &x) { |
| 2302 | BeginOpenMP(); |
| 2303 | Word("!$OMP WORKSHARE"); |
| 2304 | Put("\n"); |
| 2305 | EndOpenMP(); |
| 2306 | Walk(std::get<Block>(x.t), ""); |
| 2307 | BeginOpenMP(); |
| 2308 | Word("!$OMP END WORKSHARE "); |
| 2309 | Walk(std::get<std::optional<OmpNowait>>(x.t)); |
| 2310 | Put("\n"); |
| 2311 | EndOpenMP(); |
| 2312 | } |
| 2313 | bool Pre(const OpenMPTaskyieldConstruct &x) { |
| 2314 | BeginOpenMP(); |
| 2315 | Word("!$OMP TASKYIELD"); |
| 2316 | Put("\n"); |
| 2317 | EndOpenMP(); |
| 2318 | return false; |
| 2319 | } |
| 2320 | bool Pre(const OpenMPTaskwaitConstruct &x) { |
| 2321 | BeginOpenMP(); |
| 2322 | Word("!$OMP TASKWAIT"); |
| 2323 | Put("\n"); |
| 2324 | EndOpenMP(); |
| 2325 | return false; |
| 2326 | } |
| 2327 | void Unparse(const OpenMPCancellationPointConstruct &x) { |
| 2328 | BeginOpenMP(); |
| 2329 | Word("!$OMP CANCELLATION POINT "); |
| 2330 | Walk(x.v); |
| 2331 | Put("\n"); |
| 2332 | EndOpenMP(); |
| 2333 | } |
| 2334 | void Unparse(const OpenMPCancelConstruct &x) { |
| 2335 | BeginOpenMP(); |
| 2336 | Word("!$OMP CANCEL "); |
| 2337 | Walk(std::get<OmpCancelType>(x.t)); |
| 2338 | Walk(std::get<std::optional<OpenMPCancelConstruct::If>>(x.t)); |
| 2339 | Put("\n"); |
| 2340 | EndOpenMP(); |
| 2341 | } |
| 2342 | void Unparse(const OpenMPFlushConstruct &x) { |
| 2343 | BeginOpenMP(); |
| 2344 | Word("!$OMP FLUSH"); |
| 2345 | if ((x.v).has_value()) { |
| 2346 | Put("("); |
| 2347 | Walk(x.v); |
| 2348 | Put(")"); |
| 2349 | } |
| 2350 | Put("\n"); |
| 2351 | EndOpenMP(); |
| 2352 | } |
| 2353 | bool Pre(const OpenMPEndLoopDirective &x) { |
| 2354 | BeginOpenMP(); |
| 2355 | Word("!$OMP END "); |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2356 | return true; |
| 2357 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2358 | void Post(const OpenMPEndLoopDirective &x) { |
| 2359 | Put("\n"); |
| 2360 | EndOpenMP(); |
| 2361 | } |
| 2362 | void Unparse(const OmpClauseList &x) { Walk(" ", x.v, " "); } |
| 2363 | void Unparse(const OpenMPStandaloneConstruct &x) { |
| 2364 | BeginOpenMP(); |
| 2365 | Word("!$OMP "); |
| 2366 | Walk(std::get<OmpStandaloneDirective>(x.t)); |
| 2367 | Walk(std::get<OmpClauseList>(x.t)); |
| 2368 | Put("\n"); |
| 2369 | EndOpenMP(); |
| 2370 | } |
| 2371 | void Unparse(const OpenMPBlockConstruct &x) { |
| 2372 | BeginOpenMP(); |
| 2373 | Word("!$OMP "); |
| 2374 | Walk(std::get<OmpBlockDirective>(x.t)); |
| 2375 | Walk(std::get<OmpClauseList>(x.t)); |
| 2376 | Put("\n"); |
| 2377 | EndOpenMP(); |
| 2378 | Walk(std::get<Block>(x.t), ""); |
| 2379 | BeginOpenMP(); |
| 2380 | Word("!$OMP END "); |
| 2381 | Walk(std::get<OmpEndBlockDirective>(x.t)); |
| 2382 | Put("\n"); |
| 2383 | EndOpenMP(); |
| 2384 | } |
| 2385 | void Unparse(const OpenMPLoopConstruct &x) { |
| 2386 | BeginOpenMP(); |
| 2387 | Word("!$OMP "); |
| 2388 | Walk(std::get<OmpLoopDirective>(x.t)); |
| 2389 | Walk(std::get<OmpClauseList>(x.t)); |
| 2390 | Put("\n"); |
| 2391 | EndOpenMP(); |
| 2392 | } |
peter klausler | 5b0e18b | 2019-03-21 23:29:50 | [diff] [blame] | 2393 | void Unparse(const BasedPointer &x) { |
| 2394 | Put('('), Walk(std::get<0>(x.t)), Put(","), Walk(std::get<1>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2395 | Walk("(", std::get<std::optional<ArraySpec>>(x.t), ")"), Put(')'); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2396 | } |
peter klausler | 5b0e18b | 2019-03-21 23:29:50 | [diff] [blame] | 2397 | void Unparse(const BasedPointerStmt &x) { Walk("POINTER ", x.v, ","); } |
peter klausler | 4e354d8 | 2018-03-30 22:23:37 | [diff] [blame] | 2398 | void Post(const StructureField &x) { |
peter klausler | f147abd | 2018-07-11 00:09:07 | [diff] [blame] | 2399 | if (const auto *def{std::get_if<Statement<DataComponentDefStmt>>(&x.u)}) { |
peter klausler | 4e354d8 | 2018-03-30 22:23:37 | [diff] [blame] | 2400 | for (const auto &decl : |
| 2401 | std::get<std::list<ComponentDecl>>(def->statement.t)) { |
| 2402 | structureComponents_.insert(std::get<Name>(decl.t).source); |
| 2403 | } |
| 2404 | } |
| 2405 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2406 | void Unparse(const StructureStmt &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2407 | Word("STRUCTURE "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2408 | if (std::get<bool>(x.t)) { // slashes around name |
| 2409 | Put('/'), Walk(std::get<Name>(x.t)), Put('/'); |
| 2410 | Walk(" ", std::get<std::list<EntityDecl>>(x.t), ", "); |
| 2411 | } else { |
| 2412 | CHECK(std::get<std::list<EntityDecl>>(x.t).empty()); |
| 2413 | Walk(std::get<Name>(x.t)); |
| 2414 | } |
| 2415 | Indent(); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2416 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2417 | void Post(const Union::UnionStmt &) { Word("UNION"), Indent(); } |
| 2418 | void Post(const Union::EndUnionStmt &) { Outdent(), Word("END UNION"); } |
| 2419 | void Post(const Map::MapStmt &) { Word("MAP"), Indent(); } |
| 2420 | void Post(const Map::EndMapStmt &) { Outdent(), Word("END MAP"); } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2421 | void Post(const StructureDef::EndStructureStmt &) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2422 | Outdent(), Word("END STRUCTURE"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2423 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2424 | void Unparse(const OldParameterStmt &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2425 | Word("PARAMETER "), Walk(x.v, ", "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2426 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2427 | void Unparse(const ArithmeticIfStmt &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2428 | Word("IF ("), Walk(std::get<Expr>(x.t)), Put(") "); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2429 | Walk(std::get<1>(x.t)), Put(", "); |
| 2430 | Walk(std::get<2>(x.t)), Put(", "); |
| 2431 | Walk(std::get<3>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2432 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2433 | void Unparse(const AssignStmt &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2434 | Word("ASSIGN "), Walk(std::get<Label>(x.t)); |
| 2435 | Word(" TO "), Walk(std::get<Name>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2436 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2437 | void Unparse(const AssignedGotoStmt &x) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2438 | Word("GO TO "), Walk(std::get<Name>(x.t)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2439 | Walk(", (", std::get<std::list<Label>>(x.t), ", ", ")"); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2440 | } |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2441 | void Unparse(const PauseStmt &x) { Word("PAUSE"), Walk(" ", x.v); } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2442 | |
Tim Keith | 9f75566 | 2018-03-23 21:31:14 | [diff] [blame] | 2443 | #define WALK_NESTED_ENUM(CLASS, ENUM) \ |
peter klausler | 8ea4a0a | 2018-04-06 20:13:20 | [diff] [blame] | 2444 | void Unparse(const CLASS::ENUM &x) { Word(CLASS::EnumToString(x)); } |
Tim Keith | 9f75566 | 2018-03-23 21:31:14 | [diff] [blame] | 2445 | WALK_NESTED_ENUM(AccessSpec, Kind) // R807 |
Tim Keith | 9037307 | 2018-09-05 23:02:41 | [diff] [blame] | 2446 | WALK_NESTED_ENUM(common, TypeParamAttr) // R734 |
Tim Keith | 9f75566 | 2018-03-23 21:31:14 | [diff] [blame] | 2447 | WALK_NESTED_ENUM(IntentSpec, Intent) // R826 |
| 2448 | WALK_NESTED_ENUM(ImplicitStmt, ImplicitNoneNameSpec) // R866 |
| 2449 | WALK_NESTED_ENUM(ConnectSpec::CharExpr, Kind) // R1205 |
| 2450 | WALK_NESTED_ENUM(IoControlSpec::CharExpr, Kind) |
| 2451 | WALK_NESTED_ENUM(InquireSpec::CharVar, Kind) |
| 2452 | WALK_NESTED_ENUM(InquireSpec::IntVar, Kind) |
| 2453 | WALK_NESTED_ENUM(InquireSpec::LogVar, Kind) |
| 2454 | WALK_NESTED_ENUM(ProcedureStmt, Kind) // R1506 |
| 2455 | WALK_NESTED_ENUM(UseStmt, ModuleNature) // R1410 |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2456 | WALK_NESTED_ENUM(OmpProcBindClause, Type) // OMP PROC_BIND |
| 2457 | WALK_NESTED_ENUM(OmpDefaultClause, Type) // OMP DEFAULT |
| 2458 | WALK_NESTED_ENUM(OmpScheduleModifierType, ModType) // OMP schedule-modifier |
| 2459 | WALK_NESTED_ENUM(OmpLinearModifier, Type) // OMP linear-modifier |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2460 | WALK_NESTED_ENUM(OmpDependenceType, Type) // OMP dependence-type |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2461 | WALK_NESTED_ENUM(OmpMapType, Type) // OMP map-type |
Hongyon Suauthai | 1bfb843 | 2018-06-01 17:40:13 | [diff] [blame] | 2462 | WALK_NESTED_ENUM(OmpScheduleClause, ScheduleType) // OMP schedule-type |
Hongyon Suauthai | 9914f22 | 2018-06-01 18:15:32 | [diff] [blame] | 2463 | WALK_NESTED_ENUM( |
| 2464 | OmpIfClause, DirectiveNameModifier) // OMP directive-modifier |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2465 | WALK_NESTED_ENUM(OmpDeclareTargetMapType, Type) // OMP DeclareTarget map-type |
| 2466 | WALK_NESTED_ENUM(OmpCancelType, Type) // OMP cancel-type |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2467 | #undef WALK_NESTED_ENUM |
| 2468 | |
| 2469 | void Done() const { CHECK(indent_ == 0); } |
| 2470 | |
| 2471 | private: |
| 2472 | void Put(char); |
| 2473 | void Put(const char *); |
| 2474 | void Put(const std::string &); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2475 | void PutKeywordLetter(char); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2476 | void Word(const char *); |
Tim Keith | 9f75566 | 2018-03-23 21:31:14 | [diff] [blame] | 2477 | void Word(const std::string &); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2478 | void Indent() { indent_ += indentationAmount_; } |
| 2479 | void Outdent() { |
| 2480 | CHECK(indent_ >= indentationAmount_); |
| 2481 | indent_ -= indentationAmount_; |
| 2482 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2483 | void BeginOpenMP() { openmpDirective_ = true; } |
| 2484 | void EndOpenMP() { openmpDirective_ = false; } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2485 | |
| 2486 | // Call back to the traversal framework. |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 2487 | template<typename T> void Walk(const T &x) { |
| 2488 | Fortran::parser::Walk(x, *this); |
| 2489 | } |
| 2490 | |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2491 | // Traverse a std::optional<> value. Emit a prefix and/or a suffix string |
| 2492 | // only when it contains a value. |
| 2493 | template<typename A> |
| 2494 | void Walk( |
| 2495 | const char *prefix, const std::optional<A> &x, const char *suffix = "") { |
| 2496 | if (x.has_value()) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2497 | Word(prefix), Walk(*x), Word(suffix); |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 2498 | } |
| 2499 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2500 | template<typename A> |
| 2501 | void Walk(const std::optional<A> &x, const char *suffix = "") { |
| 2502 | return Walk("", x, suffix); |
| 2503 | } |
| 2504 | |
| 2505 | // Traverse a std::list<>. Separate the elements with an optional string. |
| 2506 | // Emit a prefix and/or a suffix string only when the list is not empty. |
| 2507 | template<typename A> |
| 2508 | void Walk(const char *prefix, const std::list<A> &list, |
| 2509 | const char *comma = ", ", const char *suffix = "") { |
| 2510 | if (!list.empty()) { |
| 2511 | const char *str{prefix}; |
| 2512 | for (const auto &x : list) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2513 | Word(str), Walk(x); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2514 | str = comma; |
| 2515 | } |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2516 | Word(suffix); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2517 | } |
| 2518 | } |
| 2519 | template<typename A> |
| 2520 | void Walk(const std::list<A> &list, const char *comma = ", ", |
| 2521 | const char *suffix = "") { |
| 2522 | return Walk("", list, comma, suffix); |
| 2523 | } |
| 2524 | |
| 2525 | // Traverse a std::tuple<>, with an optional separator. |
peter klausler | 424ec7b | 2018-03-20 17:59:07 | [diff] [blame] | 2526 | template<std::size_t J = 0, typename T> |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2527 | void WalkTupleElements(const T &tuple, const char *separator) { |
| 2528 | if constexpr (J < std::tuple_size_v<T>) { |
| 2529 | if (J > 0) { |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2530 | Word(separator); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2531 | } |
| 2532 | Walk(std::get<J>(tuple)); |
| 2533 | WalkTupleElements<J + 1>(tuple, separator); |
| 2534 | } |
| 2535 | } |
| 2536 | template<typename... A> |
| 2537 | void Walk(const std::tuple<A...> &tuple, const char *separator = "") { |
| 2538 | WalkTupleElements(tuple, separator); |
| 2539 | } |
| 2540 | |
peter klausler | 41d9cfd | 2018-04-03 17:29:04 | [diff] [blame] | 2541 | void EndSubprogram(const char *kind, const std::optional<Name> &name) { |
| 2542 | Outdent(), Word("END "), Word(kind), Walk(" ", name); |
| 2543 | structureComponents_.clear(); |
| 2544 | } |
peter klausler | 4e354d8 | 2018-03-30 22:23:37 | [diff] [blame] | 2545 | |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2546 | std::ostream &out_; |
| 2547 | int indent_{0}; |
| 2548 | const int indentationAmount_{1}; |
| 2549 | int column_{1}; |
| 2550 | const int maxColumns_{80}; |
peter klausler | 4e354d8 | 2018-03-30 22:23:37 | [diff] [blame] | 2551 | std::set<CharBlock> structureComponents_; |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2552 | Encoding encoding_{Encoding::UTF8}; |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2553 | bool capitalizeKeywords_{true}; |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2554 | bool openmpDirective_{false}; |
peter klausler | 888786b | 2018-07-19 22:35:55 | [diff] [blame] | 2555 | bool backslashEscapes_{false}; |
Tim Keith | 89840b5 | 2018-06-26 22:01:42 | [diff] [blame] | 2556 | preStatementType *preStatement_{nullptr}; |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 2557 | }; |
| 2558 | |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2559 | void UnparseVisitor::Put(char ch) { |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2560 | int sav = indent_; |
| 2561 | if (openmpDirective_) { |
| 2562 | indent_ = 0; |
| 2563 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2564 | if (column_ <= 1) { |
| 2565 | if (ch == '\n') { |
| 2566 | return; |
| 2567 | } |
| 2568 | for (int j{0}; j < indent_; ++j) { |
| 2569 | out_ << ' '; |
| 2570 | } |
| 2571 | column_ = indent_ + 2; |
| 2572 | } else if (ch == '\n') { |
| 2573 | column_ = 1; |
| 2574 | } else if (++column_ >= maxColumns_) { |
| 2575 | out_ << "&\n"; |
| 2576 | for (int j{0}; j < indent_; ++j) { |
| 2577 | out_ << ' '; |
| 2578 | } |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2579 | if (openmpDirective_) { |
| 2580 | out_ << "!$OMP&"; |
| 2581 | column_ = 8; |
| 2582 | } else { |
| 2583 | out_ << '&'; |
| 2584 | column_ = indent_ + 3; |
| 2585 | } |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2586 | } |
| 2587 | out_ << ch; |
hsuauthai | 08b2684 | 2018-07-20 22:49:19 | [diff] [blame] | 2588 | if (openmpDirective_) { |
| 2589 | indent_ = sav; |
| 2590 | } |
Tim Keith | 2af29bc | 2018-02-26 22:28:32 | [diff] [blame] | 2591 | } |
| 2592 | |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2593 | void UnparseVisitor::Put(const char *str) { |
| 2594 | for (; *str != '\0'; ++str) { |
| 2595 | Put(*str); |
| 2596 | } |
| 2597 | } |
| 2598 | |
| 2599 | void UnparseVisitor::Put(const std::string &str) { |
| 2600 | for (char ch : str) { |
| 2601 | Put(ch); |
| 2602 | } |
| 2603 | } |
| 2604 | |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2605 | void UnparseVisitor::PutKeywordLetter(char ch) { |
| 2606 | if (capitalizeKeywords_) { |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2607 | Put(ToUpperCaseLetter(ch)); |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2608 | } else { |
| 2609 | Put(ToLowerCaseLetter(ch)); |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2610 | } |
| 2611 | } |
| 2612 | |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2613 | void UnparseVisitor::Word(const char *str) { |
| 2614 | for (; *str != '\0'; ++str) { |
| 2615 | PutKeywordLetter(*str); |
| 2616 | } |
| 2617 | } |
| 2618 | |
peter klausler | 75b2933 | 2018-03-23 22:14:52 | [diff] [blame] | 2619 | void UnparseVisitor::Word(const std::string &str) { Word(str.c_str()); } |
Tim Keith | 9f75566 | 2018-03-23 21:31:14 | [diff] [blame] | 2620 | |
peter klausler | b7cf512 | 2018-03-14 22:31:16 | [diff] [blame] | 2621 | void Unparse(std::ostream &out, const Program &program, Encoding encoding, |
peter klausler | 888786b | 2018-07-19 22:35:55 | [diff] [blame] | 2622 | bool capitalizeKeywords, bool backslashEscapes, |
| 2623 | preStatementType *preStatement) { |
| 2624 | UnparseVisitor visitor{ |
| 2625 | out, 1, encoding, capitalizeKeywords, backslashEscapes, preStatement}; |
peter klausler | 79d044e | 2018-03-01 00:56:10 | [diff] [blame] | 2626 | Walk(program, visitor); |
| 2627 | visitor.Done(); |
| 2628 | } |
Jean Perier | f7e7cb3 | 2018-10-25 12:55:23 | [diff] [blame] | 2629 | } |