跳转至

词法

源文件与编码

Lumos 仅接受 Unicode 源码文件,编码必须为 UTF-8、UTF-16 或 UTF-32。
所有内容区分大小写,且不允许 BOM;若检测到 BOM 将直接报错。

标识符

默认标识符仅允许 ASCII 字符。若需要使用 Unicode 作为名称,必须写为 $"unicode内容" 的形式,并遵循 b"..." 的字节串转义规则。

空白字符

Lumos 认可的空白字符为 \x20(空格)、\x09(制表符)和 \x0A(换行符)。其它任何字符均不被视为空白字符。

行号在遇到换行符(LF)时递增,列号在换行处重置。回车符(CR, \x0D)本身不增加行号,但仅允许作为 CRLF 序列的一部分(即 CR 必须紧跟 LF);在其他位置出现 CR 将引发词法错误。

行首的空白(空格或制表符)被视为缩进。单个行的缩进必须只使用空格或只使用制表符,混用空格和制表符进行缩进会导致词法错误。

运算符

对于运算符,Lumos 采用简单且一致的规则:

  • 下列字符可作为运算符的一部分:! % ^ & * - + = | : < > , . ? / ~
  • 采用永远最长匹配原则进行运算符识别。

也就是说,遇到 a+-b 时会被解析为单个 +- 运算符,而不是 + 运算符后跟 - 运算符;如果未定义 +-,则会报错。

例如,我们可以用带斜线的标识符为运算符提供实现:

// 我们用 `\\mul` 来表示 `*` 运算符
// `\\mul_mul` 对应 `**` 运算符
def \\\mul_mul(int a, int b) -> int {
    return pow(a, b);
}

自定义运算符不得超过 4 个字符长度。


相关内容:语法入口见 语法