LSR 014 - 运算符规范¶
基本信息¶
LSR 编号 014
标题 运算符规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 08-11-2026
归属项目 编译器、标准库、CAS
摘要¶
定义 Lamina 中数学表达式和普通表达式可使用的运算符、分隔符、关键字型运算符、优先级和结合性。Lamina 源码和标准文档示例都必须使用本规范列出的 token。
技术规范¶
1. 范围¶
本规范定义 Lamina 源码层运算符集合。标准库函数名、CAS 内部表示和错误消息文本不由本规范强制。
实现不得接受未列入本规范的数学符号作为运算符替代写法。
2. 源码 token¶
源码中的运算符、分隔符和关键字型运算符由下列 token 组成。保留但未定义语义的 token 在第 8 节单独列出。
类别 |
token |
用途 |
|---|---|---|
算术 |
|
加、减、乘、除、整除、取余、幂 |
广播算术 |
|
向量、矩阵或同形状容器的元素级运算 |
矩阵除法 |
|
矩阵左除 |
比较 |
|
标量相等和顺序关系 |
广播比较 |
|
向量、矩阵或同形状容器的元素级比较 |
逻辑 |
|
逻辑与、逻辑或、逻辑非 |
集合 |
|
从属、子集、并集、交集、对称差 |
调用与访问 |
|
调用、分组、元组、数组、索引、成员访问、参数分隔 |
线性代数 |
|
共轭转置、非共轭转置 |
集合字面量 |
|
集合和集合推导式 |
流程与函数 |
|
Binding 构造、match 分支、函数箭头、管道 |
绑定 |
|
绑定或赋值,由语句语法决定 |
以下示例使用合法 token。
let a = x^2 + 1
let b = x <= y and y != 0
let c = item in values
let d = 2 * x * sin(x)
<=是合法源码运算符!=是合法源码运算符and、or、not是逻辑运算关键字&&、||不属于 Lamina 核心逻辑运算符乘法必须显式写作
*
3. 运算符表¶
类别 |
运算符 |
结合性 |
说明 |
|---|---|---|---|
后缀 |
|
左结合 |
调用、成员访问、索引、转置 |
幂 |
|
右结合 |
数值、矩阵、 |
一元 |
|
右结合 |
正号、负号、逻辑非 |
乘法 |
|
左结合 |
乘、除、整除、取余、矩阵左除 |
广播乘法 |
|
左结合 |
元素级乘、除 |
加法 |
|
左结合 |
加、减 |
广播加法 |
|
左结合 |
元素级加、减 |
比较 |
|
不链式 |
标量比较 |
广播比较 |
|
不链式 |
元素级比较 |
从属 |
|
不链式 |
集合或容器从属 |
逻辑与 |
|
左结合 |
短路逻辑与 |
逻辑或 |
|
左结合 |
短路逻辑或 |
管道 |
|
左结合 |
函数调用语法糖 |
Binding |
|
右结合 |
表达式位置构造 |
范围外 |
|
由对应语法定义 |
函数类型、绑定或赋值 |
4. 表达式形式¶
以下表达式形式属于本规范定义的表面语法。
形式 |
示例 |
说明 |
|---|---|---|
函数调用 |
|
支持零个、一个或多个参数 |
集合字面量 |
|
有限集合;类型规则由集合规范定义 [2] |
集合推导式 |
|
产生有限集合 |
元组 |
|
固定长度有序组合;类型规则由元组规范定义 [3] |
分组 |
|
单元素圆括号表达式是分组,不是元组 |
函数名后紧跟圆括号时,圆括号内容解析为函数实参列表。
圆括号中的逗号分隔表达式解析为元组;函数名后的圆括号解析为实参列表;方括号中的逗号分隔表达式解析为数组。
区间由标准库的命名构造函数创建 [6]。分组、元组、数组、调用和索引分别保持本节规定的括号语义。
集合字面量 {} 表示空集合时必须由上下文确定元素类型。集合推导式中的 for 和 if 按核心语言推导式规则解析。
5. 显式乘法¶
Lamina 不提供隐式乘法。任何乘法都必须写出 *。
2 * x # 合法
2x # 非法
2 * (x + 1) # 合法
2(x + 1) # 非法
x * sin(x) # 合法
x sin(x) # 非法
该规则同时适用于 Lamina 源码和任何接收表达式文本的库接口。
6. 优先级¶
优先级从高到低如下:
后缀:
()、.、[]、'、.'幂:
^、.^一元:
+、-、not、!乘法:
*、/、//、%、\\、.*、./加法:
+、-、.+、.-比较:
==、!=、<、<=、>、>=、.==、.!=、.<、.<=、.>、.>=从属:
in、not in逻辑与:
and逻辑或:
or管道:
|>Binding 构造:
=>绑定、赋值和函数箭头
比较和从属运算不得隐式链式解析。
a < b < c # 非法
a < b and b < c # 合法
表达式位置的 => 构造 Binding 值,语义由 LSR-011 定义 [5]。
match 分支中的 => 不按表达式运算符解析,由 LSR-005 定义。
7. Expr 直接定义¶
Expr 允许由 Lamina 表达式直接定义,不需要通过标准库字符串解析函数创建。
sym x
let expr = x^2 + 1
let roots set<Expr> = {-1, 1}
let domain = std.interval_closed_open(0, 1)
let call = max(x, y, 0)
当期望类型为 Expr 时,数值字面量、符号、函数调用和集合可以构造符号表达式;区间通过普通的标准库函数调用构造。具体提升边界由 LSR-016 定义 [4];本规范只规定可用 token 和表面语法。
本规范不要求标准库提供通用的表达式字符串解析入口。若实现内部或第三方库接收表达式文本,该文本不得扩展本规范列出的运算符 token,乘法仍必须显式写作 *。
8. 保留与禁止¶
以下 token 在核心语言中保留,未定义语义前不得被库代码重新解释:
.....?:??::@
以下写法不属于核心运算符:
&&||**隐式乘法
未列入本规范的数学符号
Lamina 源码和表达式文本中的幂运算固定为 ^。
使用未列入本规范的 token 必须产生词法或语法错误。实现不得把未知 token 当作标识符、函数名或库可重载运算符继续解析。