【发布时间】:2016-04-04 18:27:27
【问题描述】:
我正在尝试使用 C 和 libyaml 编写一个 yaml 格式的配置文件解析器。我的互联网搜索并没有给我带来任何运气,我找到了一份体面且完整的 API 文档和操作手册。 Andrew Poelstra here 的教程没有描述基于文档的[使用yaml_parser_load ()] 解析方法,在我看来,这比基于令牌的解析方法更合乎逻辑和合理。基于事件的方法。
所以目前我坚持使用来自yaml.h 的 doxygen 生成的文档,这让我对在将文档加载到解析器后如何实际解析某些内容感到困惑。具体来说,我不知道我们在 yaml_document_s 和 yaml_node_s 结构的定义中讨论的是哪个 stack。
来自yaml_node_s.data.mapping的例子:
struct {
/** The stack of mapping pairs (key, value). */
struct {
/** The beginning of the stack. */
yaml_node_pair_t *start;
/** The end of the stack. */
yaml_node_pair_t *end;
/** The top of the stack. */
yaml_node_pair_t *top;
} pairs;
/** The mapping style. */
yaml_mapping_style_t style;
} mapping;
我发现*start(在我的例子中)指向yaml_node_pair_t的数组,每个数组都包含一对key和value整数,它们是索引可以使用yaml_document_get_node () 函数获取相应的节点。 *end 和 *top 指针的含义以及如何确定边界并使用它们迭代映射对我来说仍然是一个谜,因为 *end 不包含最终节点对索引。
如果有人至少向我澄清 stack 在这里的含义,或者更好地为我提供良好的文档和示例,我会非常高兴。提前致谢。
【问题讨论】:
-
我不知道有问题的 API,但是您提供的
struct定义看起来像是建立在链表之上的堆栈。start和end将分别指向列表中的第一个和最后一个节点,而top将指向堆栈顶部的节点或其上方的第一个打开位置。这种数据结构将容纳一个堆栈,其元素(每个键/值对)不一定占据列表的所有已分配元素;人们可能会选择这一点,通过允许节点重用来减少分配和释放的数量。