Парсер данных по произвольной грамматике в 400 строк
Есть много существующих инструментов для парсинга файлов по заданной грамматике. Например, ANTLR или Yacc. Они используют конечные автоматы и генерируют большие файлы с исходным кодом для парсинга. Действительно ли это так сложно? Попробуем сделать сами.
В этой статье я покажу, как можно сделать такой парсер методом рекурсивного спуска. Для сравнения я буду говорить об ANTLR, другие парсеры не рассматриваются. Под катом много примеров кода, без этого сложно объяснить, почему сделано так, а не иначе.
Будем делать парсер для грамматик в ANTLR-like виде. Вот в таком:
C:
| A1? A2* A3
| B1? B2+ B3
;Делать будем на языке PHP. А если получится нормально, перепишем на C++.









Предлагаемая иерархия инструментов (здесь и далее изображения из оригинальной статьи)
