Я недавний добавленный парсинг исходного файла к существующему инструменту, который генерировал выходные файлы от сложных параметров командной строки.
Параметры командной строки добрались, чтобы быть столь сложными, что мы начали позволять им быть предоставленными как файл, который был проанализирован, как будто это была очень большая командная строка, но синтаксис был все еще неловким. Таким образом, я добавил способность проанализировать исходный файл с помощью более разумного синтаксиса.
Я использовал гибкий провод 2.5.4, чтобы окна генерировали токенизатор для этого пользовательского формата исходного файла, и он работал. Но я ненавидел код. глобальные переменные, странное соглашение о присвоении имен и C++ кодируют сгенерированный, было ужасно. Существующий бэкенд генерации кода был склеен к выводу гибкого провода - я не использую yacc или бизона.
Я собираюсь погрузиться назад в тот код, и я хотел бы использовать лучше/больше современный инструмент. Делает любой знает чего-то это.
Я мог, вероятно, жить с инструментом, который просто генерировал таблицы маркирования, если это было единственной доступной вещью.
Ragel: http://www.complang.org/ragel/ Это соответствует большинству ваших требований.
Код, который он генерирует, мешает очень мало с помощью программы. Код также невероятно быстро, а синтаксис Ragel более гибкий и читаемый, чем все, что я когда-либо видел. Это каменная сплошная часть программного обеспечения. Он может генерировать анализатор, управляемый настоимостью или багажнику, управляемый Goto.
BOOST.SPIRIT и Парсер из двора прийти на мой взгляд. Обратите внимание, что подход для генераторов лексеров несколько заменен внутренним DSL DSL C ++ (языком для домена) для уточнения токенов. Просто потому, что это часть вашего кода без использования внешней утилиты, просто следуя ряд правил, чтобы указать свою грамматику.
Boost.Spirit.Qi (парсер-токенайзер) или Boost.Spirit.Lex (только токенайзер). Я абсолютно люблю Ци, и Лекс тоже неплох, но я просто склонен принимать Ци за мои потребности в синтаксическом анализе....
Единственным реальным недостатком Qi, как правило, является увеличение времени компиляции, а также он работает немного медленнее, чем написанный от руки парсинговый код. Однако, в целом, он работает намного быстрее, чем при разборе с помощью регекса.
http://www.boost.org/doc/libs/1_41_0/libs/spirit/doc/html/index.html
Flex также имеет опцию выхода C++.
В результате получается набор классов, которые делают такой разбор.
Просто добавьте в заголовок своего лексического файла:
%option C++
%option yyclass="Lexer"
Затем в исходные тексты:
std::fstream file("config");
Lexer lexer(&file)
while(int token = lexer.yylex())
{
}
Есть два инструмента, которые приступают к уму, хотя вам нужно будет выяснить для себя, что будет подходящим, ANTLR и GoldParser . Есть языковые привязки, доступные в обоих инструментах, в которых он может быть подключен к среде выполнения C ++.