Init
This commit is contained in:
166
cppdraft/lex/ext.md
Normal file
166
cppdraft/lex/ext.md
Normal file
@@ -0,0 +1,166 @@
|
||||
[lex.ext]
|
||||
|
||||
# 5 Lexical conventions [[lex]](./#lex)
|
||||
|
||||
## 5.13 Literals [[lex.literal]](lex.literal#lex.ext)
|
||||
|
||||
### 5.13.9 User-defined literals [lex.ext]
|
||||
|
||||
[user-defined-literal:](#nt:user-defined-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*user-defined-integer-literal*](#nt:user-defined-integer-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*user-defined-floating-point-literal*](#nt:user-defined-floating-point-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*user-defined-string-literal*](#nt:user-defined-string-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*user-defined-character-literal*](#nt:user-defined-character-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
|
||||
[user-defined-integer-literal:](#nt:user-defined-integer-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*decimal-literal*](lex.icon#nt:decimal-literal "5.13.2 Integer literals [lex.icon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*octal-literal*](lex.icon#nt:octal-literal "5.13.2 Integer literals [lex.icon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*hexadecimal-literal*](lex.icon#nt:hexadecimal-literal "5.13.2 Integer literals [lex.icon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*binary-literal*](lex.icon#nt:binary-literal "5.13.2 Integer literals [lex.icon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
|
||||
[user-defined-floating-point-literal:](#nt:user-defined-floating-point-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*fractional-constant*](lex.fcon#nt:fractional-constant "5.13.4 Floating-point literals [lex.fcon]") [*exponent-part*](lex.fcon#nt:exponent-part "5.13.4 Floating-point literals [lex.fcon]")opt [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*digit-sequence*](lex.fcon#nt:digit-sequence "5.13.4 Floating-point literals [lex.fcon]") [*exponent-part*](lex.fcon#nt:exponent-part "5.13.4 Floating-point literals [lex.fcon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*hexadecimal-prefix*](lex.icon#nt:hexadecimal-prefix "5.13.2 Integer literals [lex.icon]") [*hexadecimal-fractional-constant*](lex.fcon#nt:hexadecimal-fractional-constant "5.13.4 Floating-point literals [lex.fcon]") [*binary-exponent-part*](lex.fcon#nt:binary-exponent-part "5.13.4 Floating-point literals [lex.fcon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*hexadecimal-prefix*](lex.icon#nt:hexadecimal-prefix "5.13.2 Integer literals [lex.icon]") [*hexadecimal-digit-sequence*](lex.icon#nt:hexadecimal-digit-sequence "5.13.2 Integer literals [lex.icon]") [*binary-exponent-part*](lex.fcon#nt:binary-exponent-part "5.13.4 Floating-point literals [lex.fcon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
|
||||
[user-defined-string-literal:](#nt:user-defined-string-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
|
||||
[user-defined-character-literal:](#nt:user-defined-character-literal "5.13.9 User-defined literals [lex.ext]")
|
||||
[*character-literal*](lex.ccon#nt:character-literal "5.13.3 Character literals [lex.ccon]") [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
|
||||
[ud-suffix:](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")
|
||||
[*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]")
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2203)
|
||||
|
||||
If a token matches both [*user-defined-literal*](#nt:user-defined-literal "5.13.9 User-defined literals [lex.ext]") and another [*literal*](lex.literal.kinds#nt:literal "5.13.1 Kinds of literals [lex.literal.kinds]") kind, it
|
||||
is treated as the latter[.](#1.sentence-1)
|
||||
|
||||
[*Example [1](#example-1)*:
|
||||
|
||||
123_km is a [*user-defined-literal*](#nt:user-defined-literal "5.13.9 User-defined literals [lex.ext]"), but 12LL is an[*integer-literal*](lex.icon#nt:integer-literal "5.13.2 Integer literals [lex.icon]")[.](#1.sentence-2)
|
||||
|
||||
â *end example*]
|
||||
|
||||
The syntactic non-terminal preceding the [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]") in a[*user-defined-literal*](#nt:user-defined-literal "5.13.9 User-defined literals [lex.ext]") is taken to be the longest sequence of
|
||||
characters that could match that non-terminal[.](#1.sentence-3)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2215)
|
||||
|
||||
A [*user-defined-literal*](#nt:user-defined-literal "5.13.9 User-defined literals [lex.ext]") is treated as a call to a literal operator or
|
||||
literal operator template ([[over.literal]](over.literal "12.6 User-defined literals"))[.](#2.sentence-1)
|
||||
|
||||
To determine the form of this call for
|
||||
a given [*user-defined-literal*](#nt:user-defined-literal "5.13.9 User-defined literals [lex.ext]") *L* with [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]") *X*,
|
||||
first let *S* be the set of declarations
|
||||
found by unqualified lookup for the [*literal-operator-id*](over.literal#nt:literal-operator-id "12.6 User-defined literals [over.literal]") whose literal suffix identifier is *X* ([[basic.lookup.unqual]](basic.lookup.unqual "6.5.3 Unqualified name lookup"))[.](#2.sentence-2)
|
||||
|
||||
*S* shall not be empty[.](#2.sentence-3)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2226)
|
||||
|
||||
If *L* is a [*user-defined-integer-literal*](#nt:user-defined-integer-literal "5.13.9 User-defined literals [lex.ext]"), let *n* be the literal
|
||||
without its [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")[.](#3.sentence-1)
|
||||
|
||||
If *S* contains a literal operator with
|
||||
parameter type unsigned long long, the literal *L* is treated as a call of
|
||||
the formoperator ""*X*(*n*ULL)
|
||||
|
||||
Otherwise, *S* shall contain a raw literal operator
|
||||
or a numeric literal operator template ([[over.literal]](over.literal "12.6 User-defined literals")) but not both[.](#3.sentence-3)
|
||||
|
||||
If *S* contains a raw literal operator,
|
||||
the literal *L* is treated as a call of the formoperator ""*X*("*n*")
|
||||
|
||||
Otherwise (*S* contains a numeric literal operator template),*L* is treated as a call of the formoperator ""*X*<'c1', 'c2', ... 'ck'>() where *n* is the source character sequence c1c2...ck[.](#3.sentence-5)
|
||||
|
||||
[*Note [1](#note-1)*:
|
||||
|
||||
The sequencec1c2...ck can only contain characters from the basic character set[.](#3.sentence-6)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2252)
|
||||
|
||||
If *L* is a [*user-defined-floating-point-literal*](#nt:user-defined-floating-point-literal "5.13.9 User-defined literals [lex.ext]"), let *f* be the
|
||||
literal without its [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")[.](#4.sentence-1)
|
||||
|
||||
If *S* contains a literal operator
|
||||
with parameter type long double, the literal *L* is treated as a call of
|
||||
the formoperator ""*X*(*f*L)
|
||||
|
||||
Otherwise, *S* shall contain a raw literal operator
|
||||
or a numeric literal operator template ([[over.literal]](over.literal "12.6 User-defined literals")) but not both[.](#4.sentence-3)
|
||||
|
||||
If *S* contains a raw literal operator,
|
||||
the [*literal*](lex.literal.kinds#nt:literal "5.13.1 Kinds of literals [lex.literal.kinds]") *L* is treated as a call of the formoperator ""*X*("*f*")
|
||||
|
||||
Otherwise (*S* contains a numeric literal operator template),*L* is treated as a call of the formoperator ""*X*<'c1', 'c2', ... 'ck'>() where *f* is the source character sequence c1c2...ck[.](#4.sentence-5)
|
||||
|
||||
[*Note [2](#note-2)*:
|
||||
|
||||
The sequencec1c2...ck can only contain characters from the basic character set[.](#4.sentence-6)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2278)
|
||||
|
||||
If *L* is a [*user-defined-string-literal*](#nt:user-defined-string-literal "5.13.9 User-defined literals [lex.ext]"),
|
||||
let *str* be the literal without its [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]") and let *len* be the number of code units in *str* (i.e., its length excluding the terminating null character)[.](#5.sentence-1)
|
||||
|
||||
If *S* contains a literal operator template with
|
||||
a constant template parameter for which *str* is
|
||||
a well-formed [*template-argument*](temp.names#nt:template-argument "13.3 Names of template specializations [temp.names]"),
|
||||
the literal *L* is treated as a call of the formoperator ""*X*<*str*>()
|
||||
|
||||
Otherwise, the literal *L* is treated as a call of the formoperator ""*X*(*str*, *len*)
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2295)
|
||||
|
||||
If *L* is a [*user-defined-character-literal*](#nt:user-defined-character-literal "5.13.9 User-defined literals [lex.ext]"), let *ch* be the
|
||||
literal without its [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")[.](#6.sentence-1)
|
||||
|
||||
*S* shall contain a [literal operator](over.literal#def:literal,operator "12.6 User-defined literals [over.literal]") whose only parameter has
|
||||
the type of *ch* and the
|
||||
literal *L* is treated as a call
|
||||
of the formoperator ""*X*(*ch*)
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2306)
|
||||
|
||||
[*Example [2](#example-2)*: long double operator ""_w(long double);
|
||||
std::string operator ""_w(const char16_t*, std::size_t);unsigned operator ""_w(const char*);int main() {1.2_w; // calls operator ""_w(1.2L)u"one"_w; // calls operator ""_w(u"one", 3)12_w; // calls operator ""_w("12")"two"_w; // error: no applicable literal operator} â *end example*]
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2321)
|
||||
|
||||
In translation phase 6 ([[lex.phases]](lex.phases "5.2 Phases of translation")), adjacent [*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]")*s* are concatenated and[*user-defined-string-literal*](#nt:user-defined-string-literal "5.13.9 User-defined literals [lex.ext]")*s* are considered [*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]")*s* for that
|
||||
purpose[.](#8.sentence-1)
|
||||
|
||||
During concatenation, [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")es are removed and ignored and
|
||||
the concatenation process occurs as described in [[lex.string]](lex.string "5.13.5 String literals")[.](#8.sentence-2)
|
||||
|
||||
At the end of phase
|
||||
6, if a [*string-literal*](lex.string#nt:string-literal "5.13.5 String literals [lex.string]") is the result of a concatenation involving at least one[*user-defined-string-literal*](#nt:user-defined-string-literal "5.13.9 User-defined literals [lex.ext]"), all the participating[*user-defined-string-literal*](#nt:user-defined-string-literal "5.13.9 User-defined literals [lex.ext]")*s* shall have the same [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]") and that suffix is applied to the result of the concatenation[.](#8.sentence-3)
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L2331)
|
||||
|
||||
[*Example [3](#example-3)*: int main() {L"A" "B" "C"_x; // OK, same as L"ABC"_x"P"_x "Q" "R"_y; // error: two different [*ud-suffix*](#nt:ud-suffix "5.13.9 User-defined literals [lex.ext]")es} â *end example*]
|
||||
Reference in New Issue
Block a user