天行健 君子当自强而不息

【ZT】D语言词法分析(2)

字符串文字量

	字符串文字量:	所见即所得字符串	替代所见即所得字符串	双引号字符串		转义序列		十六进制字符串	
	StringLiteral:	WysiwygString	AlternateWysiwygString	DoubleQuotedString	EscapeSequence	HexString	
 
	所见即所得字符串:	r" 多个所见即所得字符 "	替代所见即所得字符串:	` 多个所见即所得字符 `	所见即所得字符:	字符		
	WysiwygString:	r" WysiwygCharacters "	AlternateWysiwygString:	` WysiwygCharacters `	WysiwygCharacter:	Character	
	
	行尾		双引号字符串:		" 多个双引号字符 "		双引号字符:		字符		转义序列		
	EndOfLine	DoubleQuotedString:	" DoubleQuotedCharacters "	DoubleQuotedCharacter:	Character		EscapeSequence	
 
	行尾		转义序列:	\'	\"	\?	\\	\a	\b	\f	\n	\r	\t	\v		
	EndOfLine	EscapeSequence:	\'	\"	\?	\\	\a	\b	\f	\n	\r	\t	\v	
	
	\ 文件尾		\x 十六进制数字 十六进制数字	\ 八进制数字	\ 八进制数字 八进制数字	\ 八进制数字 八进制数字 八进制数字		
	\ EndOfFile	\x HexDigit HexDigit		\ OctalDigit	\ OctalDigit OctalDigit	\ OctalDigit OctalDigit OctalDigit
 
	\u 十六进制数字 十六进制数字 十六进制数字 十六进制数字	
	\u HexDigit HexDigit HexDigit HexDigit			
 
	\U 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字	十六进制字符串:		
	\U HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit					HexString:
		
	x" 多个十六进制字符串字符 "	多个十六进制字符串字符:	十六进制数字	空白		行尾
	x" HexStringChars "		HexStringChar		HexDigit	WhiteSpace	EndOfLine	
 

字符串文字量可以是一个双引号字符串、一个所见即所得引号字符串、一个转义序列、或者一个十六进制字符串。

所见即所得引号字符串由‘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 '	SingleQuotedCharacter	Character		EscapeSequence	
字符文字量是单个的字符或者由单引号括起来的转义序列,' ' 。

整数文字量

	整数文字量:	整数	整数 	整数后缀		整数:		十进制数		二进制数		八进制数		
	IntegerLiteral:	Integer	Integer I	ntegerSuffix	Integer:		Decimal		Binary		Octal		
 
	十六进制数	整数 _	整数后缀:	l	L	u	U	lu	Lu	lU	LU	ul	uL		
	Hexadecimal	Integer _IntegerSuffix:	l	L	u	U	lu	Lu	lU	LU	ul	uL
 
	Ul	UL	十进制数:	0	非零数字		非零数字 	十进制数		非零数字 _ 十进制数	二进制数:	
	Ul	UL	Decimal:		0	NonZeroDigit	NonZeroDigit 	Decimal		NonZeroDigit _ Decimal	Binary:
 
	0b 二进制数字	0B 二进制数字	八进制数:	0 八进制数字	十六进制数:	0x 十六进制数字	0X 十六进制数字
	0b BinaryDigits	0B BinaryDigits	Octal:		0 OctalDigits	Hexadecimal:	0x HexDigits	0X HexDigits	
 
整数可以采用十进制、二进制、八进制或者十六进制。

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

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

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

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

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

	123_456		// 123456	
	1_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 类型。

浮点数文字量

	浮点数文字量:	浮点数	浮点数 浮点数后缀	浮点数 虚数后缀		浮点数 浮点数后缀 虚数后缀		浮点数:	十进制浮点数	
	FloatLiteral:	Float	Float FloatSuffix	Float ImaginarySuffix	Float FloatSuffix ImaginarySuffix	Float:	DecimalFloat	
	
	十六进制浮点数	浮点数 _	浮点数后缀:	f	F	l	L	虚数后缀:		i	I
	HexFloat	Float _	FloatSuffix:	f	F	l	L	ImaginarySuffix:	i	I		
浮点数可以使用十进制或者十六进制格式,如同标准 C 一样。

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

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

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

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

示例:

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

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

	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 的值,从源码文本的下一行生效。与码文件名和行号用于打印调试信息,还被符号调试器用于将生成的代码映射回源代码。

例如:

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

posted on 2007-09-13 20:21 lovedday 阅读(432) 评论(0)  编辑 收藏 引用 所属分类: ▲ D Program


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论