Требуются предложения синтаксического анализатора иерархической текстовой структуры данных - PullRequest
3 голосов
/ 29 апреля 2011

Имея следующий иерархический текстовый ввод данных (фактически, в стиле 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) ...

По крайней мере, некоторые "общие" предложения заслуживают высокой оценки.

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Я бы использовал парсер рекурсивного спуска в сочетании с какой-то хеш-таблицей или картой для хранения данных. Судя по всему, он очень похож на JSON, но не совсем. Строки, числа, списки и словари, похоже, поддерживаются. Простой класс типа «Объект» поможет сохранить это (подобно javascript).

Для управления историей структуры данных вы можете реализовать ее аналогично мирам OMeta (см .: http://www.vpri.org/pdf/rn2008001_worlds.pdf).. Она использует прототипную объектную модель для управления областью и историей.

0 голосов
/ 30 апреля 2011

Вы можете начать с парсера json, такого как парсер json , и соответственно изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...