豫言 / 技术规范

此篇据 4cdeca1 之实现。所据及适用之界,见基线之篇

词法与语法

式之成,未必类与值之合法;后篇验之。混合位置之符有消歧,不可任解析器自定高下。

词一:扫描

依 UTF-8 字符读,外层明弃 U+0020、U+0009、U+000A;不擅弃 BOM、U+000D 或全角空白。换行不终句。名、串、注释中之标点不作外符。

设外层、名、串、转义、注释五态。外层先识 「: 为注释,次 为名, 为串,余非空白留具体字符。名读至首 ,不反斜转义,不正规化;空名虽可扫描,不谓可作绑定或式。串至未转义 ,可含真换行;诸定界未闭则拒。

串内 「:…:」 为转义,非注释;仅容下表:

原文 所得
「:换行:」 U+000A
「:制表:」 U+0009
「:』:」
「:「::」 「:

反斜 \n 不特释,未知转义拒之。注释遇 「: 增深,遇 :」 减深,外层闭乃出。注释无运行作用而存文字与方向;本行已有元素则后置,否则前置,换行清其状态。

词二:由名辨数与内建

绑定既成,惟自由名依次辨之,不再改已绑定索引。先阳、阴、元;次完整内建类型名 《《内建类型:字符串》》 等,七类为字符串、整数、小数、动态分类值、有、爻、元类型;次完整爻阳阴与有元之名,及类型篇所列内建术。

余非空名,诸符皆在 0123456789.零一二三四五六七八九点,乃尝解析数。无点则十进逐位积;一分隔则分整小部;多分隔不作数。未成者仍为自由名。一二三 为一百二十三;十、负一、-1、1e3 不由此法识。空分隔部依实际分隔与用例判,不谓扫描成功即数有效。数非任意精度;小数字面兼存阿拉伯整小部及宿主近似,LLVM 取前者,不取六位打印之文。

语一:句形

下列为元语法,花括重复、方括可选;并非源码。名、串各有其定界。

文件 = { 声明 "。" | "。" } [ 声明 ] ;
声明 = 导入 | 名 ("乃" | "者" | "即" | "立") 式 "也" | 式 ;
导入 = ("寻" | "观" | "诵" | "寻观" | "寻诵" | "观诵" | "寻观诵") 路径 "之书" ;
路径 = 名 { "之" 名 } ;
式 = 名 | 串 | "(" 式 ")"
   | "会" 名 "而" 式 | "遇" 式 "者" 名 "而" 式 | "受" 名 "而" 式
   | "化" 式 "而" 式 | ("化" | "承") 式 "者" 名 "而" 式 | "承" 名 "而" 式
   | "虑" 名 "者" 式 "而" 式 | "递归虑" 名 "其" 式 "者" 式 "而" 式
   | "若" 式 "则" 式 "否则" 式 | "鉴" 式 "而" 分支 { "或" 分支 }
   | 式 ("于" | "授以" | "之" | "中" | "与" | "合" | "也" | ";" | "附") 式
   | 序列首 "【" [ 式 { "," 式 } [ "," ] ] "】"
   | "《《C调用》》名" 式 "传" 式 | "循" 名 "以" 式 ;
分支 = "有" 式 "则" 式 ;
序列首 = 名 | "《《C调用》》名" 式 ;

切句惟圆括深度零而遇具体 ;空句弃,末无句号之非空句亦析。名串内句号已在令牌中。普通括号不容内联结构。鉴无自有末也;也常归外声明。或有是或与有相邻,非布尔或;合非联合类。

语二:成树之术

操作符由固定文字、式槽 、绑定槽 成。保存各组件候选,不以最长关键词尽弃短者。绑定槽惟一名并接固定组件,式槽参递归解析。

可用共享子树之图表解析或多状态移入规约:逐读、扩候选、完模式而规约;两规约相争,查关系表。左规约先完左式,右规约使右式占槽;未定则留可行状态。形状约束亦须验,如投影之名、序列之首。

终须唯一合法树;无则拒,多不等价亦拒,不凭容器首项。括号强内部先成,自身不入类型树。后备先取“右为 〇也〇 且左异,则左规约”;次“左不始〇、右始〇,则右规约”;余不加臆约。

f 于 a 于 b 脊为 a、b;f 于 a 附 bf 于 (a 附 b)A 合 F 于 XA 合 (F 于 X)。空白先弃,不设英语词界。

语三:构树与糖

会为无标注显式抽象,遇为有标注显式抽象,受为隐式类参抽象。绑定仅及其体,不及参数类型。化 A 而 B 若 B 已为连续箭头,则前加 A;承引全称,相邻全称合数。旧化/承带名形式,定义域须语法上元类型或相应节点,不能以任意等义别名代之,皆降隐式全称。

于、授以分别追加显隐实参,已有脊不复二叉包裹。A 也 e 左类右物,运行只存 e。虑之名仅及后式;递归虑之名分别及定义与后式,不及其类型。

与、合展平右元组,左元组仍嵌套。中之索引须语法期整数常量,非动态索引;之之右须名称,静态投影。附先按字符串检查并绑定左右,再调用 豫言_字符串拼接,临名须避捕获。

列括号依右折成缀与罄,空者罄;模式同化。典留配置树,普通运行检查不以为字典值。扩展头留相应阶段解释,不任意执行。C 调用括号与传同:零项元、一项本项、多项元组。

循 x 以 e 今惟还 e,不设递归绑定。不可复作不动点。括号不阻右元组或箭头展平:a 与(b 与 c) 三项,(a 与 b)与 c 首项嵌套。亦不可凭括号增部分应用之界。

语四:声明预处理

乃与紧随同名者/即合一项;孤签名、异名、中夹声明皆拒。合后对定义同名抽象;声明类型箭头/全称,或定义为函数,则设递归,否则去顶层绑定。无签名者无此自动递归。

普通命名项初为公开,无私有关键字。裸顶层式给内部匿名名而占定义位。寻观诵先展内部操作,名称解析再消费或展开它们;不得把源码行序直接当 ABI 定序。

语五:解析试例

「整数」也「一」 是标注;「整数」中「一」 虽成语法,验类当败。中后非数名,语法拒;未知首 「甲」【「一」】 不作调用。裸一或 1 非数字式,须在「」中。定界未闭,于其态报错,不吞下一文件。