Обработка #define макросов в yacc / bison lex
-
06-07-2019 - |
Вопрос
Как мне реализовать макросы #define
с помощью yacc / bison?
Я думал, что все определяемые символы должны соответствовать обычной переменной. Переменные определены как [a-zA-Z _] [a-zA-Z0-9 _] *
, поэтому я решил поставить там проверку, чтобы увидеть, сработала ли переменная define или нет , Затем замените текст таким, каким он должен быть.
Как я могу это сделать? Сейчас я хочу полностью игнорировать слово BAD, как если бы я определил его как #define BAD
в C. Ниже приведен код для этого правила lex, но я делаю это неправильно. Также Лекс жалуется на «BA» быть в потоке Я знаю, что приведенное ниже абсолютно неверно и нелогично, поэтому как мне игнорировать ПЛОХО, а затем как заменить его чем-то вроде float
if(strcmp(yytext, "BAD")==0) {
int i, l = strlen(yytext);
for(i=0; i<l; i++) { REJECT }
return;
}
return VAR; }
Я знаю, что основные шаги: 1) определить определение, 2) определить его в источнике 3) заставить lex забыть символы макросов 4) вставить новые правильные символы.
Решение
Поместите правило в lex, чтобы найти определение. Затем используйте unput для вставки замещающего текста. Обратите внимание, что текст должен быть вставлен назад
[a-zA-Z0-9_]* {
if(strcmp(yytext, "HARDCODED_DEFINE")==0) {
const char s[]="int replacement_text";
int z;
for(z=strlen(s)-1; z>=0; z--)
unput(s[z]);
}
else
return VAR_TOK;
}