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 在 解析实现
36KB
548 行
行元素格式
TREF 是一种纯文本文件格式,用于以易于阅读的方式描述树。还有其他描述树的格式,其中最广泛使用的是 Newick 格式。Newick 的问题在于它过于混乱,难以被人类编写和阅读,并且容易出错。其他树格式,如 PhyloXML 和 Nexus,则过于冗长、复杂,并且在生物信息学中非常专业。
使用 TREF,人类可以通过快速查看来编写树并理解其结构,因为它旨在既易于人类阅读,也易于机器解析。
在文件中编写树可以用于许多原因:作为应用程序的配置文件、存储可以由应用程序及其用户修改和读取的信息、序列化树形内存结构等。
什么是树?
我们在没有定义它的情况下开始讨论树。树是一种特定的 图,不包含循环。这意味着没有闭合回路。
树从一个根节点开始,可以从它产生任意数量的子节点(从零到无限),这些子节点又可以产生任意数量的子节点,依此类推。一个节点只能有一个父节点(或者零个,如果是根节点),否则它将会有循环,并且不再是树。只有根节点可以没有父节点,如果有更多节点没有父节点,这意味着我们有多于一个的树。
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文件必须满足以下规则
- 每行以换行符结束表示一个语句。
- 允许空语句(包含空格、制表符和换行符)。
- 注释语句必须以
#
开头,不允许在它之前有空格或制表符。之后任何字符都是允许的。 - 树名必须用括号(
[]
)括起来,括号前后不允许有空格、制表符或其他任何字符。括号内允许任何字符,除了括号本身。 - 树节点必须以至少一个
+
开始,后跟一个空格。在最后一个(+
,空格)配对之后,是节点名称,可以包含任何字符(甚至空格或制表符),唯一限制是第一个字符不能是+
或空格。 - 每个树必须有一个树名,并且它必须位于根节点之前。
- 文件可以包含多个树,每个树都正确地标有树名。
- 允许空树,并且用没有节点的树名来表示。
- 节点级别必须是连续的,级别N的节点只能包含级别N+1的节点。
- 任何非空、非注释、非树名或非节点的行都视为无效。
我们已经看到了一个正确示例,现在让我们看看一些错误的示例以及为什么它们是错误的
。
文件名: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.rs
和src/tests.rs
以获取使用示例。还可以查看文档。
文档
与任何crate一样,使用cargo生成文档
cargo doc --open
您还可以在docs.rs上在线阅读文档。
依赖项
~2.2–3MB
~54K SLoC