Всё описанное должно работать в GNU версии макропрепроцессора m4, в операционной системе Windows XP.
Скачать можно отсюда, в первую очередь требуются Binaries и Dependencies. После размещения m4.exe и regex2.dll в одну папку можно начать пользоваться.
Запуск m4.exe без параметров вызывает прогу в REPL-режиме. Чтобы выйти из m4, нужно набрать m4exit. В этом REPL режиме удобно отлаживать свои наработки.
Чтобы обработать файл, достаточно передать его имя в качестве параметра:
m4 u1.pas4
При этом m4 выдаст результат в стандартный вывод. Стандартный вывод можно перенаправить в файл:
m4 u1.pas4 > u1.pas
Если передать несколько файлов, то они будут последовательно выполнены так, как будто это единый файл.
m4 u1.pas4 u2.pas4 > u.pas
Это было то, что касается запуска m4, теперь приступим к собственно использованию. m4 ищет в поступающем тексте макросы и исполняет их. Например, макрос __file__ заменяется на название текущего файла, а __line__ на номер текущей строки.
В m4 есть такое понятие, как цитата, по умолчанию цитаты должны быть заключены в кавычки (обратите внимание, что они разные)
`это цитата'
К примеру, если у вас в тексте встречается __file__, которое не должно быть заменено на имя файла, то его нужно оформить в виде цитаты
`__file__'
m4 при этом отбросит кавычки и останется только __file__.
При помощи макроса changequote можно сменить символы, отвечающие за кавычки:
changequote({,})
После этого цитаты можно оформлять в виде:
{__file__}
Замена стандартных ограничителей цитат полезна при написании программ на паскале, в котором строковые выражения заворачиваются в одинарные кавычки, что может сбить с толку m4.
Вернём стандартные цитатные символы
changequote(`,')
Собственные макросы объявляются при помощи макроса define. Первый переданный ему параметр задаёт имя макроса, а второй тело.
define(`foo', `bar')
Макрос foo будет просто заменяться на bar. $1, $2, $3 и т.д. в теле макроса заменяются на переданные параметры. Например:
define(`assign', `$2 := $1')
assign(a+b, c)
выведет «c := a+b»
Изученного уже достаточно чтобы написать макрос assert для проверки истинности утверждения:
changequote(~,")
define(~assert", ~if not ($1) then begin Writeln('Assert error $1 in __file__:__line__') end")
Пример использования:
assert(Obj <> nil);
Комментариев нет:
Отправить комментарий