Условная компиляция/интерпретация с использованием m4

Я хотел бы использовать m4 в качестве препроцессора для нескольких разных языков сценариев, в которых нет этой возможности.

В частности, мне нужно эмулировать функциональность препроцессора C (cpp) условного включения кода:

#if something

some
long
code
block

#else

alternate
code
block

#if something-else

do
more
stuff

#endif

#endif

ifelse() m4 не особенно подходит для длинных блоков кода, поэтому кажется, что мне по существу нужно написать макросы m4, чтобы эмулировать это, проверяя условие, а затем используя divert для включения или исключения блоков по мере необходимости.

Сложная часть будет отслеживать уровни вложенности; насколько я могу судить, для этого мне придется реализовать свой собственный стек в m4. Это кажется концептуально простым, и я уверен, что через день или два взлома я смогу получить работающую систему.

Но это похоже на изобретение велосипеда. Я, конечно, не могу быть первым человеком с этой потребностью. Существующие, проверенные, надежные решения, безусловно, лучше, чем все, что я могу собрать, будучи новичком в ранге m4.

Существуют ли общие идиомы m4 для этого? Существует ли для этого код m4 с открытым исходным кодом? Копание в поисковиках ничего полезного не дало.

(Использование самого cpp не будет работать по причинам, указанным в собственной документации cpp: «Он будет подавляться при вводе, который не подчиняется лексическим правилам C». Похоже gpp имеет эту функциональность из коробки, поэтому ее использование может иметь больше смысла, но я предпочитаю вездесущность m4, если не слишком сложно заставить m4 делать это.)


person Targeloid    schedule 27.05.2018    source источник


Ответы (1)


Я тоже искал это и в итоге написал свой собственный. Вот ссылка на код на моей вики:

http://www.eugeneweb.com/wiki/Sites/M4Macros

Я определил имена без #, например. IF, ELSE, ENDIF и т. д. Также M4 требует, чтобы скобки содержали аргументы, в то время как CPP (в основном) этого не делает. Я также добавил выборочный вызов для защиты макросов с побочными эффектами от вызова в невыбранном блоке. Чао.

person Mr Clif    schedule 07.04.2021