Skip to content

lymslive/wenyan-json

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 

文言重器(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