Обработка макроса C - PullRequest
       26

Обработка макроса C

1 голос
/ 16 ноября 2009

Я думаю о лучшем способе записи C определения процессора, который сможет обрабатывать макросы. К сожалению, ничего умного не приходит мне в голову. Он должен вести себя точно так же, как в C , поэтому он обрабатывает выражения, подобные этому:

#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, b));

Или это:

#define F 10
#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, F));

Я знаю о функциях установки и поиска из K & R2, что еще мне нужно для заменить текст в скобках? У кого-нибудь есть совет или какой-нибудь псевдокод? Я знаю, что это сложная задача, но, тем не менее, как лучше всего это сделать?

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

Макропроцессоры очень интересны, но могут стать трудным зверем для приручения (например, подумайте о рекурсивных расширениях).

Вы можете посмотреть на реализацию уже существующих макропроцессоров, таких как M4 (http://www.scs.stanford.edu/~reddy/links/gnu/m4.pdf).

В общих чертах вам понадобится:

  • анализатор, который сначала извлечет определения макросов из ваших файлов (конечно, удаляя их из файла)
  • другой синтаксический анализатор, который определяет, где макросы должны быть раскрыты, и выполняет раскрытие (например, вы захотите пропустить строки и комментарии!)

Я думаю, это очень интересное упражнение. Правильная структура данных для обработки всего этого не тривиальна.

0 голосов
/ 16 ноября 2009

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

Регулярное выражение в основном соответствует строке предопределенному шаблону.

Некоторые программы / библиотеки regexp (сокращение от регулярного выражения):
- Boost.Regexp
- регулярное выражение библиотеки GNU C
- PCRE

А лексер - это часть программного обеспечения, которая делает что-то с сопоставленным текстом, например, заменяя этот фрагмент текста каким-либо другим фрагментом текста, в основном то, что вам, кажется, нужно.

Некоторые известные лексеры:
- flex
- Boost.Wave

0 голосов
/ 16 ноября 2009

2 предложения:

то есть "не пытайтесь делать это дома".

...