Как файлы текстовых данных анализируются в современном С++?
Я тоже часто сталкиваюсь с задачей разбора текстовых файлов данных - типа текстового структурированного представления данных, которое вы использовали до того, как "каждый" использовал 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
Вы не упоминаете, насколько изощренными были парсеры, созданные вами вручную. Но я считаю, что такие простые файлы можно было бы однозначно проанализировать с помощью ручных процедур, если вы разделили свою работу на лексический и синтаксический синтаксический анализ, выполняемые выделенными государственными машинами. Первый распознает токены, как в ваших примерах ключевые слова, числа и строки, и передает их ко второму, пытаясь распознать более длинные предложения и создать соответствующие структуры данных. С помощью простых файлов, следующих за регулярными грамматиками без каких-либо двусмысленностей и других конфликтов, это должно быть действительно простым и управляемым.