#nlp #parser #serde

不依赖std nlsd

自然语言结构化文档

4 个版本

0.1.3 2021年6月16日
0.1.2 2020年9月23日
0.1.1 2020年9月22日
0.1.0 2020年9月8日

#2210解析器实现


3 个crate中使用(通过 ogma-libs

MIT/Apache

93KB
2.5K SLoC

自然语言结构化文档

自然语言结构化文档(NLSD)或简称NLSD,是可序列化和反序列化数据的英文表示。此类文档的目的是使数据及其理解相等。例如,当用户对数据(例如,使用加密签名)进行签字时,数据本身的展示就是他们所签的内容。

NLSD试图表示以下数据和数据类型

Null
Boolean
Number
String
List
Map
NamedList
NamedMap
Enum

空值

empty | nothing

布尔值

true | false | on | off | enabled | disabled

数字

0.0

字符串

`string`

字符串需要用 ``` 和 ``` 来转义

列表

the [empty] (list|`variant`) [henceforth `name`] [where an item is ___] [and another item [of `name`] is ___]

在反序列化变体时,如果存在,将转换为 UpperCamelCase

映射

the [empty] (object|`variant`) [henceforth `name`] [where [the] `key` is ___] [and [the] `key` [of `name`] is ___]

注意,当解析时,将被替换为snake_case,以便于映射。

请注意,构建键值对时,the是可选的。在序列化时,the将始终放置,除非is开头,表示一个形容词(例如“is_enabled”)

枚举(新类型变体)

the `type` which is ___

名称

名称在反序列化嵌套结构时很重要。在反序列化时,必须处于作用域内的'name'才能将对象与其父对象关联起来。当搜索'name'时,反序列化器将遍历树以找到名称。当找到'name'时,新作用域将设置为树的该级别。如果没有提供'name',则当前作用域

在将对象序列化为NLSD时,除非对象是树的叶节点,否则将添加'name',并且除非引用的作用域是当前作用域的父作用域,否则将添加到键/项的'name'

列表项的默认名称

[parent name] item [index number]

结构或映射项的默认名称

[parent name] [key]

其中,列表的根名称是“the list”,对象的根名称是“the object”,结构的根名称是结构名

示例

用户

struct User {
  id: u32,
  public_key: String,
}

let user = User { id: 1, public_key: "A7sg..." };
the `user` where the `id` is 1 and the `public key` is `A7sg...`

交易

struct Transaction {
  from: String,
  to: String,
  amount: f64
}

let transactions = vec![
  Transaction { from: "address1", to: "address2", amount: 10.2 },
  Transaction { from: "address2", to: "address3", amount: 5.8 },
];
the list henceforth `the list` where an item is the `transaction` where the `from` is `address1` and the `to` is `address2` and the `amount` is 10.2 and another item of `the list` is the `transaction` where the `from` is `address2` and the `to` is `address3` and the `amount` is 5.8

依赖项

~205–500KB
~10K SLoC