跳到正文豫言技术文档

豫言 / 技术规范

本篇描述 4cdeca1 的实现。版本与适用边界见基线说明。

雅言文体

雅言是豫言源码的写法(提案 00026、00027,含提案 00024 的首支或有),编译器、格式化器与各工具都按雅言解析与打印。解析先得具体语法树,展开与其后各阶段见词法与语法。

一、写法

构造 写法
函数类型 化「数」为「文」
多参函数类型 化「甲」又化「乙」为「丙」
带标签的参数类型 化「起」曰「数」为……
可省参数 化「宽」曰「数」可阙为……
依值参数 化「长」属「数」为……
带标签的依值参数 化「起」曰「长」属「数」为……
隐式类型参数 凡「甲」又凡「乙」而……
隐式值参数 凡「长」属「数」而……
匿名函数 得「甲」又得「乙」而 体
带类型的匿名函数 得「项」属「数」而 体
带标签的匿名函数 得「起」曰「甲」而 体
带标签又带类型的匿名函数 得「起」曰「甲」属「数」而 体
带默认值的参数 得「宽」曰「宽值」阙则「二六」而 体
隐式匿名函数 设「甲」又设「乙」而 体
局部名 令「甲」为 值 而 体
局部递归 复令「名」属 类 即 值 而 体
带标签的调用 「截取」于「起」曰「零」
类型实参 「遍」以「数」又以「文」
类型标注 「零点二五」属「小数」
先后 甲 而后 乙
鉴的分支 鉴「值」而或有 模式 则 甲 或有 模式 则 乙
签名、构造器 类型以化、凡开头时 「名」乃化……者也、「枝」立化……者也,其余写 ……也
算术与比较 「甲」加「乙」(减、乘、除以、大于、小于、等于、不等于同)
非 非「甲」
字符串相接 甲 接 乙

导入、定义 「名」者 值 也、类型别名 「名」即 类 也、条件 若……则……否则……、调用的 于、且、或、与、合、中、之、列、组值、组类、构造写法、注释、数字、卦码 卦曰「名」(见词法与语法词三)与字符串的写法见词法与语法。

第二个起的参数以“又X”接:类型里 又化、又凡,匿名函数里 又得、又设,类型实参 又以。“又X”与对应的“为”“而”写法同义,只是右边须是同类的构造:化「甲」又化「乙」为「丙」 与 化「甲」为化「乙」为「丙」 是同一棵树,打印时一律写前者。

签名与构造器加不加“者”,只看类型的开头一字:以化、凡开头(函数类型或隐式参数类型,不在括号里)时以“者也”收,否则以“也”收;收错了报错。组类里的项同此。

算术与比较的中缀是前缀调用的简写:「甲」加「乙」 就是 「加」于「甲」于「乙」,按作用域找名字「加」,只看外形,不看类型;非「甲」 就是 「非」于「甲」。限定名(如 「分厘」之「加」)照旧写前缀调用。

二、解析

解析器由操作符表驱动(移位规约,见词法与语法),操作符表是雅言符集(库/章句/译料/算符/本算符/雅言符集。豫)加上内建符,规约关系见规约关系表。几条额外的约束:

  1. 依值参数与类型标注。 化「长」属「数」为…… 读作依值参数。化、曰之后的类型若是没有括号的类型标注,这一种读法作废;要以类型标注作定义域,写在括号里:化(「甲」属「乙」)为……。
  2. “又X”的约束。 化〇又〇、凡〇又〇、得〇又〇、设〇又〇 的右项(去掉注释后)须是同类的构造,〇又以〇 的左项须是以类型实参结尾的调用,否则这一种读法作废。
  3. 者也。 签名与构造器的类型以化、凡开头时须写“者也”,否则须写“也”,写错即报错。
  4. 可省参数必须带标签。 化 类 可阙为…… 报错,提示写作 化「标签」曰 类 可阙为……。

表在造表时就把各类关键词算好并拆成字(库/章句/译料/算符/操作符表。豫)。解析同时产出语义标记:乃、立、者也等为结构操作符,化、为、又、凡、曰、属、以等为类型操作符,得、而、令、复令、设、鉴、或有、若等为控制操作符,语言服务的着色与悬停据此显示。

三、打印

打印器在 库/章句/分职/文体/雅言/,一个式能平铺进当前行就平铺,放不下按形状分行,括号原样印出,需要而原树没有的括号由打印器补上。几条写法上的规则:

  1. 调用 「加」 等恰有两个不带标签的显式实参、头上没有注释时印成中缀;调用 「非」 恰有一个时印成前缀 非。
  2. 函数类型链分行时每节一行,第二节起以 又 开头,最后一行以 为 开头;签名的“者也”紧接在链的最后一行之后。隐式参数之后接别的类型时,而 留在行尾。
  3. 匿名函数的开头放不下一行时每个开头一行,同类相接的以 又 开头;而 一律留在行尾,函数体另起一行。局部名、局部递归的值之后的 而 也留在值的末行之尾。
  4. 局部递归的值是匿名函数时,即 另起一行深一层,函数体再深一层。
  5. 而后 连接的式各占一行,而后 留在行尾。
  6. 括号里单独写出的分支串(解析成没有对象、只含分支的模式匹配节点,或单是一支)每支一行,不写 鉴 与对象。

四、核对

  • 库/译场/测试/雅言打印。测试。豫:样例按雅言解析、打印、再解析,两棵树须相同(括号不比),打印结果与期望逐字相同,再打印一遍不变。
  • 格式检查(./格式检查。林檎。豫行,见源码格式化的包说明)对每个文件按雅言解析、打印、再解析核对。