августа 05, 2010

Азы M4

Всё описанное должно работать в 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);


Комментариев нет:

Отправить комментарий

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru