Вам следует исследовать так называемые метакомпиляторы , которые по существу компилируют EBNF в парсеры рекурсивного спуска. Как они это делают - именно ответ на ваш вопрос.
(Это довольно просто, но хорошо, чтобы понять детали).
Действительно замечательная статья - это статья MetaII Вала Шорре. Это технология метакомпилятора, созданная в 1964 году. На 10 страницах он показывает, как создать метакомпилятор, и предоставляет не только это, но и еще один компилятор и вывод обоих !. Есть удивительный момент, когда вы тоже приходите, если собираетесь создать один из них, когда вы поняли, как мета-компилятор компилирует себя, используя свою собственную грамматику. Этот момент меня достал
подключил компилятор примерно в 1970 году, когда я впервые споткнулся о эту статью. Это одна из тех статей по информатике, которую каждый в бизнесе программного обеспечения должен прочитать.
Джеймс Сосед (изобретатель термина «домен» в разработке программного обеспечения и создатель первой системы преобразования программ [на основе этих метакомпиляторов]) предлагает замечательное онлайновое руководство по MetaII для тех, не хочу делать это с нуля. (Я не имею к этому никакого отношения, за исключением того, что мы с соседями были студентами вместе).
Оба способа - прекрасный способ узнать о метакомпиляторах и генерировать парсеры из EBNF.
Ключевые идеи заключаются в том, что левая часть правила создает функцию, которая анализирует этот нетерминал и возвращает true, если совпадение, и продвигает входной поток; false, если совпадения нет и входной поток не продвигается.
Содержание функции определяется по правой стороне. Буквальные токены сопоставляются напрямую.
Нетерминалы вызывают вызовы других функций, сгенерированных для других правил.
Kleene * отображается на циклы while, чередования отображаются на условные ветви. На что ЕБНФ не обращается,
и метакомпиляторы делают, как синтаксический анализ делает что-либо кроме того, чтобы сказать "совпал" или нет?
Секрет в том, как ткать выходные операции в EBNF. Бумага MetaII делает все это кристально чистым.