Каковы причины использования Ragel для разбора строк в кодовой базе C++?

Я унаследовал проект C++, который использует Ragel для разбора строк.

Это первый раз, когда я видел, как это делается, и я хотел бы понять, почему кто-то использует Ragel вместо C++ для анализа строки?

1 ответ

Решение

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

В целом, использование генераторов исходного кода может быть разумным решением. Иногда, особенно в больших проектах, имеет смысл написать свой собственный (читайте о метапрограммировании, особенно SICP и даже блоге J.Pitrat). Хорошие инструменты автоматизации сборки, такие как GNU make или ninja, могут быть легко настроены для запуска генераторов кода C или C++ и использования их во время сборки.

Прочитайте вступление Ragel. Посмотрите также на flex, bison, ANTLR, rpcgen, Qt moc, swig, gperf как общие примеры генераторов C или C++.

В некоторых программах вы даже можете использовать библиотеку JIT-компиляции (например, libgccjit или LLVM) для динамического генерирования кода во время выполнения и его использования. В системах POSIX вы также можете сгенерировать во время выполнения временный файл C или C++, скомпилировать его как плагин и загрузить этот временный плагин, используя dlopen & dlsym. Хорошая культура компиляторов и интерпретаторов (например, через " Книгу Дракона") имеет смысл.

Встраивание некоторого интерпретатора (например, lua или guile) в ваше приложение также является интересным подходом. Но это сильное архитектурное решение.

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

PS. Я никогда не слышал о Ragel, прежде чем читать ваш вопрос!

Другие вопросы по тегам