C libyaml 基于文档的解析

C libyaml document-based parsing

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

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

如果有人至少向我阐明 stack 的含义,或者更好地为我提供良好的文档和示例,我将非常高兴。提前致谢。

start是栈底,top是栈顶,end指向最后分配的yaml_node_pair_t块内存这个堆栈。我通过一些实验和查看 libyaml 源代码解决了这个问题。查看 yaml_document_get_nodeyaml_document_get_root_nodeyaml_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

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