19.3.2. ASL 字面常量
本节描述如何使用 ASL 对整数和字符串常量进行编码。
19.3.2.1. 整数
DigitChar := '0'-'9'
LeadDigitChar := '1'-'9'
OctalDigitChar := '0'-'7'
HexDigitChar := DigitChar \| 'A'-'F' \| 'a'-'f'
Integer := DecimalConst \| OctalConst \| HexConst
DecimalConst := LeadDigitChar \| <decimalconst digitchar>
OctalConst := '0' \| <octalconst octaldigitchar>
HexConst := <0x hexdigitchar> \| <0x hexdigitchar> \| <HexConst HexDigitChar>
ByteConst := Integer => 0x00-0xFF
WordConst := Integer => 0x0000-0xFFFF
DWordConst := Integer => 0x00000000-0xFFFFFFFF
QWordConst := Integer => 0x0000000000000000-0xFFFFFFFFFFFFFFFF
数值常量可以用十进制、八进制或十六进制指定。八进制常量以前导零 (0) 开头,十六进制常量以前导零和小写或大写的 ‘x’ 开头。在某些情况下,语法规定该数值必须求值为某个受限范围内的整数,例如 0x00-0xFF,等等。
19.3.2.2. 字符串
String := '"' Utf8CharList '"'
Utf8CharList := Nothing | <escapesequence utf8charlist> | <Utf8Char Utf8CharList>
Utf8Char := 0x01-0x21 |
0x23-0x5B |
0x5D-0x7F |
0xC2-0xDF 0x80-0xBF |
0xE0 0xA0-0xBF 0x80-0xBF |
0xE1-0xEC 0x80-0xBF 0x80-0xBF |
0xED 0x80-0x9F 0x80-0xBF |
0xEE-0xEF 0x80-0xBF 0x80-0xBF |
0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF |
0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF |
0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF
EscapeSeq := SimpleEscapeSeq | OctalEscapeSeq | HexEscapeSeq
SimpleEscapeSeq := \' | \" | \a | \b | \f | \n | \r | \t | \v | \\
OctalEscapeSeq := \ OctalDigitChar |
\ OctalDigitChar OctalDigitChar |
\ OctalDigitChar OctalDigitChar OctalDigitChar
HexEscapeSeq := \x HexDigitChar |
\x HexDigitChar HexDigitChar
NullChar := 0x00
字符串字面量由零个或多个被双引号 (“) 包围的 ASCII 字符组成。字符串字面量表示一个字符序列,这些字符合在一起构成一个以空字符结尾的字符串。在将常量中所有相邻字符串连接之后,会附加一个空字符。
源文件中的字符串可以使用 Unicode 4.0 规范中定义的 UTF-8 编码方案进行编码。UTF-8 是一种面向字节的编码方案,其中有些字符占用单个字节,另一些字符占用多个字节。ASCII 字符值 0x01-0x7F 恰好各占用一个字节。
但是,目前仅有一个运算符支持 UTF-8 字符串:Unicode。由于字符串字面量被定义为仅包含非空字符值,因此 Hex 和 Octal 转义序列的值都必须是 ASCII 范围 0x01 到 0xFF 内的非空值。对于任意字节数据(超出 ASCII 值范围),应改用 Buffer 对象。
由于反斜杠既用作转义字符,也用作命名空间根前缀,任何需要包含从命名空间根开始的完全限定名称路径的字符串字面量,都必须使用双反斜杠来表示:
Name (_EJD, "\\_SB.PCI0.DOCK1")
双反斜杠仅在带引号的字符串字面量中才需要。
由于双引号用于结束字符串,因此使用特殊转义序列 (") 以允许在字符串中包含引号。其他转义序列列于下表。
表 19.4 ASL 转义序列
| 转义序列 | ASCII 字符 |
|---|---|
| \a | 0x07 (BEL) |
| \b | 0x08 (BS) |
| \f | 0x0C (FF) |
| \n | 0x0A (LF) |
| \r | 0x0D (CR) |
| \t | 0x09 (TAB) |
| \v | 0x0B (VT) |
| \” | 0x22 (“) |
| \’ | 0x27 (‘) |
| \ \ | 0x5C () |
由于字面字符串是只读常量,因此不支持以下 ASL 语句(例如):
Store ("ABC", "DEF")
但是,支持以下语句序列:
Name (STR, "DEF")
...
Store ("ABC", STR)