R723 char-length -> ( type-param-value ) | digit-string
R724 char-literal-constant ->
[kind-param _] ' [rep-char]... ' | [kind-param _] " [rep-char]... "
-R725 logical-literal-constant -> .TRUE. | .FALSE. @ | .T. | .F.
+R725 logical-literal-constant ->
+ .TRUE. [_ kind-param] | .FALSE. [_ kind-param] @ | .T. | .F.
R726 derived-type-def ->
derived-type-stmt [type-param-def-stmt]... [private-or-sequence]...
[component-part] [type-bound-procedure-part] end-type-stmt
TYPE_CONTEXT_PARSER("Hollerith"_en_US,
construct<HollerithLiteralConstant>{}(rawHollerithLiteral))
-// R725 logical-literal-constant -> .TRUE. | .FALSE.
+// R725 logical-literal-constant ->
+// .TRUE. [_ kind-param] | .FALSE. [_ kind-param]
// Also accept .T. and .F. as extensions.
-TYPE_PARSER(".TRUE." >> construct<LogicalLiteralConstant>{}(pure(true)) ||
- ".FALSE." >> construct<LogicalLiteralConstant>{}(pure(false)) ||
- // PGI/Cray extensions
- extension(".T."_tok >> construct<LogicalLiteralConstant>{}(pure(true))) ||
- extension(".F."_tok >> construct<LogicalLiteralConstant>{}(pure(false))))
+TYPE_PARSER(construct<LogicalLiteralConstant>{}(
+ (".TRUE."_tok || extension(".T."_tok)) >> pure(true),
+ maybe(underscore >> kindParam)) ||
+ construct<LogicalLiteralConstant>{}(
+ (".FALSE."_tok || extension(".F."_tok)) >> pure(false),
+ maybe(underscore >> kindParam)))
// R726 derived-type-def ->
// derived-type-stmt [type-param-def-stmt]...
std::string GetString() const { return v; }
};
-// R725 logical-literal-constant -> .TRUE. | .FALSE.
-WRAPPER_CLASS(LogicalLiteralConstant, bool);
+// R725 logical-literal-constant ->
+// .TRUE. [_ kind-param] | .FALSE. [_ kind-param]
+struct LogicalLiteralConstant {
+ TUPLE_CLASS_BOILERPLATE(LogicalLiteralConstant);
+ std::tuple<bool, std::optional<KindParam>> t;
+};
// R764 boz-literal-constant -> binary-constant | octal-constant | hex-constant
// R765 binary-constant -> B ' digit [digit]... ' | B " digit [digit]... "
return true;
}
bool Pre(const LogicalLiteralConstant &x) { // R725
- Put(x.v ? ".TRUE." : ".FALSE.");
+ Put(std::get<bool>(x.t) ? ".TRUE." : ".FALSE.");
+ Walk("_", std::get<std::optional<KindParam>>(x.t));
return false;
}
bool Pre(const DerivedTypeStmt &x) { // R727
Word("%LOC("), Walk(x.v), Put(')');
return false;
}
- bool Pre(const Expr::DefinedUnary &x) {
- Put('.'), Walk(x.t, ". ");
- return false;
- }
bool Pre(const Expr::Power &x) {
Walk(x.t, "**");
return false;