| name | quoted-ids |
| description | 豫言源码引号标识符迁移规则。用于编辑 .豫/.yuyan 编译器或库代码,把所有普通名字写成「」形式,同时保持语法关键字、列表括号、占位符、字符串字面量、注释和操作符声明结构正确。 |
引号标识符迁移规则
使用本规则迁移豫言源码:只保留真正的语法词和语法符号为裸字;凡是名字、类型名、构造器名、函数名、局部变量名、模式变量名、模块路径段,都写成 「名字」。
基本原则
- 手工修改,补丁要小,便于逐行检查。不要用大范围正则或格式化器整文件重写。
- 只改变名字写法,不改变声明结构、调用结构、操作符结构、字符串内容或注释内容。
- 迁移前后必须保持同一个程序结构:不要删除顶层声明、顶层执行表达式、
鉴 分支、虑...而 链或括号块。若文件行数大幅减少,先停下来比较旧版本。
- 一次只迁移一个文件。动手前先读目标文件,至少读完所有将要修改的语法区域。
- 不要修改
*_v0/、豫言编译器_v0/、yylib_v0/ 里的文件,除非用户明确要求。这些目录是回归对照基线。
- 遇到疑问时,优先参考
豫言编译器/ 中已经迁移过的相邻代码;诊断迁移遗漏或误删时,可以用 _v0 对照程序结构,但不要把 _v0 的裸字语法直接复制到已迁移文件。
- 默认命令都假定从当前仓库工作目录运行;不要在规则里臆造其他工作目录,也不要无故切换目录。
- 迁移规则不清、验证失败原因不明、或为了通过验证需要猜语法时,停下来向用户确认。不要为了“让验证过”而猜测并扩大修改范围。
需要加引号
普通名字凡出现都加引号:
- 模块导入路径段:
- 顶层函数、值、类型、构造器、数据名:
「代码生成」乃化「字符串」而...
「代码生成」者...
「所有外部调用」乃「引用类」于...
- 类型表达式中的类型构造器和库类型:
「所有外部调用」乃「引用类」于(「串典」于「整数」)也。
「输出可执行文件路径」乃「引用类」于(「或可有」于「字符串」)也。
- 标准库函数、构造器、类型名也要加引号:
虑「输出引用」者「新引用」授以「整数」于「零」而
- 例如
「新引用」、「读引用」、「写引用」、「整数」、「小数」、「字符串」、「爻」、「阳」、「阴」、「元」。
虑...者 引入的局部绑定名:
会...而 引入的参数名:
- 类型变量和类型参数也是名字:
承「甲」而承「乙」而化「甲」而「乙」
化(化「甲」而「字符串」)而化「甲」列而「字符串」
鉴/有 分支中的模式变量和构造器参数名:
有(「式节点」于「内联虑」于「当前」衔「下个」衔【】)则
- 用户定义函数和库函数调用:
「编译调试打印行」于...
「当前路径转模块全局名」于「路径」
- 投影或字段位置上的程序名字:
- 抽象语法树节点名和构造器名:
「式节点」、「自由变量」、「拉姆达抽象续延无绑定」、「爻分支节点」
- 数字需要引号:(零)(一)(二)(三)(四)(五)(六)(七)(八)(九)
保持裸字
只保留语法词和语法符号为裸字:
- 核心语法:
虑 者 而 也 于 授以 之 鉴 有 则 或 若 否则
- 类型和声明语法:
化 承 受 会 循 立 乃 号 即 术 交 无序 盖谓
- 导入导出语法:
寻 观 诵 导入 打开 导出 并打开 书
- 对子和投影语法:
与 合 中 其实
- 字面量和分隔符:
『...』 《《...》》 【】 () , 。 ;
- 操作符声明占位符:
〇、□
- 常用中缀、后缀或结构操作符:
加 减 乘 除以 附 衔 接 列 等于 不等于 小于 大于 且 与 合 中
不要因为一个名字像内建概念就保留裸字。阳、阴、元、整数、字符串、爻 等作为名字出现时,都写成 「阳」、「阴」、「元」、「整数」、「字符串」、「爻」。
源码中永远不会出现并列的标识符 比如 「甲数」「加」「乙数」
如果一个词在当前上下文中是操作符,就不能加引号:
- 正确:
「个数」减「一」
- 错误:
「个数」「减」「一」
- 正确:
(「左」小于「右」)且(「甲」等于「乙」)
- 错误:
(「左」「小于」「右」)「且」(「甲」「等于」「乙」)
类型构造器写法
类型构造器应用有两种合法写法:
不要写成:
解释:普通 于 调用中,构造器也是名字,所以要写 「可有」于「物」。紧凑类型构造器写法中,构造器裸写并紧贴参数,所以 可有「物」 可以;但参数 物 仍然是名字,必须写成 「物」。
列 后缀和名字边界
列 既可能是类型后缀,也可能只是某个普通名字的一部分。迁移时先判断上下文:
- 类型位置中,
组件列 表示“组件的列”,写成 「组件」列。
- 值、参数、局部变量、字段、函数实参中,
组件列 是一个普通名字,写成 「组件列」。
- 不要把值位置的
组件列 改成 「组件」列,这会把一个变量误写成类型后缀结构。
例:
- 正确类型:
化「组件」列而化「表达式」列而...
- 正确实参:
「构造操作符」于「组件列」于「行号」
- 错误实参:
「构造操作符」于「组件」列于「行号」
列表写法
【 和 】 是列表语法符号,保持裸写;列表内部的名字仍然照常加引号。
- 空列表保持
【】。
- 列表内容中的名字要加引号:
【「后名」,『 = 』,「表达式表示」于「当前」】
有「头」衔「尾」衔【】则...
操作符声明
术、交、无序、盖谓、〇、□ 是操作符声明语法,保持裸写。
- 操作符声明中出现的普通名字仍然加引号。
- 若操作符表面形式使用紧凑类型构造器写法,按“类型构造器写法”处理:构造器可裸贴参数,参数要加引号。
- 不要改动操作符占位符本身。
模式匹配和分支
鉴、有、或有、则 是语法词,保持裸写。
- 迁移分支时只给构造器名和模式变量加引号,不要删除
有/或有。
- 第一个分支通常是
有...则,后续分支通常是 或有...则;不要在加引号时把 或有 漏掉。
例:
- 正确:
鉴「项」而有(「可有」于「值」)则... 或有「可无」则...
- 错误:
鉴「项」而有(「可有」于「值」)则... 「可无」则...
不要修改的区域
以下区域内部不要改:
- 字符串字面量:
『...』
- 注释:
「:...:」
- 已经写好的引号标识符:
「...」
- 内建字面量形式:
《《...》》
- 生成出来的目标代码片段,例如 LLVM 字符串片段
如果注释里写了旧语法,默认保持不动,除非用户明确要求同步更新注释。
相邻名字
- 普通调用中,两个加引号的名字之间必须有操作符隔开:
- 紧凑类型构造器写法是例外:
迁移步骤
- 先读
语言指南.md 和本规则。
- 检查目标文件,区分导入、声明、局部绑定、模式匹配、函数调用、类型表达式、列表、字符串、注释。
- 对容易混淆的词先做分类:要加引号、语法裸字、语法符号、紧凑类型构造器、字符串或注释内跳过。
- 用
apply_patch 手工修改,保持补丁范围小。
- 修改后检查是否还有裸写的声明名、绑定名、调用名、模式变量名、类型名。
- 做结构保持检查:看
git diff --stat 和 git diff -- <文件>,确认没有整块逻辑消失。入口类文件尤其要确认顶层执行体还在,例如 入口。豫 必须保留处理参数、打印帮助、进入 regular/worker 模式的 鉴... 分发逻辑。
- 可疑选择参考
豫言编译器/ 中已迁移代码;需要确认是否误删逻辑时,用 _v0 对照结构,不把 _v0 的裸字直接复制为最终结果。
验证建议
若用户允许验证,按当前仓库最快方式检查:
- 编译器验证很慢,不要频繁运行;通常只在一小批手工修改后、用户要求验证时、或准备交付前运行一次。
- 优先用稳定自举编译器只做类型检查;命令默认在当前仓库工作目录运行:
./yy_bs_stable --type-check-only <路径>
- 如果完整检查太慢,至少做定向搜索和人工看补丁:
- 搜顶层裸声明:
rg -n '^[^「『:#[:space:]].*(乃|者)' <文件>
- 搜局部裸绑定:
rg -n '虑[^「『:[:space:]()]+者|会[^「『:[:space:]()]+而' <文件>
- 搜误加引号的操作符:
rg -n '「(且|加|减|乘|除以|附|衔|接|列|等于|不等于|小于|大于|中|与|合)」' <文件>,逐个确认是否真的是名字。
- 搜值位置误写成类型后缀的
列:rg -n '于「[^」]+」列|衔「[^」]+」列|接「[^」]+」列' <文件>,逐个确认是否应该是 「...列」。
- 看结构差异:
git -c core.quotePath=false diff --stat -- <文件>;如果行数或大块缩进结构变化很大,和旧版本或 _v0 对照。
- 看补丁:
git diff -- <文件>
- 如果验证不通过,并且错误指向规则不明确或可能需要语义判断,停止并向用户说明具体错误与疑问。不要继续猜改来追求验证通过。
如果没有运行验证,要在回复中说明。