Как файлы текстовых данных анализируются в современном C ++? - PullRequest
11 голосов
/ 04 ноября 2011

Я (слишком) часто сталкиваюсь с необходимостью разбирать файлы текстовых данных - вид представления структурированных текстовых данных, который вы использовали до того, как «все» использовали XML - это своего рода отраслевой стандарт.(Их слишком много.)

В любом случае, основная задача всегда состоит в том, чтобы взять текстовый файл и вставить то, что там, в какую-то структуру данных, чтобы наш код C ++ мог что-то сделать с информацией.

Теперь я реализовал несколько простых (и, конечно, глючных) парсеров вручную, и я мало чего презираю больше.: -)

Итак - мне было интересно, каково текущее состояние дел, когда я хочу "разобрать" структурированные текстовые данные в представление в памяти (подумайте: привязка данных XML для произвольного языка).

То, что я нашел до сих пор, было " Какой генератор парсера вы рекомендуете ", но я не уверен, что мне нужен генератор парсера (например, ANTLR ).

Очевидные кандидаты кажутся pegtl и Boost.Spirit , но оба они кажутся довольно сложными (но, по крайней мере, на языке) и в последний разЯ попробовал Spirit, ошибки компилятора сводили меня с ума.(И pegtl нужен C ++ 11-совместимый компилятор, который все еще остается проблемой (VC ++ 2005).)

Так что я упускаю более простое решение для получения чего-то вроде

/begin COMPU_METHOD
  DEC "  Decimal value"
  RAT_FUNC
  "%3.0"
  "dec"
  COEFFS 0 1.000000 0.000000 0 0.000000 1.000000
/end COMPU_METHOD

в структуру данных C ++?(Это просто произвольный пример того, как может выглядеть часть такого файла. Для этого формата я мог бы (и, вероятно, должен) купить библиотеку для ее анализа, поскольку она широко распространенадостаточно - что не для всех форматов, с которыми я сталкиваюсь.)

- или я должен просто пойти на сложность , скажем, Boost.Spirit?

Ответы [ 3 ]

3 голосов
/ 11 ноября 2011

Я настоятельно рекомендую кусать пулю и использовать Boost.Spirit. Хотя сообщений об ошибках может быть достаточно, чтобы выкинуть череп из головы, оно того стоило для меня. Я использовал его для реализации синтаксических анализаторов для недостаточно (или не) задокументированных пользовательских форматов файлов в течение нескольких часов, а не дней.

Я обнаружил, что лучший способ приблизиться к нему - это рассмотреть его как «std::istream на стероидах», поскольку он использует ту же запись двойного угла для обозначения разделения.

3 голосов
/ 11 ноября 2011
  • Boost Spirit

    См.

  • Coco / R (C ++)

    У меня были очень хорошие результаты с этим очень прагматичным генератором синтаксического анализатора, который поддерживает множество языков / платформ с использованием общей грамматикиформат.Скорость анализа сравнима с Boost Spirit (хотя обработка проанализированных данных может быть более эффективной при использовании общего программирования)

Редактировать КомуПроясните все совершенно ясно, никогда не было ничего, что я не мог бы сделать с Coco / R.

Однако я действительно пристрастился к легкости, с которой Дух выводит для меня тип атрибута (преобразования) в общем .Это главное экономит время.Затраты на это:

  • кривая обучения, поддержка
  • время компиляции (но парсеры не часто меняются)
0 голосов
/ 04 ноября 2011

Вы не упоминаете, насколько изощренными были парсеры, которые вы создали вручную. Но я полагаю, что такие простые файлы могут быть определенно обработаны вручную, если вы разделите свою работу на лексический и синтаксический анализ, выполняемый выделенными конечными автоматами. Первый распознает токены, как в вашем примере ключевые слова, числа и строки, и передает их второму, пытаясь распознать более длинные предложения и создать соответствующие структуры данных. С простыми файлами, следующими за обычными грамматиками, без двусмысленностей и других конфликтов, это должно быть действительно простым и управляемым.

...