2016-04-04 6 views
0

Ich versuche, einen YAML-formatierten Konfigurationsdateiparser mit C und libyaml zu codieren. Meine Internetsuchen brachten mir kein Glück, eine anständige und vollständige Dokumentation der API mit einer Bedienungsanleitung zu finden. Ein Tutorial von Andrew Poelstra here beschreibt nicht die dokumentbasierte [mit der Verwendung von yaml_parser_load()] Parsing-Methode, die mir viel logischer und gerechtfertigt als die Token-basierte und die ereignisbasierte Methoden aussieht.C libyaml Dokument-basierte Analyse

Also bleibe ich derzeit bei den doxygen-generierten Dokumenten von yaml.h, und es lässt mich wirklich verwirrt, wie ich tatsächlich etwas parse, nachdem ich ein Dokument in einen Parser geladen habe. Genauer gesagt bekomme ich nicht den Stack sprechen wir in den Definitionen der yaml_document_s und yaml_node_s Strukturen.

Ein Beispiel aus 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; 

Ich habe herausgefunden, dass *start (in meinem Fall) auf ein Array von yaml_node_pair_t ‚s, von denen jeder ein Paar von key und value ganzen Zahlen enthält, die sind die Indizes, mit denen die entsprechenden Knoten über die Funktion yaml_document_get_node() akquiriert werden können. Die Bedeutung der Zeiger *end und *top und wie ich Grenzen bestimmen und ein Mapping mit ihnen iterieren kann, bleibt mir ein Rätsel, da *end nicht die endgültigen Knotenpaar-Indizes enthält.

Ich würde mich freuen, wenn mir jemand zumindest den Stapel Bedeutung hier erläutert, oder besser noch, mir eine gute Dokumentation und Beispiele zur Verfügung gestellt hat. Danke im Voraus.

+0

Ich kenne die API nicht in Frage, aber die 'struct' Definition, die Sie präsentieren, sieht wie ein Stapel aus, der über einer verknüpften Liste gebaut wird. 'start' und' end' würden auf den ersten bzw. letzten Knoten in der Liste zeigen, während 'top' entweder auf den Knoten oben auf dem Stapel oder auf die erste offene Position darüber zeigen würde. Diese Art von Datenstruktur würde einen Stapel aufnehmen, dessen Elemente (jeweils ein Schlüssel/Wert-Paar) nicht notwendigerweise alle zugewiesenen Elemente der Liste belegen; Man könnte dies wählen, um die Anzahl der Zuweisungen zu reduzieren und freizugeben, indem die Wiederverwendung von Knoten erlaubt wird. –

Antwort

1

start ist die Unterseite des Stapels, top über dem oberen Ende des Stapels ist, und end zeigt auf das letzte Stück yaml_node_pair_t Speicher für diesen Stapel reserviert. Ich habe das mit etwas Experimentieren herausgefunden und die libyaml-Quelle betrachtet. Blick auf yaml_document_get_node, yaml_document_get_root_node und yaml_document_add_scalar bieten einige nette Hinweise. zum Beispiel:

aber ich denke, es sollte für uns beide offensichtlich gewesen sein mit dem Wissen, was ein Stack ist. Wie dem auch sei, möchten Sie vor top Erreichen ab start Anhalten iterieren, wie ich hier in einer grundlegenden Implementierung getan haben:

http://codepad.org/W7StVSkV

(nicht perfekt sein garantiert, aber es funktionierte gut für meine Testfall)

+0

Ja danke, das habe ich mir schon ausgedacht, aber das ist immer noch eine gute und richtige Antwort, die akzeptiert werden sollte. Ich habe übrigens das Wissen darüber, was ein Stack ist, aber es war für mich nicht offensichtlich, wie es hier verwandt sein könnte, da Stacks normalerweise nicht iteriert werden, nicht zumindest als Teil ihrer Schnittstelle. Also werde ich darüber als Array denken. –

+0

Ja, ich dachte mir, dass du es wahrscheinlich schon getan hast, aber ich dachte, ich würde das aufschreiben, falls jemand anders es herausfinden sollte und nichts anderes finden kann, wenn man im Internet sucht. Mein Kommentar über die Offensichtlichkeit sollte nicht unhöflich sein, ich nehme an, es ist nicht so offensichtlich. Ich habe das meistens dort hineingelegt, weil ich mich albern fühlte, wie lange ich brauchte, um es herauszufinden. – DPena