D语言词法(二)

来源:互联网 发布:湖南软件职业学院分数线 编辑:程序博客网 时间:2024/04/28 13:19

字符串文字量

字符串文字量:所见即所得字符串替代所见即所得字符串双引号字符串转义序列十六进制字符串所见即所得字符串:r" 多个所见即所得字符 "替代所见即所得字符串:` 多个所见即所得字符 `所见即所得字符:字符行尾双引号字符串:" 多个双引号字符 "双引号字符:字符转义序列行尾转义序列:/'/"/?///a/b/f/n/r/t/v/ 文件尾/x 十六进制数字 十六进制数字/ 八进制数字/ 八进制数字 八进制数字/ 八进制数字 八进制数字 八进制数字/u 十六进制数字 十六进制数字 十六进制数字 十六进制数字/U 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字十六进制字符串:x" 多个十六进制字符串字符 "多个十六进制字符串字符:十六进制数字空白行尾
StringLiteral:WysiwygStringAlternateWysiwygStringDoubleQuotedStringEscapeSequenceHexStringWysiwygString:r" WysiwygCharacters "AlternateWysiwygString:` WysiwygCharacters `WysiwygCharacter:CharacterEndOfLineDoubleQuotedString:" DoubleQuotedCharacters "DoubleQuotedCharacter:CharacterEscapeSequenceEndOfLineEscapeSequence:/'/"/?///a/b/f/n/r/t/v/ EndOfFile/x HexDigit HexDigit/ OctalDigit/ OctalDigit OctalDigit/ OctalDigit OctalDigit OctalDigit/u HexDigit HexDigit HexDigit HexDigit/U HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigitHexString:x" HexStringChars "HexStringCharHexDigitWhiteSpaceEndOfLine
字符串文字量可以是一个双引号字符串、一个所见即所得引号字符串、一个转义序列、或者一个十六进制字符串。

所见即所得引号字符串由‘r"’和‘"’包围起来。所有位于‘r"’和‘"’之间的字符都是字符串的一部分,只有 行尾 除外,他被视作一个‘/n’字符。在 r" " 中没有转义序列:

r"hello"r"c:/root/foo.exe"r"ab/n"// 由四个字符组成的字符串:'a'、'b'、'/'、'n'
所见即所得字符串的另一种形式是使用反引号‘`’代替双引号。‘`’字符并不是所有的键盘上都有,而且有时在屏幕上难以同另一个常用的字符‘'’区分。尽管‘`’很少使用,当用在包含‘"’的字符串时就会体现出它的价值。
`hello``c:/root/foo.exe``ab/n`// 由四个字符组成的字符串:'a'、'b'、'/'、'n'
双引号字符串是用‘""’包围起来的字符串。可以使用典型的‘/’记号在其中嵌入转义序列。行尾 被视作一个‘/n’字符。
"hello""c://root//foo.exe""ab/n"// 由三个字符组成的字符串:'a'、'b'和一个新行符"ab"// 由三个字符组成的字符串:'a'、'b'和一个新行符
转义字符串由‘/’开始,他和其后的字符构成了一个转义字符序列。相邻的转义字符串会被连接在一起:
/n// 新行符/t// 制表符/"// 双引号/012// 八进制/x1A// 十六进制/u1234// wchar 字符/U00101234// dchar 字符/r/n// 回车换行
除了上面列出的,其他的转义序列都是非法的。

十六进制字符串使用十六进制数据构造字符串:

x"0A"// 等价于 "/x0A"x"00 FBCD 32FD 0A"// 等价于 "/x00/xFB/xCD/x32/xFD/x0A"
空白和新行符会被忽略,因此可以很方便的格式化。十六进制字符的个数必须是2的倍数。

相邻的字符串应该用 ~ 运算符连接,或者也可以仅仅并置即可:

"hello " ~ "world" ~ /n// 构成字符串:'h','e','l','l','o',' ','w','o','r','l','d',字符串
下面的形式都是等价的:
"ab" "c"r"ab" r"c"r"a" "bc""a" ~ "b" ~ "c"/x61"bc"

字符文字量

字符文字量:' 单引号字符 '单引号字符字符转义序列
CharacterLiteral:' SingleQuotedCharacter 'SingleQuotedCharacterCharacterEscapeSequence
字符文字量是单个的字符或者由单引号括起来的转义序列,' ' 。

整数文字量

整数文字量:整数整数 整数后缀整数:十进制数二进制数八进制数十六进制数整数 _整数后缀:lLuUluLulULUuluLUlUL十进制数:0非零数字非零数字 十进制数非零数字 _ 十进制数二进制数:0b 二进制数字0B 二进制数字八进制数:0 八进制数字十六进制数:0x 十六进制数字0X 十六进制数字
IntegerLiteral:IntegerInteger IntegerSuffixInteger:DecimalBinaryOctalHexadecimalInteger _IntegerSuffix:lLuUluLulULUuluLUlULDecimal:0NonZeroDigitNonZeroDigit DecimalNonZeroDigit _ DecimalBinary:0b BinaryDigits0B BinaryDigitsOctal:0 OctalDigitsHexadecimal:0x HexDigits0X HexDigits
整数可以采用十进制、二进制、八进制或者十六进制。

十进制整数是十进制数字的序列。

二进制整数是二进制数字的序列,以‘0b’为前缀。

八进制整数是八进制数字的序列,以‘0’为前缀。

十六进制整数是十六进制数字的序列,以‘0x’为前缀,或者使用‘h’作为后缀。

整数可以内嵌 '_' 字符,它们会被忽略。嵌入的 '_' 可以用于格式化较长的文字量,例如作为千位分隔符:

123_456// 1234561_2_3_4_5_6_// 123456
整数后可以紧跟着一个 'l' 或者一个 'u' 或者两者都有。

整数的类型按照下述规则判断:

  1. 如果是十进制的,它是 ulong、long、int 中从后向前找到的第一个可以表示它的类型。
  2. 如果不是十进制的,它是 ulong、long、uint、int 中从后向前找到的第一个可以表示它的类型。
  3. 如果它有后缀‘u’,它是 ulong、uint 中从后向前找到的第一个可以表示它的类型。
  4. 如果它有后缀‘l’,它是 ulong、long 中从后向前找到的第一个可以表示它的类型。
  5. 如果它同时拥有后缀‘u’和‘l’,它是 ulong 类型。

浮点数文字量

浮点数文字量:浮点数浮点数 浮点数后缀浮点数 虚数后缀浮点数 浮点数后缀 虚数后缀浮点数:十进制浮点数十六进制浮点数浮点数 _浮点数后缀:fFlL虚数后缀:iI
FloatLiteral:FloatFloat FloatSuffixFloat ImaginarySuffixFloat FloatSuffix ImaginarySuffixFloat:DecimalFloatHexFloatFloat _FloatSuffix:fFlLImaginarySuffix:iI
浮点数可以使用十进制或者十六进制格式,如同标准 C 一样。

十六进制浮点数以 0x 开头,阶码以 p 或者 P 开头,后面跟着以 2 为底的阶数。

浮点文字量可以有嵌入的‘_’字符,它们会被忽略。嵌入的‘_’用来格式化冗长的文字量以提高可读性,例如可以将它们用作千位分隔符:

123_456.567_8// 123456.56781_2_3_4_5_6_._5_6_7_8// 123456.56781_2_3_4_5_6_._5e-6_// 123456.5e-6
浮点数可以跟随有一个 fFl 或者 L 后缀。fF 后缀说明这是一个浮点数,lL 说明这是一个扩展格式浮点数。

如果浮点文字量后面跟着 i 或者 I ,那么它就是一个 ireal (虚数)类型。

示例:

0x1.FFFFFFFFFFFFFp1023// double.max0x1p-52// double.epsilon1.175494351e-38F// float.min6.3i// idouble 6.36.3fi// ifloat 6.36.3LI// ireal 6.3
如果文字量超出了该类型的表示范围,会被视为错误。如果文字量取整后可以用该类型的有效位数字表示,就不是错误。

复数文字量不是记号,而是在语义分析时用实数和虚数表达式构造的:

4.5 + 6.2i// 复数

关键字

关键字是保留的标志符:
Keyword:abstractaliasalignasmassertautobitbodybreakbytecasecastcatchcentcharclasscfloatcdoublecrealconstcontinuedchardebugdefaultdelegatedeletedeprecateddodoubleelseenumexportexternfalsefinalfinallyfloatforforeachfunctiongotoidoubleififloatimportininoutintinterfaceinvariantirealislongmixinmodulenewnulloutoverridepackagepragmaprivateprotectedpublicrealreturnshortstaticstructsuperswitchsynchronizedtemplatethisthrowtruetrytypedeftypeofubyteucentuintulongunionunittestushortversionvoidvolatilewcharwhilewith

特殊记号序列

特殊记号序列由词法分析程序处理,它可以出现在其他记号之间,并且不影响语法分析。

目前只有一个特殊记号序列,#line

特殊记号序列# line 整数 行尾# line 整数 Filespec 行尾指定文件" 字符 "
SpecialTokenSequence# line Integer EndOfLine# line Integer Filespec EndOfLineFilespec" Characters "
它会将源代码的行号设置为 整数 的值,将源代码文件名设置为可选的 Filespec 的值,从源码文本的下一行生效。与码文件名和行号用于打印调试信息,还被符号调试器用于将生成的代码映射回源代码。

例如:

int #line 6 "foo/bar"x;// 这里是文件 foo/bar 的第6行
注意,Filespec 字符串中的反斜杠不会被特殊对待。