英語版
このページの英語版を見る

()()

()()解析は構文解析や意味解析とは独立している。 解析とは独立している。()()解析はソーステキストをトークンに分割する。字句解析器は原文をトークンに分割する。 ()()文法はこれらのトークンの構文を記述する。この文法は次のように設計されている。 文法は高速スキャンに適し、正しいスキャナーの実装を容易にするように設計されている。 スキャナーの実装を容易にするように設計されている。この文法には最小限の特殊格ルールがあり、翻訳のフェーズは1つだけである。 段階しかない。

ソーステキスト

SourceFile:
    ByteOrderMark Moduleopt
    Shebang Moduleopt
    Moduleopt
ByteOrderMark:
    \uFEFF
Shebang: #! Charactersopt EndOfShebang
EndOfShebang: \u000A EndOfFile

ソーステキストは以下のいずれかとしてエンコードできる:

以下の UTF BOM(Byte Order Marks)は、ソース・テキストの先頭に存在することができる:

UTF バイトオーダーマーク
FormatBOM
UTF-8EF BB BF
UTF-16BEFE FF
UTF-16LEFF FE
UTF-32BE00 00 FE FF
UTF-32LEFF FE 00 00
ASCIIBOMなし

ソースファイルがBOMで始まらない場合、最初の文字はU+0000007F以下でなければならない。 は U+0000007F 以下でなければならない。

ソース・テキストは、そのソース表現から Unicode にデコードされる。 文字にデコードされる。文字はさらに次のように分けられる:文字はさらに、WhiteSpaceEndOfLineCommentsSpecialTokenSequences、およびTokensに分割され、ソースはEndOfFile で終了する。

ソース・テキストは、maximal munch アルゴリズムを使用してトークンに分割される、 つまり、字句解析器は、可能な限り長いトークンを想定する。すなわち、字句解析器は可能な限り長いトークンを想定する、 >> は、2 つの greater-than トークンではなく、右シフト・トークンである。このルールには2つの例外がある。 このルールには2つの例外がある:

文字セット

Character:
    any Unicode character

ファイルの終了

EndOfFile:
    physical end of the file
    \u0000
    \u001A

ソース・テキストは、どちらが先に来ても終了する。

行末

EndOfLine:
    \u000D
    \u000A
    \u000D \u000A
    \u2028
    \u2029
    EndOfFile

ホワイトスペース

WhiteSpace:
    Space
    Space WhiteSpace
Space: \u0020 \u0009 \u000B \u000C

コメント

Comment:
    BlockComment
    LineComment
    NestingBlockComment
BlockComment: /* Charactersopt */
LineComment: // Charactersopt EndOfLine
NestingBlockComment: /+ NestingBlockCommentCharactersopt +/
NestingBlockCommentCharacters: NestingBlockCommentCharacter NestingBlockCommentCharacter NestingBlockCommentCharacters
NestingBlockCommentCharacter: Character NestingBlockComment
Characters: Character Character Characters

コメントには3種類ある:

  1. ブロックコメントは複数行にまたがることができるが、入れ子にすることはできない。
  2. 行コメントは行末で終わる。
  3. ブロック・コメントは複数行にまたがり、入れ子にすることができる。

文字列とコメントの内容はトークン化されない。 その結果 文字列内のコメントの開始はコメントを開始しない。 コメント内の文字列区切り記号は、コメントの区切り記号の認識に影響しない。 また、コメント内の文字列区切り記号は、コメントの終了や、ネストされた/+ コメントの開始の認識には影響しない。 ただし /+/+ コメント内で発生したものを除き、コメント内のコメント・オープニングは無視される。 コメントは無視される。

a = /+ // +/ 1;    // 'a = 1;'のように解析される
a = /+ "+/" +/ 1"; // 'a = " +/ 1";'のように解析される
a = /+ /* +/ */ 3; // 'a = */ 3;'のように解析される

コメントをトークン連結子として使用することはできない、abc/**/def は2つのトークン、abcdef であり、1つのabcdef トークンではない。

トークン

Tokens:
    Token
    Token Tokens
Token: { } TokenNoBraces
TokenNoBraces: Identifier StringLiteral InterpolationExpressionSequence CharacterLiteral IntegerLiteral FloatLiteral Keyword / /= . .. ... & &= && | |= || - -= -- + += ++ < <= << <<= > >= >>= >>>= >> >>> ! != ( ) [ ] ? , ; : $ = == * *= % %= ^ ^= ^^ ^^= ~ ~= @ =>

識別子

Identifier:
    IdentifierStart
    IdentifierStart IdentifierChars
IdentifierChars: IdentifierChar IdentifierChar IdentifierChars
IdentifierStart: _ Letter UniversalAlpha
IdentifierChar: IdentifierStart 0 NonZeroDigit

識別子は文字、_ 、またはユニバーサル・アルファで始まり、その後に任意の数の文字、 、数字、またはユニバーサル・アルファが続く。 の後に、任意の数の文字、_ 、数字、またはユニバーサルアルファが続く。 ユニバーサルアルファは、C99規格のISO/IEC 9899:1999(E)付録Dで定義されている通りである。 識別子は任意に長くすることができ、大文字と小文字を区別する。

実装定義: __ (アンダースコア2つ)で始まる識別子は予約されている。

文字列リテラル

StringLiteral:
    WysiwygString
    AlternateWysiwygString
    DoubleQuotedString
    DelimitedString
    TokenString
    HexString

文字列リテラルは、wysiwyg引用符で囲んだ文字列、二重引用符で囲んだ文字列、区切り文字列、区切り文字列、区切り文字列のいずれかである。 文字列、区切り文字列、トークン文字列、16進文字列のいずれかである。

すべての文字列リテラル形式において、EndOfLineは1文字とみなされる。 \n 文字とみなされる。

Wysiwyg文字列

WysiwygString:
    r" WysiwygCharactersopt " StringPostfixopt
AlternateWysiwygString: ` WysiwygCharactersopt ` StringPostfixopt
WysiwygCharacters: WysiwygCharacter WysiwygCharacter WysiwygCharacters
WysiwygCharacter: Character EndOfLine

Wysiwyg("見たままが得られる")引用符付き文字列は、次の2つの構文のどちらかを使って定義できる。 を定義することができる。

最初の形式では、r"" で囲まれる。 の間にあるすべての文字は r"" の間の文字はすべて文字列の一部となる。 wysiwyg文字列内にはエスケープシーケンスはない。

r"I am Oz"
r"c:\games\Sudoku.exe"
r"ab\n" // 文字列は4文字である、
        // 'a', 'b', '\', 'n'

あるいは、wysiwyg文字列をバッククォートで囲むこともできる、 文字で囲むこともできる。

`the Great and Powerful.`
`c:\games\Empire.exe`
`The "lazy" dog`
`a"b\n`  // 文字列は5文字である、
         // 'a', '"', 'b', '\', 'n'

InterpolatedWysiwygLiteralも参照のこと。

二重引用符で囲まれた文字列

DoubleQuotedString:
    " DoubleQuotedCharactersopt " StringPostfixopt
DoubleQuotedCharacters: DoubleQuotedCharacter DoubleQuotedCharacter DoubleQuotedCharacters
DoubleQuotedCharacter: Character EscapeSequence EndOfLine

二重引用符で囲まれた文字列は "" で囲まれる。エスケープシーケンスは を埋め込むことができる。

"Who are you?"
"c:\\games\\Doom.exe"
"ab\n"   // 文字列は3文字である、
         // 'a', 'b', and a linefeed
"ab
"        // 文字列は3文字である、
         // 'a', 'b', and a linefeed

InterpolatedDoubleQuotedLiteralも参照のこと。

区切り文字列

DelimitedString:
    q" Delimiter WysiwygCharactersopt MatchingDelimiter " StringPostfixopt
    q"( ParenDelimitedCharactersopt )" StringPostfixopt
    q"[ BracketDelimitedCharactersopt ]" StringPostfixopt
    q"{ BraceDelimitedCharactersopt }" StringPostfixopt
    q"< AngleDelimitedCharactersopt >" StringPostfixopt
Delimiter: Identifier
MatchingDelimiter: Identifier
ParenDelimitedCharacters: WysiwygCharacter WysiwygCharacter ParenDelimitedCharacters ( ParenDelimitedCharactersopt )
BracketDelimitedCharacters: WysiwygCharacter WysiwygCharacter BracketDelimitedCharacters [ BracketDelimitedCharactersopt ]
BraceDelimitedCharacters: WysiwygCharacter WysiwygCharacter BraceDelimitedCharacters { BraceDelimitedCharactersopt }
AngleDelimitedCharacters: WysiwygCharacter WysiwygCharacter AngleDelimitedCharacters < AngleDelimitedCharactersopt >

区切り文字列は、さまざまな形式の区切り文字を使用する。 区切り文字は、文字でも識別子でもよい、 の直後でなければならない。 終端デリミタは、終端の" の直前になければならない。 デリミタは入れ子になり、次のいずれかの文字である。 以下の文字のいずれかである:

入れ子の区切り文字
DelimiterMatching Delimiter
[]
()
<>
{}
q"(foo(xxx))"   // "foo(xxx)"
q"[foo{]"       // "foo{"

区切り文字が識別子の場合、識別子の直後に改行がなければならない。 の直後に改行がなければならない。 区切り文字が識別子の場合、識別子の直後に改行がなければならない。 でなければならない:

writeln(q"EOS
This
is a multi-line
heredoc string
EOS"
);

行頭の識別子に続く改行は、文字列の一部ではない。 行頭の識別子に続く改行は文字列の一部ではないが、行末の識別子に続く改行は文字列の一部である。 の前の最後の改行は文字列の一部となる。終了識別子 は、その行の左端に置かなければならない。

それ以外の場合、マッチする区切り文字は と同じである:

q"/foo]/"          // "foo]"
// q"/abc/def/"    // エラー

トークン文字列

TokenString:
    q{ TokenStringTokensopt } StringPostfixopt
TokenStringTokens: TokenStringToken TokenStringToken TokenStringTokens
TokenStringToken: TokenNoBraces { TokenStringTokensopt }

トークン文字列は、q{ という文字で始まり、 というトークンで閉じる。 } で閉じる。その間に有効なDトークンがなければならない。 {} のトークンは入れ子になる。 文字列は、トークン文字列の先頭と末尾の間のすべての文字で形成される。 の間にあるすべての文字で形成される。

q{this is the voice of} // "this is the voice of"
q{/*}*/ }               // "/*}*/ "
q{ world(q{control}); } // " world(q{control}); "
q{ __TIME__ }           // " __TIME__ "
                        // つまり、時刻に置き換えられない
// q{ __EOF__ }         // エラー
                        // __EOF__はトークンではなく、ファイルの終わりである

InterpolatedTokenLiteralも参照のこと。

16進文字列

HexString:
    x" HexStringCharsopt " StringPostfixopt
HexStringChars: HexStringChar HexStringChar HexStringChars
HexStringChar: HexDigit WhiteSpace EndOfLine

16進文字列では、16進データを使用して文字列リテラルを作成できる。 16進データは有効なUTF文字を形成する必要はない。

x"0A"              // "\x0A"と同じ
x"00 FBCD 32FD 0A" // "\x00\xFB\xCD\x32\xFD\x0A"と同じ

空白文字や改行文字は無視されるので、16進データは簡単にフォーマットできる。 フォーマットできる。16進数の文字数は2の倍数でなければならない。

文字列の接尾辞

StringPostfix:
    c
    w
    d

オプションのStringPostfix文字は、文字列から推測されるのではなく、文字列に特定の型を与える。 を与える。 ポストフィックス文字に対応する型は以下のとおりである:

文字列リテラルのポストフィックス文字
PostfixTypeAlias
cimmutable(char)[]string
wimmutable(wchar)[]wstring
dimmutable(dchar)[]dstring
"hello"c  // string
"hello"w  // wstring
"hello"d  // d文字列

文字列リテラルはUTF-8の文字配列として組み立てられる、 そして が適用され、必要に応じてwcharまたはdcharに変換される。

エスケープシーケンス

EscapeSequence:
    \'
    \"
    \?
    \\
    \0
    \a
    \b
    \f
    \n
    \r
    \t
    \v
    \x HexDigit HexDigit
    \ OctalDigit
    \ OctalDigit OctalDigit
    \ OctalDigit OctalDigit OctalDigit
    \u HexDigit HexDigit HexDigit HexDigit
    \U HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit
    \ NamedCharacterEntity
OctalDigit: 0 1 2 3 4 5 6 7
エスケープシーケンス
SequenceMeaning
\'リテラル・シングルクォート'
\"リテラルダブルクオート"
\?リテラルクエスチョンマーク?
\\リテラルバックスラッシュ\
\0バイナリゼロ(NUL、U+0000)。
\aBEL(アラーム)文字(U+0007)。
\bバックスペース(U+0008)。
\fフォームフィード(FF)(U+000C)。
\n行末文字(U+000A)。
\rキャリッジリターン(U+000D)。
\t水平タブ(U+0009)。
\v垂直タブ(U+000B)。
\xnnnnは16進数2桁で指定する。 は2桁の16進数で指定する。
例:" を表す:\xFF は値255の文字を表す。
以下も参照のこと: std.conv.hexString.
\n
\nn
\nnn
バイト値を8進数で表す。 8進数で表す。
例:\101 は値 65 の文字を表す。 65 ('A') を表す。16進文字に類似している、 最大のバイト値は\377 (=\xFF in hexadecimal or in decimal)である。 または10進数で255 )
こちらも参照のこと: std.conv.octal.
\unnnnUnicode文字U+nnnn, ここで nnnnは4桁の16進数である。
例:" を表す、 \u03B3 はUnicode文字γ(U+03B3 - GREEK SMALL LETTER GAMMA)を表す。
\UnnnnnnUnicode文字U+nnnnnnを表す、 ここでnnnnnnは 8 桁の 16 進数である。
例:" を表す、 \U0001F603 は Unicode キ ャ ラ ク タ U+1F603 (口をあけた笑い顔 を表す。)
\名前HTML5仕様の名前付き文字エンティティ。 仕様からの名前付き文字実体。
これらの名前は& で始まり; で終わる、例えば&euro;NamedCharacterEntity を参照のこと。

文字リテラル

CharacterLiteral:
    ' SingleQuotedCharacter '
SingleQuotedCharacter: Character EscapeSequence

文字リテラルは、単一引用符で囲まれた1文字またはエスケープシーケンスである。 で囲まれた1文字またはエスケープシーケンスである。

'h'   // 文字h
'\n'  // 改行
'\\'  // バックスラッシュ文字

文字リテラルは charwchar 、またはdchar (のいずれかに解決される("基本データ型"参照)。

それ以外の場合は、それが収まる最小サイズの型に解決される。 に解決される。

整数リテラル

IntegerLiteral:
    Integer
    Integer IntegerSuffix
Integer: DecimalInteger BinaryInteger HexadecimalInteger
IntegerSuffix: L u U Lu LU uL UL
DecimalInteger:
    0 Underscoresopt
    NonZeroDigit
    NonZeroDigit DecimalDigitsUS
Underscores: _ Underscores _
NonZeroDigit: 1 2 3 4 5 6 7 8 9
DecimalDigits: DecimalDigit DecimalDigit DecimalDigits
DecimalDigitsUS: DecimalDigitUS DecimalDigitUS DecimalDigitsUS
DecimalDigitsNoSingleUS: DecimalDigitsUSopt DecimalDigit DecimalDigitsUSopt
DecimalDigitsNoStartingUS: DecimalDigit DecimalDigit DecimalDigitsUS
DecimalDigit: 0 NonZeroDigit
DecimalDigitUS: DecimalDigit _
BinaryInteger:
    BinPrefix BinaryDigitsNoSingleUS
BinPrefix: 0b 0B
BinaryDigitsNoSingleUS: BinaryDigitsUSopt BinaryDigit BinaryDigitsUSopt
BinaryDigitsUS: BinaryDigitUS BinaryDigitUS BinaryDigitsUS
BinaryDigit: 0 1
BinaryDigitUS: BinaryDigit _
HexadecimalInteger:
    HexPrefix HexDigitsNoSingleUS
HexDigits: HexDigit HexDigit HexDigits
HexDigitsUS: HexDigitUS HexDigitUS HexDigitsUS
HexDigitsNoSingleUS: HexDigitsUSopt HexDigit HexDigitsUSopt
HexDigitsNoStartingUS: HexDigit HexDigit HexDigitsUS
HexDigit: DecimalDigit HexLetter
HexDigitUS: HexDigit _
HexLetter: a b c d e f A B C D E F

整数は10進数、2進数、16進数で指定できる。

10      // 10進数
0b1010  // binary
0xA     // hex

整数は、読みやすさを向上させるために桁の後に'_'文字を埋め込むことができるが、これは無視される。

20_000        // 海底のリーグ
867_5309      // 壁の数字
1_522_000     // F1エンジンの推力(海面レベル)
0xBAAD_F00D   // デバッグ用のマジックナンバー

整数の直後に'L'または'u'または'U'のいずれかが続くことがある。 'u'または'U'のいずれか、あるいは両方が続く。 l'接尾辞はないことに注意。

整数の型は以下のように解決される:

10進リテラル型
LiteralType
通常の10進表記法
0 .. 2_147_483_647int
2_147_483_648 .. 9_223_372_036_854_775_807long
9_223_372_036_854_775_808 .. 18_446_744_073_709_551_615ulong
明示的接尾辞
0L .. 9_223_372_036_854_775_807Llong
0U .. 4_294_967_295Uuint
4_294_967_296U .. 18_446_744_073_709_551_615Uulong
0UL .. 18_446_744_073_709_551_615ULulong
16進表記法
0x0 .. 0x7FFF_FFFFint
0x8000_0000 .. 0xFFFF_FFFFuint
0x1_0000_0000 .. 0x7FFF_FFFF_FFFF_FFFFlong
0x8000_0000_0000_0000 .. 0xFFFF_FFFF_FFFF_FFFFulong
明示的接尾辞付き16進表記法
0x0L .. 0x7FFF_FFFF_FFFF_FFFFLlong
0x8000_0000_0000_0000L .. 0xFFFF_FFFF_FFFF_FFFFLulong
0x0U .. 0xFFFF_FFFFUuint
0x1_0000_0000U .. 0xFFFF_FFFF_FFFF_FFFFUulong
0x0UL .. 0xFFFF_FFFF_FFFF_FFFFULulong

整数リテラルはこれらの値を超えてはならない。

ベストプラクティス: 整数リテラルでは8進数表記はサポートされていない。 しかし、8進整数リテラルはコンパイル時に テンプレートで解釈することができる。 std.conv.octaloctal!167テンプレートで解釈することができる。

浮動小数点リテラル

FloatLiteral:
    Float Suffixopt
    Integer FloatSuffix ImaginarySuffixopt
    Integer RealSuffixopt ImaginarySuffix
Float: DecimalFloat HexFloat
DecimalFloat: LeadingDecimal . DecimalDigitsNoStartingUSopt LeadingDecimal . DecimalDigitsNoStartingUS DecimalExponent . DecimalDigitsNoStartingUS DecimalExponentopt LeadingDecimal DecimalExponent
DecimalExponent: DecimalExponentStart DecimalDigitsNoSingleUS
DecimalExponentStart: e E e+ E+ e- E-
HexFloat: HexPrefix HexDigitsNoSingleUS . HexDigitsNoStartingUS HexExponent HexPrefix . HexDigitsNoStartingUS HexExponent HexPrefix HexDigitsNoSingleUS HexExponent
HexPrefix: 0x 0X
HexExponent: HexExponentStart DecimalDigitsNoSingleUS
HexExponentStart: p P p+ P+ p- P-
Suffix: FloatSuffix ImaginarySuffixopt RealSuffix ImaginarySuffixopt ImaginarySuffix
FloatSuffix: f F
RealSuffix: L
ImaginarySuffix: i
LeadingDecimal: DecimalInteger 0 DecimalDigitsNoSingleUS

浮動小数点は10進数または16進数形式である。 少なくとも1つの桁と小数点、指数、または FloatSuffix のいずれかでなければならない。

10進数の浮動小数点は、e またはE のような指数を持つことができる。 である10進数が10の指数となる。

-1.0
1e2               // 100.0
1e-2              // 0.01
-1.175494351e-38F // float.min

16進数の浮動小数点は、0x または0X が先行し、指数は または である。 16進数の浮動小数点は、p またはP の後に指数2として機能する10進数が続く。 指数2である。

0xAp0                  // 10.0
0x1p2                  // 4.0
0x1.FFFFFFFFFFFFFp1023 // double.max
0x1p-52                // double.epsilon

浮動小数点リテラルは、可読性を高めるために、桁の後に_ 文字を埋め込むことができる。 を埋め込むことができるが、これは無視される。

2.645_751
6.022140857E+23
6_022.140857E+20
6_022_.140_857E+20_
0.0                    // double
0F                     // float
0.0L                   // real

リテラルは型の範囲を超えてはならない。 リテラルは、その型の有効桁数に収まるように丸められる。 型の有効桁に収まるように丸められる。

浮動小数点リテラルが. と "型"の接尾辞を持つ場合、少なくとも1桁はその中間になければならない。 桁が間になければならない:

1f;  // OK、float
1.f; // エラー
1.;  // OK、double
注釈:浮動小数点リテラルに虚数浮動小数点値を表すi を付けることは、廃止された。 に続く浮動小数点リテラルは非推奨となった。

キーワード

キーワードは予約された識別子である。

Keyword:
    abstract
    alias
    align
    asm
    assert
    auto
body bool break byte
case cast catch cdouble cent cfloat char class const continue creal
dchar debug default delegate delete deprecated do double
else enum export extern
false final finally float for foreach foreach_reverse function
goto
idouble if ifloat immutable import in inout int interface invariant ireal is
lazy long
macro mixin module
new nothrow null
out override
package pragma private protected public pure
real ref return
scope shared short static struct super switch synchronized
template this throw true try typeid typeof
ubyte ucent uint ulong union unittest ushort
version void
wchar while with
__FILE__ __FILE_FULL_PATH__ __MODULE__ __LINE__ __FUNCTION__ __PRETTY_FUNCTION__
__gshared __traits __vector __parameters

特殊トークン

これらのトークンは、以下の表に従って他のトークンに置き換えられる。 表を参照のこと:

特殊トークン
Special TokenReplaced with
__DATE__編集日時の文字列リテラル"mmm dd yyyy"
__EOF__このトークンの後のすべてを無視するようにスキャナに指示する。
__TIME__コンパイル時刻"hh:mm:ss"の文字列リテラル
__TIMESTAMP__コンパイル日時を表す文字列リテラル"www mmm dd hh:mm:ss yyyy"
__VENDOR__コンパイラー・ベンダーの文字列
__VERSION__整数としてのコンパイラのバージョン
実装定義: __VENDOR__ の置換文字列リテラルと、__VERSION__ の置換整数値。

特殊トークン列

SpecialTokenSequence:
    # line IntegerLiteral Filespecopt EndOfLine
    # line __LINE__ Filespecopt EndOfLine
Filespec:
    " DoubleQuotedCharactersopt "

特殊トークン列は字句解析器によって処理される。 構文解析には影響しない。 構文解析には影響しない。

特殊トークン列は、最初の トークンに続く最初の改行で終了する。 # で終了する。

現在のところ、特殊トークン・シーケンスは#line の1つだけである。

これは、次のソース行の行番号をIntegerLiteral、 に設定し、オプションで現在のソース・ファイル名をFilespec に設定する、 に設定する。

例:":

int #line 6 "pkg/mod.d"
x;  // これはpkg/mod.dファイルの6行目である
実装定義: ソース・ファイルと行番号は通常、エラー・メッセージを表示するために使われる。 また、生成されたコードをシンボリック・デバッグ出力のためにソースにマッピングするためにも使われる。 デバッグ出力に使われる。