Если вы хотите захватить всю структуру вашего ввода, синтаксический анализатор - единственный путь.Можно рекурсивно кодировать синтаксический анализатор вручную, но в этом нет особого смысла, поэтому существуют инструменты генератора синтаксических анализаторов;используйте их.
Что касается #if #then #else: если вы хотите захватить структуру only , то вам нужна только довольно примитивная грамматика, которая также позволяет токенам, содержащим произвольный текст,подберите goo между символами # if # then # else как каплей текста.
Если вы хотите захватить всю структуру кода, а условные выражения разрешены только в определенных местах, то их существование может быть простоинтегрированы в любой используемый вами BNF.
Если, как я подозреваю, это может произойти в любом месте ("ad hoc"? #if следует стилю препроцессора C, и эти условия могут возникать виртуальногде-нибудь во входном потоке), тогда синтаксический анализ текста и , сохраняющий условные выражения, в настоящее время находится на переднем крае того, что может сделать современный анализ.Это стандартная болезнь C-препроцессинга, и хороших решений для этого не было.Стандартные генераторы парсеров довольно не могут помочь в этом случае.(Парсеры с ручным кодированием здесь тоже не лучше; в любом случае нужно использовать одно и то же решение).
Одна из последних схем (только что сообщенная как результаты исследований PhD за последние несколько месяцев)чтобы справиться с этим, нужно разборчиво разбирать всякий раз, когда найден токен #if для обработки #if и #else, и присоединяться, когда найден #endif;тогда вам нужен способ слияния с сгенерированными поддеревьями, как правило, в виде неоднозначных поддеревьев, помеченных каким плечом условного.
Если вы хотите продолжить свою жизнь, я предлагаю вам просто настаивать на том, чтобы эти условные обозначения возникали в-определенные места в вашей грамматике, и терпеть случайные жалобы от людей, которые пишут неструктурированные директивы препроцессора.(«Вы написали сумасшедший код? Извините, мой инструмент не справляется с этим»).