1

C と libyaml を使用して、yaml 形式の構成ファイル パーサーをコーディングしようとしています。私のインターネット検索では、操作マニュアルを含む適切で完全な API のドキュメントを見つけることができませんでした。ここの Andrew Poelstra によるチュートリアルでは、[を使用したyaml_parser_load ()]ドキュメント ベースの解析方法について説明していません。これは、トークン ベースやイベント ベースの方法よりもはるかに論理的で正当化されているように見えます。

したがって、現在、私は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のペアが含まれており、対応するノードを関数を使用して取得できるインデックスです。とポインターの意味と、境界を決定し、それらを使用してマッピングを反復する方法は、最終的なノード ペア インデックスが含まれていないため、私には謎のままです。keyvalueyaml_document_get_node ()*end*top*end

誰かが少なくともここでのスタックの意味を明確にしてくれたり、さらに良いドキュメントや例を提供してくれたりしたら、私は喜んでいます。前もって感謝します。

4

1 に答える 1

3

startはスタックの一番下で、スタックtopの一番上にあり、このスタックに割り当てられたメモリendの最後の部分を指します。yaml_node_pair_tいくつかの実験とlibyamlソースを見て、これを理解しました。yaml_document_get_nodeyaml_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 に答える