Как файлы текстовых данных анализируются в современном С++?

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

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

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

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

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

Очевидные кандидаты кажутся pegtl и Boost. Spirit, но оба они кажутся довольно сложными (но, по крайней мере, они на языке), и в прошлый раз, когда я попробовал Spirit, ошибки компилятора заставили меня с ума сойти. (И pegtl нуждается в компиляторе, совместимом с С++ 11, который по-прежнему является проблемой (VС++ 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

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

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

Ответ 1

  • Boost Spirit

    См.

  • Coco/R (С++)

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

Изменить Чтобы все было совершенно ясно, никогда не было того, что я не мог сделать с Coco/R.

Тем не менее, я действительно зависим от легкости, с которой Spirit выводит для меня тип атрибута (конверсии) для меня в целом. Это главный развал. Однако есть затраты:

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

Ответ 2

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

Я обнаружил, что наилучшим способом приблизиться к нему было просмотр его как "std::istream на стероидах", так как он использует одну и ту же двунаправленную нотацию для обозначения разделения.

Ответ 3

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