词法约定#

警告

本页面仍在编写中,内容尚不完整。

本页面规定 MoonBit 的词法形式。运行时表示、API 和字面量重载见基础

在产生式中,{ symbol } 表示重复零次或多次,{ symbol }+ 表示重复一次或多次,x ... y 表示包含两端的范围。

通用词法类#

hex-digit ::= 0 ... 9 | A ... F | a ... f

octal-digit ::= 0 ... 7

unicode-scalar-value ::= U+0000 ... U+D7FF | U+E000 ... U+10FFFF

newline ::= LF | CR | CR LF | U+2028 | U+2029

whitespace ::= U+0009 | U+000B | U+000C | U+0020 | U+00A0 | U+1680
             | U+2000 ... U+200A | U+202F | U+205F | U+3000 | U+FEFF

字符串字面量#

string-literal ::= " { string-character } "

string-character ::= regular-string-character
                   | simple-escape-sequence
                   | unicode-escape-sequence
                   | interpolation

regular-string-character ::= unicode-scalar-value except ", \, CR, and LF

simple-escape-sequence ::= \ (\ | " | ' | n | t | b | r | f | /)

unicode-escape-sequence ::= \u hex-digit hex-digit hex-digit hex-digit
                          | \u{ { hex-digit }+ }

简单转义序列的含义如下:

序列

字符

\\

反斜杠(U+005C)

\"

双引号(U+0022)

\'

单引号(U+0027)

\/

正斜杠(U+002F)

\n

换行符(U+000A)

\r

回车符(U+000D)

\t

水平制表符(U+0009)

\b

退格符(U+0008)

\f

换页符(U+000C)

Unicode 转义必须表示 Unicode 标量值。若在右引号之前遇到 CR 或 LF,则报告未终止的字符串字面量。

插值#

interpolation ::= \{ { whitespace } expression { whitespace } }

表达式不能为空,并在匹配的 } 处结束。嵌套字面量中的大括号不影响配对;嵌套插值会被递归识别。不允许 CR、LF、// 注释、属性和多行字符串字面量。

多行字符串字面量#

multiline-string-literal ::= raw-multiline-string-literal
                           | interpolated-multiline-string-literal

raw-multiline-string-literal ::= raw-multiline-string-line
                               { newline raw-multiline-string-line }

interpolated-multiline-string-literal ::= interpolated-multiline-string-line
                                        { newline interpolated-multiline-string-line }

raw-multiline-string-line ::= #| { multiline-regular-character }

interpolated-multiline-string-line ::= $| { multiline-regular-character | interpolation }

multiline-regular-character ::= unicode-scalar-value except CR and LF

前缀不计入结果,行之间以 U+000A 连接。最后一个带前缀的空行会添加末尾换行符。#| 行为原样文本;在 $| 行中,只有 \{ 开始插值。插值表达式内不允许多行字符串。

字节序列字面量#

bytes-literal ::= b" { bytes-character } "

bytes-character ::= regular-string-character
                  | simple-escape-sequence
                  | byte-escape-sequence
                  | interpolation

byte-escape-sequence ::= \x hex-digit hex-digit
                       | \o (0 ... 3) octal-digit octal-digit

若在右引号之前遇到 CR 或 LF,则报告未终止的字面量。非 ASCII 源字符写入其 UTF-8 编码;\xHH\oDDD 各写入一个取值为 0 到 255 的字节。插值遵循字符串字面量规则。字节序列字面量没有多行形式。

字符字面量#

character-literal ::= ' regular-character '
                    | ' character-escape-sequence '

regular-character ::= unicode-scalar-value except ', \, CR, and LF

character-escape-sequence ::= simple-escape-sequence
                            | unicode-escape-sequence

字符字面量恰好包含一个 Unicode 标量值或转义序列。

字节字面量#

byte-literal ::= b' regular-byte-character '
               | b' byte-character-escape-sequence '

regular-byte-character ::= U+0000 ... U+007F except ', \, CR, and LF

byte-character-escape-sequence ::= simple-escape-sequence
                                 | byte-escape-sequence

未转义的字节必须是 ASCII。字节字面量中不允许 Unicode 转义。