1 个不稳定版本
0.1.0 | 2024年2月15日 |
---|
#80 在 值格式化
4,165 每月下载量
15KB
100 行
Vesper:声明式可读性结构语言,优于XML
概述
有时我们需要以非常简洁的风格表示多维数据层次结构,使其易于人类阅读。同时,我们不想失去精度,并使这种表示形式化和确定性的。
到目前为止,必须从JSON、YAML和XML中进行选择。JSON缺乏多维性,虽然灵活,但缺乏定义数据正式结构(模式)的适当有效方法(是的,存在JSON模式,但非常笨拙,就像XML一样)。XML有更多工具来形式化数据结构,但视觉解析相当困难。YAML最易于解析,它也支持比JSON更多的结构,但仍然少于XML,而且再次缺乏有效的模式语言。
因此,我们创建了Vesper:一种视觉清晰且具有与XML相同功能的正式语言。
Transaction rec
Version enum U8 V1=1 V2=2
Inputs list 0..MAX64
PrevOut rec
Txid bytes 32
Vout as U32
Sequence as U32
ScriptSig bytes 0..MAX64
Witness list 0..MAX64
ByteStr bytes 0..MAX64
Outputs list 0..MAX64
Value as U64
ScriptPubkey bytes 0..MAX64
LockTime as U32
以下是比特币交易的完整数据类型层次结构、语义结构和内存布局的表示:这是它可能多么清晰。用JSON编写,至少需要两倍多的文本,大量的引号、括号和大括号。XML等价物也更冗长,可读性更差。
<rec name="Transaction">
<enum name="Version" type="U8">
<variant tag="V1" value="1"/>
<variant tag="V2" value="2"/>
</enum>
<list name="Inputs" min-len="0" max-len="MAX64">
<rec name="PrevOut">
<bytes name="Txid" len="32"/>
<field name="Vout" type="U32"/>
</rec>
<field name="Sequence" type="U32"/>
<bytes name="ScriptSig" min-len="0" max-len="MAX64"/>
<list name="Witness" min-len="0" max-len="MAX64">
<bytes name="ByteStr" min-len="0" max-len="MAX64"/>
</list>
</list>
<list name="Outputs" min-len="0" max-len="MAX64">
<field name="Value" type="U64"/>
<bytes name="ScriptPubkey" min-len="0" max-len="MAX64"/>
</list>
<field name="LockTime" type="U32"/>
</rec>
Vesper使用新的子句表示法,称为T表达式。你可能熟悉[S表达式]和[M表达式],而T表达式是镇上新的客人,它遵循特定的视觉清晰模式来表示语义结构:主题
谓词
属性
\ 内容
,其中主题-谓词-属性在同一行中,形成一种句子,内容嵌套在下方,可以跨越多行。内容中的每一行实际上都是另一个T表达式,我们最终得到一棵树(这就是为什么表达式被称为"T",即"树表达式")。
Vesper的完整语法非常简单,其正式定义可以仅用九行(这里我们使用我们的自定义BNF风格的表示法)。
t-expr => subject predicate `{` ( attr )* `}`
( t-expr )\*
subject => ident
predicate => ident
attr => simple | named
simple => ident | expr
named => ident `=` ( ident | expr )
ident => (\w_)[\w\d_-]*
expr => [\S]+ -- all ASCII printable symbols except of whitespace
Vesper 自带一种模式语言(称为“Vesper 模式”),允许创建特定领域的子语言,就像我们上面为数据类型和内存布局所做的那样
rec := - (*)
tuple := - (*)
as := \type (-)
enum := \type? \ident+=\int (-)
union := \type? (*)
bytes := \range (-)
list := \range (+)
char := - (-)
str := \range (-)
如您所见,它也非常简洁:任意数据类型层次结构和内存布局的整个定义只需九行即可完成!
贡献
许可证
这些库根据 Apache 2.0 许可证 的条款进行分发。
依赖项
~2.5MB
~54K SLoC