1

我正在尝试使用 C 和 libyaml 编写一个 yaml 格式的配置文件解析器。我的互联网搜索并没有给我带来任何运气,我找到了一份体面且完整的 API 文档和操作手册。Andrew Poelstra在这里的教程没有描述基于文档的[使用yaml_parser_load ()]解析方法,在我看来,这比基于令牌和基于事件的方法更合乎逻辑和合理。

所以目前我坚持使用来自yaml.h的 doxygen 生成的文档,这让我对在将文档加载到解析器后如何实际解析某些内容感到困惑。具体来说,我不知道我们在and结构的定义中讨论的是哪个堆栈。yaml_document_syaml_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's 数组,每个数组都包含一对keyvalue整数,它们是可以使用该yaml_document_get_node ()函数获取相应节点的索引。*end和指针的含义*top以及如何确定边界并使用它们迭代映射对我来说仍然是一个谜,因为*end不包含最终节点对索引。

如果有人至少向我澄清了这里的堆栈含义,或者更好地为我提供了良好的文档和示例,我会非常高兴。提前致谢。

4

1 回答 1

3

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

(不保证完美,但它适用于我的测试用例)

于 2016-04-23T03:47:35.637 回答