gpt4 book ai didi

C libyaml 基于文档的解析

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:38 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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;
}

但实际上我想只要知道什么是栈,这对我们俩来说应该是显而易见的。无论如何,你想在到达 top 之前从 start 开始迭代,就像我在基本实现中所做的那样:

http://codepad.org/W7StVSkV

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

关于C libyaml 基于文档的解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36410122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com