Обработка #define макросов в yacc/bison lex
Как бы я реализовал #define
макросы с yacc/ бизон?
Я думал, что все определяемые символы должны соответствовать обычной переменной. Переменные определяются как [a-zA-Z_][a-zA-Z0-9_]*
поэтому я полагаю, что могу поставить там проверку, чтобы увидеть, сработала ли переменная define или нет. Затем замените текст таким, каким он должен быть.
Как я могу это сделать? Прямо сейчас я хочу полностью игнорировать слово ПЛОХО, как будто я определил его как #define BAD
в C. Ниже приведен код для этого правила lex, но я делаю это неправильно. Также Лекс жалуется на то, что "БА" находится в потоке. Я знаю, что нижеследующее абсолютно неверно и нелогично, так как мне игнорировать ПЛОХО, а затем как заменить его чем-то вроде 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) вставить новые правильные символы.
1 ответ
Поместите правило в 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;
}