Имея следующий иерархический текстовый ввод данных (фактически, в стиле JunOS), мне нужно разобрать его в какую-то подходящую структуру данных, которую я мог бы
выполнить запросы, чтобы получить некоторую указанную пользователем ветвь дерева, затем линеаризовать ее (?) к некоторому типу отображения, которое я мог бы использовать, чтобы позволить пользователю изменить / вставить / удалить его и т. д., а затем записать его обратно в выходной файл в виде дерева снова (сохранение исходных данных в файле «version», чтобы разрешить последующие операции «history» или «rollback» - полный набор операций, как описано несколько слов назад).
version 1.0;
description "Example data";
weights {
weight low {
value 1;
description Forgetable;
}
weight medium {
value 2;
description Important;
}
weight high {
value 3;
description Critical;
}
}
tags {
tag foo {
description "Some foo";
}
tag bar {
description "Some bar";
}
tag baz {
description "Some baz";
}
}
tag-sets {
tag-set foo\ bar {
tag [ foo bar ];
description Foo\ and\ bar;
}
tag-set "foo bar baz" {
tag-set "foo bar";
tag baz;
description "Foo, bar and baz";
}
}
Вопросы:
1) Какая структура данных подходит для ввода лучше? Какую структуру C вы предлагаете использовать?
2) Я не хочу использовать yacc / lex для его анализа (ненужные дополнительные шаги и сложная совместная работа, хотя не каждый - даже я - любит / знает, как использовать инструменты) - какой метод синтаксического анализа проще всего реализовать для такая проблема разбора?
3) Какой метод вы предлагаете для поддержания «типов» узлов в исходном коде? Кажется довольно сложно
меня в данный момент (на самом деле я пока не знаю, как это сделать). Например, есть некоторый узел типа «версия», который принимает некоторое «слово» в качестве аргумента. Также известно, что
узел "версия" существует только как часть корневой ветви иерархии. Другой пример может состоять в том, что есть несколько узлов «описания», принимающих «слово» или «строку»
в качестве своих аргументов. Узлы «описания» принадлежат каждому узлу иерархии. И т.п.
Как справиться с такой проблемой?
Примечание для объяснения цели: полученная в результате утилита "версирует" некоторые данные, хранящиеся в текстовых файлах, очень похожих
в приведенном выше примере, и пользователь будет запрашивать / изменять / вставлять / удалять данные в
поддерживать какую-то конкретную информацию (например, список задач или что-то еще, например). Считайте, что это своего рода простая база данных, а не файл конфигурации или что-то в этом роде (извините, мой английский). Идея состоит в том, чтобы предоставить a) CLI, b) инструмент командной строки, c) позволить
пользователи могут редактировать данные в своем редакторе, если они не хотят использовать a) или b) ...
По крайней мере, некоторые "общие" предложения заслуживают высокой оценки.