从平面数据模式文件生成C++、RIST、GO或Python的源代码
flatdata-generator的Python项目详细描述
平面数据生成器
从flatdata架构文件生成代码。
有关flatdata
及其实现的更多信息,请refer to flatdata's homepage。
使用flatdata-generator
# installation pip3 install flatdata-generator # example: generate a header-only C++ library flatdata-generator -s locations.flatdata -g cpp -O locations.hpp
当前支持的目标语言:
- 生锈
- Python
- 前进
- 点(模式图)
- flatdata(规范化稳定模式)
架构
阶段
flatdata
生成器工作在几个阶段,这些阶段彼此明显分离,可以单独扩展/测试:
使用
中定义的pyparsing
库分析源架构文件。语法 因为模式是在grammar.py
从
pyparsing.ParseResults
中构造节点树。节点树 包含flatdata语法的每个构造的实体,有组织地 按层次顺序,允许节点之间的非树引用:Namespace
允许在树中嵌套命名空间。Structure
-结构将一组字段组合在一起。Archive
-归档文件将资源和 引用结构或其他存档(请参见Reference
)ResourceBase
-所有资源都来自ResourceBase
Reference
-flatdata实体之间的所有引用都是 用Reference
节点建模。所有推荐人都参与 名称解析。有两种类型的引用:RuntimeReference
-模型显式引用和绑定 在运行时显示自己的资源。TypeReference
-模型类型依赖项,在 后期拓扑排序和模式解析。
使用非 直接对应于
pyparsing.ParseResults
或需要 实现高级功能。其中:- add内置结构如果任何资源需要它们。为了
例如,
multivector< N, ... >
需要_builtin.multivector.IndexTypeN
可用。 - 向所有存档添加常量引用,以便常量 可用于架构解析。
- add内置结构如果任何资源需要它们。为了
例如,
resolve references遍历所有引用并尝试 找到它们所指的节点,可以在:
- 父作用域直到(包含)最里面的父命名空间。
- 如果路径完全限定,则为根节点。
执行拓扑排序以检测实体之间的循环 以及确定依赖于 就一个。
按拓扑顺序使用节点生成源代码和/或 树(取决于生成器体系结构-递归下降 或迭代)。
节点树
树的每个节点都由其名称、属性(元数据)和 包含对其子级的引用。每个节点都可以通过特定的 路径,它是父级名称的点连接。 节点树强制执行flatdata模式的几个属性:
- 没有冲突的声明:没有具有相同路径的两个节点 允许。
- 所有引用都是正确的:所有引用节点都是可解析的。
- 资源之间没有循环依赖关系:all
TypeReference
参与树形dag的拓扑排序 源和目标之间的边和边TypeReference
参考文献
引用名称已损坏,因此它们与其他路径不模棱两可
组件。例如,对类型T
的引用将具有名称@T
,
类似地,对.foo.bar.T
的引用也将更改为
@@foo@bar@T
。