語彙
語彙解析は構文解析や意味解析とは独立している。 解析とは独立している。語彙解析はソーステキストをトークンに分割する。字句解析器は原文をトークンに分割する。 語彙文法はこれらのトークンの構文を記述する。この文法は次のように設計されている。 文法は高速スキャンに適し、正しいスキャナーの実装を容易にするように設計されている。 スキャナーの実装を容易にするように設計されている。この文法には最小限の特殊格ルールがあり、翻訳のフェーズは1つだけである。 段階しかない。
ソーステキスト
SourceFile: ByteOrderMark Moduleopt Shebang Moduleopt Moduleopt
ByteOrderMark: \uFEFF Shebang: #! Charactersopt EndOfShebang EndOfShebang: \u000A EndOfFile
ソーステキストは以下のいずれかとしてエンコードできる:
- ASCII (厳密には7ビットASCII)
- UTF-8
- UTF-16BE
- UTF-16LE
- UTF-32BE
- UTF-32LE
以下の UTF BOM(Byte Order Marks)は、ソース・テキストの先頭に存在することができる:
Format | BOM |
---|---|
UTF-8 | EF BB BF |
UTF-16BE | FE FF |
UTF-16LE | FF FE |
UTF-32BE | 00 00 FE FF |
UTF-32LE | FF FE 00 00 |
ASCII | BOMなし |
ソースファイルがBOMで始まらない場合、最初の文字はU+0000007F以下でなければならない。 は U+0000007F 以下でなければならない。
ソース・テキストは、そのソース表現から Unicode にデコードされる。 文字にデコードされる。文字はさらに次のように分けられる:文字はさらに、WhiteSpace、EndOfLine、Comments、SpecialTokenSequences、およびTokensに分割され、ソースはEndOfFile で終了する。
ソース・テキストは、maximal munch アルゴリズムを使用してトークンに分割される、 つまり、字句解析器は、可能な限り長いトークンを想定する。すなわち、字句解析器は可能な限り長いトークンを想定する、 >> は、2 つの greater-than トークンではなく、右シフト・トークンである。このルールには2つの例外がある。 このルールには2つの例外がある:
- .. のように、2つの浮動小数点リテラルの間に が埋め込まれている。 のように、2つの浮動小数点リテラルの間に埋め込まれた1..2 は、.. が最初の整数からスペースで区切られているかのように解釈される。 が最初の整数からスペースで区切られているものとして解釈される。
- 1.a は、1 、. 、a の3つのトークンとして解釈される、 一方、1. a は、1. とa の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種類ある:
- ブロックコメントは複数行にまたがることができるが、入れ子にすることはできない。
- 行コメントは行末で終わる。
- ブロック・コメントは複数行にまたがり、入れ子にすることができる。
文字列とコメントの内容はトークン化されない。 その結果 文字列内のコメントの開始はコメントを開始しない。 コメント内の文字列区切り記号は、コメントの区切り記号の認識に影響しない。 また、コメント内の文字列区切り記号は、コメントの終了や、ネストされた/+ コメントの開始の認識には影響しない。 ただし /+ 、/+ コメント内で発生したものを除き、コメント内のコメント・オープニングは無視される。 コメントは無視される。
a = /+ // +/ 1; // 'a = 1;'のように解析される a = /+ "+/" +/ 1"; // 'a = " +/ 1";'のように解析される a = /+ /* +/ */ 3; // 'a = */ 3;'のように解析される
コメントをトークン連結子として使用することはできない、abc/**/def は2つのトークン、abc とdef であり、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で定義されている通りである。 識別子は任意に長くすることができ、大文字と小文字を区別する。
文字列リテラル
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 >
区切り文字列は、さまざまな形式の区切り文字を使用する。 区切り文字は、文字でも識別子でもよい、 の直後でなければならない。 終端デリミタは、終端の" の直前になければならない。 デリミタは入れ子になり、次のいずれかの文字である。 以下の文字のいずれかである:
Delimiter | Matching 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文字は、文字列から推測されるのではなく、文字列に特定の型を与える。 を与える。 ポストフィックス文字に対応する型は以下のとおりである:
Postfix | Type | Alias |
---|---|---|
c | immutable(char)[] | string |
w | immutable(wchar)[] | wstring |
d | immutable(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
Sequence | Meaning |
---|---|
\' | リテラル・シングルクォート' |
\" | リテラルダブルクオート" |
\? | リテラルクエスチョンマーク? |
\\ | リテラルバックスラッシュ\ |
\0 | バイナリゼロ(NUL、U+0000)。 |
\a | BEL(アラーム)文字(U+0007)。 |
\b | バックスペース(U+0008)。 |
\f | フォームフィード(FF)(U+000C)。 |
\n | 行末文字(U+000A)。 |
\r | キャリッジリターン(U+000D)。 |
\t | 水平タブ(U+0009)。 |
\v | 垂直タブ(U+000B)。 |
\xnn | nnは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. |
\unnnn | Unicode文字U+nnnn, ここで
nnnnは4桁の16進数である。 例:" を表す、 \u03B3 はUnicode文字γ(U+03B3 - GREEK SMALL LETTER GAMMA)を表す。 |
\Unnnnnn | Unicode文字U+nnnnnnを表す、
ここでnnnnnnは 8 桁の 16 進数である。 例:" を表す、 \U0001F603 は Unicode キ ャ ラ ク タ U+1F603 (口をあけた笑い顔 を表す。) |
\名前 | HTML5仕様の名前付き文字エンティティ。
仕様からの名前付き文字実体。 これらの名前は& で始まり; で終わる、例えば€ 。 NamedCharacterEntity を参照のこと。 |
文字リテラル
CharacterLiteral: ' SingleQuotedCharacter ' SingleQuotedCharacter: Character EscapeSequence
文字リテラルは、単一引用符で囲まれた1文字またはエスケープシーケンスである。 で囲まれた1文字またはエスケープシーケンスである。
'h' // 文字h '\n' // 改行 '\\' // バックスラッシュ文字
文字リテラルは char 、wchar 、またはdchar (のいずれかに解決される("基本データ型"参照)。
- リテラルが\u エスケープシーケンスの場合、wchar 型に解決される。
- リテラルが\U エスケープシーケンスである場合、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進数の並びである。
- 2進整数は、'0b'または'16b'で始まる2進数の列である。 または'0B'で始まる2進数の列である。
- C言語の8進数表記(例:0167 )は、10進数表記と混同しやすいと判断された; 文字列リテラルでのみ完全にサポートされている。 文字列リテラルでのみ完全にサポートされている。 std.conv.octal octal!167 テンプレートのように、コンパイル時に解釈される8進整数リテラルをサポートしている。
- 16進整数は、'0x'または'0x'で始まる一連の16進数である。 0x'または'0X'で始まる。
10 // 10進数 0b1010 // binary 0xA // hex
整数は、読みやすさを向上させるために桁の後に'_'文字を埋め込むことができるが、これは無視される。
20_000 // 海底のリーグ 867_5309 // 壁の数字 1_522_000 // F1エンジンの推力(海面レベル) 0xBAAD_F00D // デバッグ用のマジックナンバー
整数の直後に'L'または'u'または'U'のいずれかが続くことがある。 'u'または'U'のいずれか、あるいは両方が続く。 l'接尾辞はないことに注意。
整数の型は以下のように解決される:
Literal | Type | 通常の10進表記法 |
---|---|
0 .. 2_147_483_647 | int |
2_147_483_648 .. 9_223_372_036_854_775_807 | long |
9_223_372_036_854_775_808 .. 18_446_744_073_709_551_615 | ulong | 明示的接尾辞 |
0L .. 9_223_372_036_854_775_807L | long |
0U .. 4_294_967_295U | uint |
4_294_967_296U .. 18_446_744_073_709_551_615U | ulong |
0UL .. 18_446_744_073_709_551_615UL | ulong | 16進表記法 |
0x0 .. 0x7FFF_FFFF | int |
0x8000_0000 .. 0xFFFF_FFFF | uint |
0x1_0000_0000 .. 0x7FFF_FFFF_FFFF_FFFF | long |
0x8000_0000_0000_0000 .. 0xFFFF_FFFF_FFFF_FFFF | ulong | 明示的接尾辞付き16進表記法 |
0x0L .. 0x7FFF_FFFF_FFFF_FFFFL | long |
0x8000_0000_0000_0000L .. 0xFFFF_FFFF_FFFF_FFFFL | ulong |
0x0U .. 0xFFFF_FFFFU | uint |
0x1_0000_0000U .. 0xFFFF_FFFF_FFFF_FFFFU | ulong |
0x0UL .. 0xFFFF_FFFF_FFFF_FFFFUL | ulong |
整数リテラルはこれらの値を超えてはならない。
浮動小数点リテラル
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: LImaginarySuffix: 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_
- 接尾辞のない浮動小数点リテラルはdouble 型である。
- f またはF が続く浮動小数点リテラルはfloat 型である。
- L が続く浮動小数点リテラルはreal 型である。
0.0 // double 0F // float 0.0L // real
リテラルは型の範囲を超えてはならない。 リテラルは、その型の有効桁数に収まるように丸められる。 型の有効桁に収まるように丸められる。
浮動小数点リテラルが. と "型"の接尾辞を持つ場合、少なくとも1桁はその中間になければならない。 桁が間になければならない:
1f; // OK、float 1.f; // エラー 1.; // OK、double
キーワード
キーワードは予約された識別子である。
Keyword: abstract alias align asm assert autobodybool break byte case cast catchcdoublecentcfloatchar class const continuecrealdchar debug default delegatedeletedeprecated do double else enum export extern false final finally float for foreach foreach_reverse function gotoidoubleififloatimmutable import in inout int interface invariantirealis 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 ubyteucentuint ulong union unittest ushort version void wchar while with __FILE__ __FILE_FULL_PATH__ __MODULE__ __LINE__ __FUNCTION__ __PRETTY_FUNCTION__ __gshared __traits __vector __parameters
特殊トークン
これらのトークンは、以下の表に従って他のトークンに置き換えられる。 表を参照のこと:
Special Token | Replaced with |
---|---|
__DATE__ | 編集日時の文字列リテラル"mmm dd yyyy" |
__EOF__ | このトークンの後のすべてを無視するようにスキャナに指示する。 |
__TIME__ | コンパイル時刻"hh:mm:ss"の文字列リテラル |
__TIMESTAMP__ | コンパイル日時を表す文字列リテラル"www mmm dd hh:mm:ss yyyy" |
__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行目である
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku