音变
音变页管理规则集。一个规则集是一段规则文本:音类声明、多合字母、阶段快照、规则,从上到下依次应用。同一种规则语言也用于正字法转写、文字映射和构形的形态音位规则,所以这一页的语法说明对全软件通用。
1. 规则集
顶部标签栏列出项目里的所有规则集,点击切换,按住拖可以换位置;「新建规则集」建空的;「导入」可以从音变姬三文件、Lexicanter 发音规则、Zompist SCA²、纯文本导入(见第 6 节);「导出」可以导出当前规则集,或者把全部规则集各存一份 .txt 放进一个文件夹。检视器里可改名、写备注、删除(可撤销)。
标签分组:跟浏览器的标签分组一样,一组标签前面有一个带颜色的分组名,点它收起或展开这一组(收起时仍露出正在看的那个标签,分组名上写着组里有几个)。
- 右键标签:「移到分组」(列出已有的组)、「新建分组…」、「移出分组」。把标签拖到另一组的标签上,也就挪进了那一组。
- 右键分组名:「重命名」、换颜色(蓝 绿 紫 橙 红 青 粉 黄 灰)、「分组左移」「分组右移」、「新建分组…」、「解散分组」(组里的标签变回不分组)。
- 没动过分组时,软件按阶段绑定的语言先分好两组:共时——所有阶段都绑同一门语言的(元音和谐、书面语 → 口语这类),以及构形流水线里跑的规则集;历时——阶段绑了两门以上语言的(祖语 → 子语言)。其余的不分组。阶段都绑在同一门语言的不同历时阶段上的(比如合并为阶段之后),按这个分法算共时,想放进历时就右键挪过去。
- 分组存在项目里;哪组收着记在本机。
规则文本本身是唯一真值,三种视图只是不同的编辑器:
- 规则列表(默认):每条规则一张卡片,编号从 1 起(只数规则行,注释与声明不占号)。点卡片展开可视化表单:目标、替换、多个环境、排除环境、注释;卡片上方是音类与多合字母面板,可以直接增删,圆框按住拖到另一个上就把那一行声明挪到它的位置。点选一条规则时,测试台会显示「推到这一条为止」的中间结果,卡片上还有一个示例词的变化动画。规则卡片可以拖动:拖到别的阶段里,或者拖到某一条规则前面;拖的过程中落点会空出一行虚线框,松手就插在那儿。每段末尾除了「新增规则」「新增阶段」,还有「新增重音规则」「新增特征」(第 4.5、4.6 节):这两种行是带底色的卡片,重音规则读成一句话(「倒数第 2 个音节(环境 _CC) 否则 倒数第 3 个音节」),双击打开逐条编辑的表单。表单里「点击插入音类」那一排除了音类和
@语素,还有σ、ˈ和定义过的特征;项目里语素多、超过五行时在那一块里滚动。每个阶段(-*那一行)前面有折叠三角,收起的阶段写着里面有几条,点一下展开;有两个以上阶段时,上方出现「阶段全部收起 / 阶段全部展开」。收起状态按规则集记在本机。 - 链图:思维导图式展示阶段与规则链,点节点定位。
- 源代码:带行号与高亮的文本编辑器,语法错误逐行标红,警告标黄,底部列出全部诊断,点行号跳转。
底部状态栏:规则数、阶段数、音类数、诊断计数、「导出为文本」、「整库演化」。规则语言的完整语法见本页第 4 节(标题旁的「使用指南」直达)。
2. 阶段快照与语言绑定
-* 名称 记录到达该行时的词形并起名。测试台按阶段分列显示;检视器「阶段对应的语言」把每个阶段绑定到项目里的一门语言。绑的语言分了历时阶段时,旁边多一个下拉,挑绑到这门语言的哪个阶段(也可以「(不指定阶段)」)。绑定的用处:
- 构形的「拼接后跑音变」生成器可以指定从哪个阶段推到哪个阶段。
- 整库演化默认用第一个绑定阶段的语言当源、最后一个当目标。
- 规则解析时会用第一个绑定语言的音类与多合字母作为基础。
- 词库词条卡的「历史形式」:从词源来源所在的语言(或阶段)到这个词所在的语言(或阶段),中间每个阶段标记都绑上了,词条卡上就能列出一路推下来的形式(见词库 · 历史形式)。
引用另一套音变的一段
两套音变共用一段历史(两门姊妹语都从同一段祖语变化走下来)时,不用把规则抄两遍,写一行:
-@ Proto → Aelith : 祖语 .. 现代语
跑到这一行时,就把那套音变里从「祖语」到「现代语」之间的规则原样跑一遍。冒号和阶段都可以不写(-@ Proto → Aelith),那就是整套。
- 共用的那一段只维护一处:那边改了,引用它的这边跟着变。
- 引用来的阶段在这边也算数——测试台按它们分列,检视器的「阶段对应的语言」也列出它们;跟自己这边同名的阶段算作同一个。
- 被引用的那套按它自己绑的语言解析:音类、多合字母各是各的,互不影响。
- 规则列表里引用行单独占一行,右边的「打开」跳到那套音变。引用可以套引用(最多四层);转着圈引用、规则集名字或阶段写错,都会在那一行上写明原因。
3. 测试台(检视器)
- 输入词:每行一个,空格也可分隔;随规则集保存。
- 输出表:每个词一行,按阶段分列;有变化的格子高亮。点一行看轨迹:命中的每条规则、变化前后、所在阶段,点规则号跳到编辑器对应行。
- 规则集里有重音规则时,从那一行起每一列都带着重音记号,
ˈ用橙色标出来(次重音ˌ淡一些);轨迹里重音规则那一步写成ˈ = …。 - 输入的词对上规则集第一个绑了语言的阶段那门语言(都没绑时是当前语言)里勾了「对重音影响」的词条或语素时(去掉两头的连字符比),重音规则会用上它的词类和特殊重音(见 4.5)。
- 在列表视图选中某条规则时,输出表切换为「至第 n 条」的中间形式。
4. 规则语言
4.1 一段文本里可以写什么
; 分号到行尾是注释;行首 # 也是注释(兼容旧文件)
V=aeiou ; 单字母音类:成员按字符拆
{Vlong}=ā ē ī ō ū ; 长名音类:成员用空格或逗号分隔;不分隔则按字符拆
th|θ ; 多合字母:匹配前把 th 当成一个单位 θ,输出时换回
[+送气] = ph th kh ; 特征:从这一行起规则里可以写 [+送气]、[-送气]
ˈ = -2 / _CC , -3 ; 重音规则:到这一行时给词标上重音
-* 祖语 ; 阶段快照:记录此刻的词形并起名
a > e / _i ; 规则
-* 现代语
规则从上到下依次应用;每条规则在整个词内从左到右反复匹配。音类和多合字母声明可以写在任何位置,都对整段文本生效;特征和重音规则按行生效,写在哪一行就从哪一行起算。音系页定义的音类与多合字母自动可用,文本里同名声明会覆盖它们。
4.2 一条规则
目标 > 替换 / 左0_右0 , 左1_右1 , … - 左排除_右排除 , 左排除_右排除 …
| 部分 | 说明 |
|---|---|
| 目标 | 可含音类、临时音类 [abc]、() 可选段。留空表示增生 |
| 替换 | 可含音类(包括 [bdg] 这样的临时音类);目标里的第一个音类与替换里的音类按位置一一对应(V > {Vlong} 把第 n 个元音变成第 n 个长元音);成员可以重复,两个音并成一个时同一个成员写两遍({甲}=t d s 对 {乙}=r r z),位置才对得上。写编号音类 C1 输出同编号匹配到的那个音。留空表示删除。\ 换位(多于两个字符则整体倒序)。2 双写 |
| 环境 | _ 是目标所在位置,左右可留空但 _ 不能省;没有 / 等于任意环境。多个环境用 , 分隔,依次应用(后一个环境看到的是前一个改完的词) |
| 排除 | 用 - 引出;命中排除环境的位置不变。几个排除用 , 隔开,落在任何一个里都不变 |
满足 / 不满足环境:目标、替换里写一个 ?,一条规则分成两路——? 前面是满足环境时怎么改,后面是不满足时怎么改。
| 写法 | 意思 |
|---|---|
x > a?b / 环境 |
满足环境的 x 改成 a,其余的 x 改成 b(p > b?f / V_V:元音之间变 b,别处变 f) |
x1?x2 > a?b / 环境 |
满足环境的 x1 改成 a;不满足环境的地方 x2 一律改成 b(t?d > s?z / _i) |
x1?x2 > a / 环境 |
满足时 x1 改成 a,不满足时 x2 改成 a |
a、b 可以是任何替换写法:音类对应([ptk] > [bdg]?[fθx] / V_V)、\ 换位、2 双写、留空删除;满足时换位、不满足时双写写成 \?2。「满足」是对上任意一个环境、又不在排除里,其余位置都算不满足;两路都按这条规则改之前的词判断、一次改完,同一处两路都对得上时按满足那一路。目标、替换里各只能有一个 ?,环境里的 ? 仍是跨位置;要写问号本身用 \?。
4.3 环境里的记号
| 记号 | 含义 |
|---|---|
# |
词首(左侧)或词末(右侧)。测试台、自动标音、整库演化、文字转写遇到带空格的输入时按空白逐词跑,每个词各有自己的词首词末;构形流水线里跑音变时整个形式算一个词 |
¢ |
复合词内部边界(只是一个普通符号,用完可以 ¢ > / _ 删掉) |
(x) |
可选 |
x\|y |
多选其一,如 #\|C_ |
? |
跨位置:_?m 表示其后任意位置有 m(只在环境里;目标、替换里的 ? 是满足 / 不满足两路的分隔) |
[xyz] |
临时音类 |
V、{Name} |
引用音类:这个音类里任意一个,每写一次各算各的(_CC 是任意两个辅音) |
C1、C2、V1… |
编号音类:同一条规则里编号相同就是同一个音(_C1C1 是同一个辅音双写;C1C2 两个辅音可同可不同) |
@名 |
引用语素(gloss 或去掉连字符的形式),成员是它的全部异体形;替换侧也可写 @名 |
t.h |
点号隔开两个字母,防止被当成多合字母 |
σ |
音节边界:两个音节之间,词首词尾、· - 这类分隔符两边也算(4.4) |
ˈ、ˌ |
重读、次重读音节的开头,要先有重音规则标上(4.5) |
[+送气]、[+浊 -鼻] |
特征:有 / 没有这个特征的任意一个音,几个写在一起取交集(4.6) |
\?、\.、\#、\C、\σ… |
反斜杠加一个符号:就是这个字符本身,不当规则符号、也不当音类(\? > ⸮;希腊字母本身写 \σ);替换侧单独一个 \ 仍是换位 |
未在环境里特殊处理的字符原样进入正则表达式,因此 | 等可以直接用;反过来说,+、* 之类要按字面匹配时在前面加反斜杠(\+、\*)。
整理成一页的规则语法在软件里随时能查:首页的「规则语法」,或者顶栏右上角的翻开的书图标(检视器按钮与关闭项目之间),会在右侧检视器里打开;在音变、构形、文字、音系、语素页打开时直接滚到相关的那一节。
4.4 音节边界 σ
规则里写 σ 表示「这里是音节边界」。匹配前先把词划成音节,σ 对上音节和音节之间,词首、词尾,以及 · - ‿ = 这类分隔符的两边也都算边界;没写 σ 的地方照常匹配,不受音节影响。
音节按这门语言在音系页「音节与韵律」「配列」里的设置划:音节核是元音音位、名为 V 的音类或配列里的音节核(规则文本里自己定义的 V 也算),辅音尽量划给后一个音节的起首,受「合法起首」表和音节模板限制。多合字母、音位表里的多字母音位(ts、aɪ̯)算一个音;认不出的字母按 IPA 表判断是不是元音,所以正字法规则写到一半、词还是拼写的时候也划得出来。
| 写法 | 意思 |
|---|---|
d > t / _σ |
音节末的 d 清化,词尾也是音节末:ad.ma → at.ma |
k > g / σ_ |
音节首的 k 浊化 |
V > Vː / _σ |
开音节里的元音延长 |
> ə / Cσ_C |
跨音节的两个辅音中间插 ə:ak.ta → akəta |
a > e / σC_Cσ |
一个 CVC 闭音节里的 a |
音节按规则那一步的词形划:前面的规则改了词,后面用 σ 的规则按改过的重新划。要写希腊字母 σ 本身,写 \σ。
4.5 重音规则
一行 ˈ = 条目 , 条目 , … 是重音规则:词走到这一行时,按条目挑一个音节,在它前面标上 ˈ。标上的重音跟着词往下走——后面的规则照常匹配,音和音之间隔着 ˈ 也对得上;被换掉的那段里原有的 ˈ 按原来的位置放回去——直到下一条重音规则再重新标。打不出 ˈ 可以写 ';ˌ = … 标次重音;ˈ = 后面什么都不写就是去掉重音。
条目从左往右试,第一条对上的算。一条写成 <词类> (音节数) 位置 音节核 / 环境 - 排除,除了位置都可以省:
| 部分 | 写法 | 意思 |
|---|---|---|
| 词类 | <名词>、<名词\|形容词>、<!动词> |
只对这些词类的词,开头 ! 是「不是这些」;词库、语素里勾了「对重音影响 → 传递词性」的词才带着词类,没带的跳过这一条 |
| 音节数 | (2)、(3+) |
这个词恰好 2 个、至少 3 个音节时才看这一条 |
| 位置 | 1、2、-1、-2、-3 |
第几个音节,负数从后数 |
*、-* |
从前、从后找第一个合条件的音节 | |
0 |
不重读 | |
| 音节核 | {长元音}、[áé] |
这个音节的核里有它 |
| 环境 | / _CC |
_ 是音节核:核后面接着两个辅音(跨过音节边界也算) |
| 排除 | - #_ |
对上排除的不算 |
没写条件的条目,词不够长时落到最近的一头(单音节词的「倒数第三个音节」就是它自己);写了条件的,词里没有那个位置就跳过。末尾写 | 分隔符 段,按这些分隔符把词分成几段各算各的,主重音落在第几段(1 第一段、-1 最后一段),其余段是次重音。
单独一条 @(一般写在最前面)是词条自己的特殊重音:词库、语素里勾了「对重音影响 → 传递特殊重音」的词,整个词按那里选的音节重读(选「不重读」就不标),后面的条目都不看;没勾的词接着试下一条。词类和特殊重音在自动标音、整库演化、构形里的「音变」步骤、音系页的样例和测试台里都会带上。构形加了词缀时,特殊重音还落在原来那个音节上;语素自己标了特殊重音的,重音改落到这个词缀上;语素选了「算作」某个词类的,整个词算作那个词类。
| 想要的重音 | 写法 |
|---|---|
| 倒数第二个音节 | ˈ = -2 |
| 拉丁式:倒数第二个音节是长音节就重读它,否则倒数第三 | ˈ = -2 {长元音} , -2 / _CC , -3 |
| 最左边的长元音,没有就第一个音节 | ˈ = * {长元音} , 1 |
| 复合词各词分开算,主重音在最后一个词 | ˈ = -2 , -1 \| · -1 |
| 长词的第一个音节带次重音 | 另起一行 ˌ = (4+) 1 |
| 动词重读最后一个音节,其余倒数第二 | ˈ = <动词> -1 , -2 |
| 代词、小品词不重读 | ˈ = <代词\|小品词> 0 , 1 |
| 个别词的重音特殊 | 词条里勾「对重音影响 → 传递特殊重音」选好音节,规则写 ˈ = @ , -2 |
规则里用重音:ˈ 对上的是重读音节的开头。a > aː / ˈ(C)(C)_ 让重读音节里的 a 延长,V > ə / σ(C)(C)_ - ˈ(C)(C)_ 让非重读音节的元音弱化。
音系页「音节与韵律」的重音位置选「自定义重音规则」时,写的就是 = 后面那一截(见音系 · 音节与韵律)。
4.6 特征
一行 [+特征名] = 成员 成员 … 定义一个特征,成员用空格隔开(ph 是一个成员)。从这一行起,规则里写 [+特征名] 是「有这个特征的任意一个音」,[-特征名] 是没有的。
| 写法 | 意思 |
|---|---|
[+送气] = ph th kh |
定义「送气」 |
[-送气] = p t k |
也可以列出不送气的;没列时 [-送气] 指送气音以外的任何一个音 |
a > e / [+送气]_# |
送气音后面的词尾 a 变 e |
[+送气] > [-送气] / _C |
辅音前的送气音变成对应的不送气音(两边都列了成员,按位置对应) |
i > / [+浊 -鼻]_# |
几个特征写在一个方括号里取交集 |
特征跟音类的区别在生效范围:音类对整段规则有效;特征按行生效,写在哪一行就从哪一行起能用,后面可以重新定义——比如一条音变把 ph 变成了 f,之后再写一行 [+送气] = th kh。方括号里是 +名、-名 时才是特征,[ptk]、[^aeiou]、[a-z] 仍是临时音类。
4.7 示例
V=aeiou
{Vlong}=ā ē ī ō ū
C=ptkbdgmnlrsh
-* Proto
e > a / _h , h_ ; e 在 h 旁边变 a
V > {Vlong} / _# ; 词末元音延长
h > / V_V ; 元音间 h 脱落
> e / #_[nm]C ; 词首鼻音 + 辅音前增生 e
bm > \ / _ ; bm 换位为 mb
p > pp / V_V - _# ; 元音间 p 双写,但词末不算
[+浊] = b d g
[-浊] = p t k
ˈ = -2 {Vlong} , -2 / _CC , -3 ; 拉丁式重音,之后的词形都带着 ˈ
[+浊] > [-浊] / _σ ; 音节末的浊塞音清化
V > ə / σ(C)(C)_ - ˈ(C)(C)_ ; 非重读元音弱化
-* Modern
4.8 常见写法
| 想做的事 | 写法 |
|---|---|
| 词末元音脱落 | V > / _# |
| 元音间清塞音浊化 | [ptk] > [bdg] / V_V(临时音类按位置对应) |
| 两个音并成一个 | 定义 {甲}=t d、{乙}=r r,写 {甲} > {乙} / V_V:元音之间的 t、d 都变 r(右边的 r 写两遍) |
| 元音和谐(前后) | 先定义 Back=aou、Front=eöü,写 A > a / Back?_、A > e / Front?_(A 是原音位占位) |
| 双写辅音单写 | C1C1 > C1 |
| 删除语素界标 | ¢ > / _ 放在规则集末尾 |
| 某个后缀的辅音交替 | @lar > @ler / Front?_(两个语素各自的异体形按位置对应) |
| 只在某阶段之后生效 | 把规则写在对应 -* 标记之后 |
| 音节末清化 | [bdg] > [ptk] / _σ |
| 开音节里的元音延长 | V > Vː / _σ |
| 非重读元音弱化 | 先写重音规则(如 ˈ = -2),再写 V > ə / σ(C)(C)_ - ˈ(C)(C)_ |
| 送气音后面的 a 变 e | 先写 [+送气] = ph th kh,再写 a > e / [+送气]_ |
5. 诊断
未定义的音类会报警告并按字面字符处理;引用还没定义的特征也报警告,那一处什么也匹配不到;缺少 >、环境里没有 _、重音规则的条目不以位置开头等报错误,该行跳过。诊断在源代码视图逐行显示,也列在底部;有错误时状态栏显示红色计数。
6. 导入其他格式
| 来源 | 处理 |
|---|---|
音变姬 Category.txt / Replace.txt / Rule.txt |
三个文件直接拼接,语义完全一致(有回归测试保证:236 条规则的整库输出逐词比对) |
| Lexicanter 发音规则 | {a,b} 联合 → [ab];^ → #;∅ → 空 |
| Zompist SCA² | 目标/替换/环境/排除 → 目标 > 替换 / 环境 - 排除;* → ? |
| 纯文本 | 原样作为新规则集 |
选好文件后先在主区的导入面板里确认规则集名称和文件格式(选错了可以改),检视器里显示转换出来的规则文本;改了格式马上重新转换,变了的行先高亮再慢慢褪掉。点「导入」才新建规则集。
7. 整库演化
底部「整库演化」按钮展开面板:把源语言的全部词条按当前规则集推到目标语言,并自动建立词源链接。词头里有空格的,每个词各自演化(跟测试台一样);规则集里的重音规则标上的 ˈ 不会带进新词头。
| 选项 | 说明 |
|---|---|
| 源语言 / 目标语言 | 默认取第一个与最后一个绑定了语言的阶段 |
| 起始 / 终止阶段 | 输入已经是起始阶段的形式则跳过其前规则;推到终止阶段为止 |
| 输入字段 | 词头、某个词干槽,或源语言的语素表(词根表在语素页时用这个) |
| 词类筛选 | 只处理某个词类 |
| 复制义项与标签 | 新词带上源词释义 |
| 更新已派生词的词头 | 改了规则重跑时,只改词头不重复建词 |
| 词头冲突时仍新建 | 目标语言里已有同拼写、但没有词源链接的词,默认跳过 |
流程:预览(表格列出输入、输出、目标语言里已有的词、动作:新建 / 更新 / 未变 / 跳过)→ 写入目标语言。新词的词源类型是「继承(音变)」,来源指向源词条或源语素,protoForm 记录输入形式,备注写规则集名。之后在词库的关系图里能看到整条继承链。
8. 与其他模块的关系
- 音类与多合字母可来自音系页;
@语素来自语素页。 - 阶段绑定语言后,构形的「拼接后跑音变」生成器与整库演化都会用到。
- 正字法规则、文字映射规则用同一套语法,但各自独立存放。
荏苒之境
kikomas
Cathamos