我试图用C和libyaml编写yaml格式的配置文件解析器。我的互联网搜索没有给我带来任何运气,找到了一个像样和完整的API文档与操作手册。Andrew Poelstra 这里的教程没有描述基于文档的(使用yaml_parser_load ()__)解析方法,在我看来,这种解析方法比基于令牌和基于事件的方法更符合逻辑和合理。
因此,目前我坚持使用来自yaml.h的doxygen生成的文档,这让我对如何在将文档加载到解析器中之后实际如何解析感到困惑。具体来说,我不知道我们在yaml_document_s和yaml_node_s结构的定义中讨论的是哪个堆栈。
一个来自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不包含最终的节点对索引。
如果有人至少向我澄清了这里的堆栈含义,或者更好地向我提供了一个好的文档和示例,我肯定会很高兴。提前谢谢。
发布于 2016-04-23 03:47:35
start是堆栈的底部,top位于堆栈的顶部,end指向为该堆栈分配的最后一个yaml_node_pair_t内存。我通过一些实验和libyaml的来源来找出这个问题。查看yaml_document_get_node、yaml_document_get_root_node和yaml_document_add_scalar提供了一些很好的提示。例如:
YAML_DECLARE(yaml_node_t *)
yaml_document_get_node(yaml_document_t *document, int index)
{
assert(document); /* Non-NULL document object is expected. */
if (index > 0 && document->nodes.start + index <= document->nodes.top) {
return document->nodes.start + index - 1;
}
return NULL;
}但实际上,我想这对我们来说应该是显而易见的,因为我们都知道堆栈是什么。无论如何,您希望在到达start之前从top停止迭代,就像我在基本实现中所做的那样:
http://codepad.org/W7StVSkV
(不能保证是完美的,但它适用于我的测试用例)
https://stackoverflow.com/questions/36410122
复制相似问题