#tree #tree-node #format #serialization #file-format #parser #store

bin+lib tref

行元素格式 (TREF)。用于解析、存储和序列化树的框架。

5 个版本 (3 个重大更改)

0.4.0 2022年7月12日
0.3.0 2021年9月24日
0.2.0 2021年9月13日
0.1.1 2021年7月2日
0.1.0 2021年7月2日

#1115解析实现

MIT 许可证

36KB
548

行元素格式

TREF 是一种纯文本文件格式,用于以易于阅读的方式描述树。还有其他描述树的格式,其中最广泛使用的是 Newick 格式。Newick 的问题在于它过于混乱,难以被人类编写和阅读,并且容易出错。其他树格式,如 PhyloXMLNexus,则过于冗长、复杂,并且在生物信息学中非常专业。

使用 TREF,人类可以通过快速查看来编写树并理解其结构,因为它旨在既易于人类阅读,也易于机器解析。

在文件中编写树可以用于许多原因:作为应用程序的配置文件、存储可以由应用程序及其用户修改和读取的信息、序列化树形内存结构等。

什么是树?

我们在没有定义它的情况下开始讨论树。树是一种特定的 ,不包含循环。这意味着没有闭合回路。

树从一个根节点开始,可以从它产生任意数量的子节点(从零到无限),这些子节点又可以产生任意数量的子节点,依此类推。一个节点只能有一个父节点(或者零个,如果是根节点),否则它将会有循环,并且不再是树。只有根节点可以没有父节点,如果有更多节点没有父节点,这意味着我们有多于一个的树。

TREF 文件

让我们从一个例子开始。我们将使用以下方式表示一棵树

example_1.tref

文件名:example_1.tref

# A simple tree.

[my_tree_name]

+ root_node
+ + child_1
+ + + child_1_1
+ + + child_1_2
+ + child_2
+ + + child_2_1
+ + child_3

本示例包含TREF文件可以包含的所有元素:注释(以#开始的行)、树名(以[开始并以]结束的行)和树节点(以任意数量的+开始,由一个简单的空格分隔)。

节点层次结构使用+空格的配对来表示。每一对表示一个节点级别。在示例中,root_node为级别1,child_1为级别2,child_1_2为级别3,等等。

如果一个节点(A)位于另一个节点(B)下方(立即或非立即),且其级别高于B,并且没有其他同一级别的节点在B之间,则认为节点(A)是另一个节点(B)的子节点。

有效的TREF文件必须满足以下规则

  1. 每行以换行符结束表示一个语句。
  2. 允许空语句(包含空格、制表符和换行符)。
  3. 注释语句必须以#开头,不允许在它之前有空格或制表符。之后任何字符都是允许的。
  4. 树名必须用括号([])括起来,括号前后不允许有空格、制表符或其他任何字符。括号内允许任何字符,除了括号本身。
  5. 树节点必须以至少一个+开始,后跟一个空格。在最后一个(+,空格)配对之后,是节点名称,可以包含任何字符(甚至空格或制表符),唯一限制是第一个字符不能是+或空格。
  6. 每个树必须有一个树名,并且它必须位于根节点之前。
  7. 文件可以包含多个树,每个树都正确地标有树名。
  8. 允许空树,并且用没有节点的树名来表示。
  9. 节点级别必须是连续的,级别N的节点只能包含级别N+1的节点。
  10. 任何非空、非注释、非树名或非节点的行都视为无效。

我们已经看到了一个正确示例,现在让我们看看一些错误的示例以及为什么它们是错误的

文件名:example_2.tref

# WARNING: this file is invalid
   # this comment is incorrect

这是错误的,因为它在第2行包含了一个无效的注释语句,它不是以#开始的。

文件名:example_3.tref

# WARNING: this file is invalid
 [my_tree_2]

这个树名是无效的,因为它包含括号外的字符(以空格开始)。

文件名:example_4.tref

# WARNING: this file is invalid
[my_tree]
+ root_node
+ + child_1
+ + +child_2
 + + child_3

这是无效的,因为它有一个以+开始的节点名称(第5行)和一个不以+开始的节点语句(第6行)。

文件名:example_5.tref

# WARNING: this file is invalid
[my_tree]
+ root_node
+ + child_1
+ + + + child_1_1

child_1包含一个非连续级别的节点(应该是级别3,但却是级别4)。

方言

TREF中的节点名称格式是有意宽松的。在初始加号之后,它基本上接受任何东西,任何字符,空格,括号... whatever。原因在于用户定义的方言

想象一下,我们有一个应用程序,其中每条边(节点连接)的权重都很重要。TREF没有提供为边分配值的方法,但用户可以在节点中定义一个特定的格式。它可能像这样

文件名:example_6.tref

[my_tree_dialect]

+ root_node
+ + 27:child_1
+ + + 99:child_1_1
+ + + 56:child_1_2
+ + 5:child_2

解析时,用户将接收到一个节点,其标识符是一个字符串,如99:child_1_1,该字符串将能够解析并生成包含所需数据模型的自定义对象。

创建

请访问crates.io获取安装说明和其他信息。

示例

请查看文件src/main.rssrc/tests.rs以获取使用示例。还可以查看文档。

文档

与任何crate一样,使用cargo生成文档

cargo doc --open

您还可以在docs.rs上在线阅读文档。

依赖项

~2.2–3MB
~54K SLoC