D語言詞法(二)

字符串文字量

	字符串文字量:
		所見即所得字符串
		替代所見即所得字符串
		雙引號字符串
		轉義序列
		十六進制字符串

	所見即所得字符串:
		r" 多個所見即所得字符 "

	替代所見即所得字符串:
		` 多個所見即所得字符 `

	所見即所得字符:
		字符
		行尾

	雙引號字符串:
		" 多個雙引號字符 "

	雙引號字符:
		字符
		轉義序列
		行尾

	轉義序列:
		/'
		/"
		/?
		//
		/a
		/b
		/f
		/n
		/r
		/t
		/v
		/ 文件尾
		/x 十六進制數字 十六進制數字
		/ 八進制數字
		/ 八進制數字 八進制數字
		/ 八進制數字 八進制數字 八進制數字
		/u 十六進制數字 十六進制數字 十六進制數字 十六進制數字
		/U 十六進制數字 十六進制數字 十六進制數字 十六進制數字 十六進制數字 十六進制數字 十六進制數字 十六進制數字

	十六進制字符串:
		x" 多個十六進制字符串字符 "

	多個十六進制字符串字符:
		十六進制數字
		空白
		行尾
	StringLiteral:
		WysiwygString
		AlternateWysiwygString
		DoubleQuotedString
		EscapeSequence
		HexString

	WysiwygString:
		r" WysiwygCharacters "

	AlternateWysiwygString:
		` WysiwygCharacters `

	WysiwygCharacter:
		Character
		EndOfLine

	DoubleQuotedString:
		" DoubleQuotedCharacters "

	DoubleQuotedCharacter:
		Character
		EscapeSequence
		EndOfLine

	EscapeSequence:
		/'
		/"
		/?
		//
		/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 HexDigit

	HexString:
		x" HexStringChars "

	HexStringChar
		HexDigit
		WhiteSpace
		EndOfLine
	
字符串文字量可以是一個雙引號字符串、一個所見即所得引號字符串、一個轉義序列、或者一個十六進制字符串。

所見即所得引號字符串由‘r"’和‘"’包圍起來。所有位於‘r"’和‘"’之間的字符都是字符串的一部分,只有 行尾 除外,他被視作一個‘/n’字符。在 r" " 中沒有轉義序列:

	r
	r
	r			
	
所見即所得字符串的另一種形式是使用反引號‘`’代替雙引號。‘`’字符並不是所有的鍵盤上都有,而且有時在屏幕上難以同另一個常用的字符‘'’區分。儘管‘`’很少使用,當用在包含‘"’的字符串時就會體現出它的價值。
	
	
				
	
雙引號字符串是用‘""’包圍起來的字符串。可以使用典型的‘/’記號在其中嵌入轉義序列。行尾 被視作一個‘/n’字符。
	
	
				
				
	
轉義字符串由‘/’開始,他和其後的字符構成了一個轉義字符序列。相鄰的轉義字符串會被連接在一起:
	/n			
	/t			
	/"			
	/012			
	/x1A			
	/u1234			
	/U00101234		
	/r/n			
	
除了上面列出的,其他的轉義序列都是非法的。

十六進制字符串使用十六進制數據構造字符串:

	x			
	x	
	
空白和新行符會被忽略,因此可以很方便的格式化。十六進制字符的個數必須是2的倍數。

相鄰的字符串應該用 ~ 運算符連接,或者也可以僅僅並置即可:

	 ~  ~ /n	
	
下面的形式都是等價的:
	
	r r
	r
	 ~  ~ 
	/x61
	

字符文字量

	字符文字量:
		' 單引號字符 '

	單引號字符
		字符
		轉義序列
	
	CharacterLiteral:
		' SingleQuotedCharacter '

	SingleQuotedCharacter
		Character
		EscapeSequence
	
字符文字量是單個的字符或者由單引號括起來的轉義序列,' ' 。

整數文字量

	整數文字量:
		整數
		整數 整數後綴

	整數:
		十進制數
		二進制數
		八進制數
		十六進制數
		整數 _

	整數後綴:
		l
		L
		u
		U
		lu
		Lu
		lU
		LU
		ul
		uL
		Ul
		UL

	十進制數:
		0
		非零數字
		非零數字 十進制數
		非零數字 _ 十進制數

	二進制數:
		0b 二進制數字
		0B 二進制數字

	八進制數:
		0 八進制數字

	十六進制數:
		0x 十六進制數字
		0X 十六進制數字
	IntegerLiteral:
		Integer
		Integer IntegerSuffix

	Integer:
		Decimal
		Binary
		Octal
		Hexadecimal
		Integer _

	IntegerSuffix:
		l
		L
		u
		U
		lu
		Lu
		lU
		LU
		ul
		uL
		Ul
		UL

	Decimal:
		0
		NonZeroDigit
		NonZeroDigit Decimal
		NonZeroDigit _ Decimal

	Binary:
		0b BinaryDigits
		0B BinaryDigits

	Octal:
		0 OctalDigits

	Hexadecimal:
		0x HexDigits
		0X HexDigits
	
整數可以採用十進制、二進制、八進制或者十六進制。

十進制整數是十進制數字的序列。

二進制整數是二進制數字的序列,以‘0b’爲前綴。

八進制整數是八進制數字的序列,以‘0’爲前綴。

十六進制整數是十六進制數字的序列,以‘0x’爲前綴,或者使用‘h’作爲後綴。

整數可以內嵌 '_' 字符,它們會被忽略。嵌入的 '_' 可以用於格式化較長的文字量,例如作爲千位分隔符:

	123_456		
	1_2_3_4_5_6_	
	
整數後可以緊跟着一個 'l' 或者一個 'u' 或者兩者都有。

整數的類型按照下述規則判斷:

  1. 如果是十進制的,它是 ulong、long、int 中從後向前找到的第一個可以表示它的類型。
  2. 如果不是十進制的,它是 ulong、long、uint、int 中從後向前找到的第一個可以表示它的類型。
  3. 如果它有後綴‘u’,它是 ulong、uint 中從後向前找到的第一個可以表示它的類型。
  4. 如果它有後綴‘l’,它是 ulong、long 中從後向前找到的第一個可以表示它的類型。
  5. 如果它同時擁有後綴‘u’和‘l’,它是 ulong 類型。

浮點數文字量

	浮點數文字量:
		浮點數
		浮點數 浮點數後綴
		浮點數 虛數後綴
		浮點數 浮點數後綴 虛數後綴

	浮點數:
		十進制浮點數
		十六進制浮點數
		浮點數 _

	浮點數後綴:
		f
		F
		l
		L

	虛數後綴:
		i
		I
	FloatLiteral:
		Float
		Float FloatSuffix
		Float ImaginarySuffix
		Float FloatSuffix ImaginarySuffix

	Float:
		DecimalFloat
		HexFloat
		Float _

	FloatSuffix:
		f
		F
		l
		L

	ImaginarySuffix:
		i
		I
		
浮點數可以使用十進制或者十六進制格式,如同標準 C 一樣。

十六進制浮點數以 0x 開頭,階碼以 p 或者 P 開頭,後面跟着以 2 爲底的階數。

浮點文字量可以有嵌入的‘_’字符,它們會被忽略。嵌入的‘_’用來格式化冗長的文字量以提高可讀性,例如可以將它們用作千位分隔符:

	123_456.567_8		
	1_2_3_4_5_6_._5_6_7_8	
	1_2_3_4_5_6_._5e-6_	
	
浮點數可以跟隨有一個 fFl 或者 L 後綴。fF 後綴說明這是一個浮點數,lL 說明這是一個擴展格式浮點數。

如果浮點文字量後面跟着 i 或者 I ,那麼它就是一個 ireal (虛數)類型。

示例:

	0x1.FFFFFFFFFFFFFp1023		
	0x1p-52				
	1.175494351e-38F			
	6.3i				
	6.3fi				
	6.3LI				
	
如果文字量超出了該類型的表示範圍,會被視爲錯誤。如果文字量取整後可以用該類型的有效位數字表示,就不是錯誤。

複數文字量不是記號,而是在語義分析時用實數和虛數表達式構造的:

	4.5 + 6.2i		
	

關鍵字

關鍵字是保留的標誌符:
	Keyword:
		abstract
		alias
		align
		asm
		assert
		auto

		bit
		body
		break
		byte

		case
		cast
		catch
		cent
		char
		class
		cfloat
		cdouble
		creal
		const
		continue

		dchar
		debug
		default
		delegate
		delete
		deprecated
		do
		double

		else
		enum
		export
		extern

		false
		final
		finally
		float
		for
		foreach
		function

		goto

		idouble
		if
		ifloat
		import
		in
		inout
		int
		interface
		invariant
		ireal
		is

		long

		mixin
		module

		new
		null

		out
		override

		package
		pragma
		private
		protected
		public

		real
		return

		short
		static
		struct
		super
		switch
		synchronized

		template
		this
		throw
		true
		try
		typedef
		typeof

		ubyte
		ucent
		uint
		ulong
		union
		unittest
		ushort

		version
		void
		volatile

		wchar
		while
		with
	

特殊記號序列

特殊記號序列由詞法分析程序處理,它可以出現在其他記號之間,並且不影響語法分析。

目前只有一個特殊記號序列,#line

	特殊記號序列
		# line 整數 行尾
		# line 整數 Filespec 行尾

	指定文件
		" 字符 "
	SpecialTokenSequence
		# line Integer EndOfLine
		# line Integer Filespec EndOfLine

	Filespec
		" Characters "
		
它會將源代碼的行號設置爲 整數 的值,將源代碼文件名設置爲可選的 Filespec 的值,從源碼文本的下一行生效。與碼文件名和行號用於打印調試信息,還被符號調試器用於將生成的代碼映射回源代碼。

例如:

	  6 
	x;			
	
注意,Filespec 字符串中的反斜槓不會被特殊對待。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章