Skip to content

May wenyan-lang subset for json 用文言的方式表达通用结构化数据

Notifications You must be signed in to change notification settings

lymslive/wenyan-json

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 

Repository files navigation

文言重器(wenyan-json)——用文言的方式表达通用结构化数据

序曰

形上谓之道,形下谓之器。欲求大道,先固小器。方今之世,程式盛行,盖为此信息世界 之中枢也。夫算法之深,可谓程式之道,而数据之广,可谓程式之器。虽以西学之源,中 文编程亦求索由久。昔有易语言、习语言,复有周蟒、中蟒,仅拟其形,未传其神。今有 文言编程,始信登堂入室,一呼百应。 承先人文字之精义,窥今世程式之奥秘,善莫大焉。然以完备语言之繁复,行外民众徒生 景仰而望之怯步。故效先贤之斧凿,择至简之子集以叙数据。虽为小器,举轻若重,尚其中 庸,堪为诸般风骚语言之所用,以通程式之道。是曰文言重器,惟愿同乘妙法,共筑此器。

简介

受 wenyan-lang 的启发,并参考 json 从 javascript 取子集的做法,设计 wenyan-json ,用文言语法表达通用数据结构。标准语法尽量精简化、最小化。同时提出 分级语法的主张,高级语法允许更多的冗余以更符合自然语言的诵读语法。具体的编译实 现需要权衡。

wenyan-json 简称 wson ,也可称之为 Wide Unicode Based Json 。wson 与 json 一 样,有且只有六种数据类型:

  • 两种基础标量,数(number)与言(string)
  • 两种集合结构,列(array)与表(object)
  • 两种特殊类型,爻(bool)只有两个值,阴(false)阳(true),空(null)类型只 有一个值,也就叫空(null)
json type json value wson type wson value
number 123 一二三
string "string" 『文字』
array [ ] 列也
object { } 表也
bool true false 陽 陰
null null

注一:除列表外,其他类型名称不必出现在 wson 文档中。当前 wenyan-lang 对 object 译为“物”。

注二:wenyan-lang 只限定繁体汉字作关键字,wson 关键字很少,主要也只有“阴阳”二 值有简繁变体,可同时支持,或在实现中允许指定选项。

注三:wson 文档建议用 .wson 作为文件后缀名,或用 .文语。但它本质上只是纯文 本文件,与后缀无关,但须用 utf-8 编码。

标准 wson 示例

以示例介绍语法要点。

["李白", 701, 762, false]

此 json 数据对应 wson:

列曰『李白』曰七零一曰七六二曰阴也
{"诗人":"李白", "生年":701, "卒年":762, "在世":false}

此 json 数据对应 wson:

表之『诗人』曰『李白』之『生年』曰七零一之『卒年』曰七六二之『在世』曰阴也

也可缩进排版如下,但空白是忽略的:

列
    曰『李白』
    曰七零一
    曰七六二
    曰阴
也
表
    之『诗人』曰『李白』
    之『生年』曰七零一
    之『卒年』曰七六二
    之『在世』曰阴
也

列表可以任意嵌套表达需要的复杂数据结构,如:

表
    之『生卒年』曰空
    之『朝代』曰『唐』
    之『诗人』曰『李白』
    之『代表作』曰列
        曰表
            之『诗题』曰『静夜思』
            之『诗文』曰『床前明月光,疑是地上霜。举头望明月,低头思故乡』
        也
        曰表
            之『诗题』曰『望庐山瀑布』
            之『诗文』曰『日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。』
        也
    也
    之『尊号』曰『诗仙』
    之『好友』曰列
        曰『孟浩然』
        曰『汪伦』
        曰表
            之『生卒年』曰空
            之『朝代』曰『唐』
            之『诗人』曰『杜甫』
            之『代表作』曰列
                曰表
                    之『诗题』曰『春望』
                    之『诗文』曰『国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。烽火连三月,家书抵万金。白头搔更短,浑欲不胜簪。』
                也
                曰表
                    之『诗题』曰『春夜喜雨』
                    之『诗文』曰『好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。』
                也
            也
            之『尊号』曰『诗圣』
            之『好友』曰陰
        也
    也
也

以上示例 wson 文档其实是由如下 json 编码(encode)而成:

{ "诗人":"李白", "朝代":"", "尊号":"诗仙", "生卒年":null, "代表作":[ { "诗题":"静夜思", "诗文":"床前明月光,疑是地上霜。举头望明月,低头思故乡" }, { "诗题":"望庐山瀑布", "诗文":"日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。" } ], "好友":[ "孟浩然", "汪伦", { "诗人":"杜甫", "朝代":"", "尊号":"诗圣", "生卒年":null, "代表作":[ { "诗题":"春望", "诗文":"国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。烽火连三月,家书抵万金。白头搔更短,浑欲不胜簪。" }, { "诗题":"春夜喜雨", "诗文":"好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。" } ], "好友":false } ] }

因表(object)的键名是顺序无关的,故而两者是同构的。

语法描叙

wson 标准语法(一级语法)概要

  • 分别以“列也”与“表也”表示这两种数据结构,其他标量直接以字面量表达。一个 wson 文档一般以“列也”或“表也”起始与终止,但其他只有一个标量的字符串也是合法的 wson 。
  • “列也”内部各项用“曰”引导各值。“表也”内部各项用“之”引导键名,用“曰”引导键值。
  • 数字字面量,允许“一二三”与“一百二十三”两种表示法。
  • 字符串的双引号,有繁体『』与简体“”两对。表内的名字也须用双引号括起。转义是程序 特有现象,为保持 wson 简洁性,直接按主流习惯用反斜杠转义 \ ,主要用于转义引 号本身与换行符、制表符。一般用户用到的机率小,且以『』为引号时,内部的“”的不必转 义,反之亦然。
  • 与标准 json 一样不允许注释,如有必要,可用“表之『注』曰『这是注释』……”表示。
  • 结构关键字除简繁异体外只有 列表也阴阳空之曰 这几个,此外汉字数字有十数个。

wson 二级语法概要

  • 兼容标准语法
  • 允许标点符号,解析时忽略标点符号,主要包括 、。,;:!?……
  • 允许用双破折号表示注释,如 wson字符流——这是注释——wson字符流
  • 表之键名的双引号可省略,除非含有冲突关键字。
表之好友曰列:曰『孟浩然』、曰『杜甫』——就是人称诗圣那位——曰『汪伦』也也

{"好友":["孟浩然","杜甫","汪伦"]}

wson 三级语法概要

最接近 wenyan-lang 现有语法的提案。

  • “物”“表”关键字通用。
  • 结构结束关键字“也”可充斥为“是谓『某名』之物也”,“是谓『某名』之列也”,当列内 元素无名时,可用“是谓其物也”“是谓其列也”。这可增加结尾呼应感,且避免重复的“ 也”字粘连。
物之『好友』曰列
    曰『孟浩然』、曰『杜甫』、曰『汪伦』
    是谓『好友』之列也
是谓其物也

{"好友":["孟浩然","杜甫","汪伦"]}

wson 四级语法概要

  • “列”可如“表”一样展开,如“列之一曰阴之二曰阳之三曰空也”,列项的名字即其索引, 列的索引从一开始。
  • 列表内每项可包含三个关键部分的完整描叙,如“名之『某名』者,有数,其实曰三”。
  • 每种类型的值,可统一用“实”字描叙,也可依不同类型使用对应的字,具体对应为“数 值”、“言语”、“列序”、“物形”、“表律”、“爻象”,即表示一个数时,可称“其值曰”, 但在标准简洁语法中只省略为“曰”。
  • 表示一项的三个子句,“有”“名”“实”顺序可不限,只“有某类型”子句不能出在最后,其 他情况都是汉语通顺的。
  • 在不影响自然语义的情况下,可充斥或省略非关键字以增加语感。
表
    名之甲者,有数,其值曰三十;
    名之乙者,有言,其语曰『如此甚好』;
    名之丙者,有爻,其象曰陰;
    名之丁者,有空,其实曰空——批注:直言曰空更简洁——
    名之好友者,有列,其序曰:
        『好友』之一曰『杜甫』;
        『好友』之二曰『孟浩然』;
        『好友』之二曰『汪伦』
    是谓『好友』之列也
是谓其表也

虽然更自由,但也非完全自由,仍需遵循一定规范,戴着镣铐跳舞。

编译解析器

主要两个功能:

  1. 编码 encode ,将 json 文本转换为 wson 文本
  2. 解码 decode ,将 wson 文本转换为 json 文本

可额外提供选项指定语法级别,简繁异体及格式化缩进等需求。

目前笔者先尝鲜使用 viml 脚本语言实现了标准语法的编码与解码。其他主流与非主流语 言对 wson 标准语法的实现应该都是简单的,期望有更多的实现列于如下,尤其是 wenyan-lang 自举版:)

实现语言 支持 wson 语法级别
viml 标准语法

About

May wenyan-lang subset for json 用文言的方式表达通用结构化数据

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published