2016-04-04 58 views
0

我想使用C和libyaml編碼yaml格式的配置文件解析器。我的互聯網搜索沒有帶給我任何好運,找到一本體面和完整的API文檔和操作手冊。 Andrew Poelstra here的教程沒有描述基於文檔的[使用yaml_parser_load()]解析方法,它比基於令牌和基於事件的方法更符合邏輯和正確。C libyaml基於文檔的解析

因此,目前我堅持從yaml.h doxygen生成的文檔,它真的讓我感到困惑,我在將文檔加載到解析器後如何實際解析某些內容。具體而言,我沒有得到哪個堆棧我們是否在yaml_document_syaml_node_s結構的定義中討論。

yaml_node_s.data.mapping一個例子:即*start(在我的情況)指向的yaml_node_pair_t的,其中的每一個數組包含一個對keyvalue整數,

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; 

我已想出其是使用yaml_document_get_node()函數可以獲得相應節點的指數。 *end*top指針的含義以及如何確定邊界並使用它們迭代映射仍然是一個謎,因爲*end不包含最終節點對索引。

如果有人向我澄清至少堆棧這裏的意思,或者甚至更好地爲我提供了一個很好的文檔和示例,我會非常高興。提前致謝。

+0

我不知道有問題的API,但是您呈現的'struct'定義看起來像構建在鏈表頂部的堆棧。 'start'和'end'分別指向列表中的第一個和最後一個節點,而「top」指向堆棧頂部的節點或者第一個打開的位置。這種數據結構可以容納一個堆棧,其元素(每個鍵/值對)不一定佔用列表的所有分配元素;人們可以選擇這個來通過允許節點重用來減少分配和釋放的次數。 –

回答

1

start是棧的底部,top高於堆棧的頂部,並end指向最後一個yaml_node_pair_t一塊內存分配給該堆棧。我想通過一些實驗並查看libyaml源代碼。看着yaml_document_get_node,yaml_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

(不能保證是完美的,但它的工作對我的測試情況下)

+0

是的,謝謝,我已經明白了這一切,但這仍然是一個很好和正確的答案,應該被接受。順便說一下,我確實知道堆棧是什麼,然而它對於我來說並不明顯,因爲堆棧通常不會被迭代,至少不是它們接口的一部分。因此,無論如何,我會把它看作一個數組。 –

+0

是的,我想你現在可能已經到了,但我想我會寫這個,以防其他人試圖找出它,並找不到任何其他搜索網絡。我對這種顯而易見性的評論並不意味着無禮,我想這不是那麼明顯。我主要是把它放在那裏,因爲我花了多長時間弄清楚它,我感到很無聊。 – DPena