Я просто пытаюсь написать гибкий код, который будет читать файл C и записывать его в другой файл после развертывания макросов. Моя идея состоит в том, чтобы хранить определения макросов, объявленные в начале программы, в массиве пары (ключ, значение). Таким образом, регулярное выражение для определения определений макросов может быть (на данный момент, рассмотрим только операторы #define):
%x DEFINE
%x DEFINE2
"#define" {BEGIN DEFINE};
<DEFINE>[a-zA-Z]+ {/* key = yytext*/}
<DEFINE>[ ] { BEGIN DEFINE2;/* begin the second state when a whitespace is encountered, it means the second part of the definition*/}
<DEFINE2>[a-zA-Z]+ { /* arr[key] = yytext; (storing the key value pair) */}
<DEFINE2> [ \t\n]+ {BEGIN INITIAL;}
Выражения говорят сами за себя. Основной проблемой, с которой я сталкиваюсь при расширении макросов, является обнаружение появления макроклавиши, которую мы сохранили в этих инструкциях. Как обрабатывать операторы макросов такого типа?:
#define square(x) ((x)*(x))
...
int a,b = 4;
a = square(b);
Лучшим способом может быть добавление нового регулярного выражения в спецификацию flex всякий раз, когда встречается оператор #define
. Но я не думаю, что это возможно.
Итак, есть ли какое-нибудь решение для эффективного расширения макросов? Как это делается на практике?