Как мне реализовать #define
макросы с yacc / bison?
Я думал, что все определяемые символы должны соответствовать обычной переменной. Переменные определены как [a-zA-Z_][a-zA-Z0-9_]*
, поэтому я полагаю, что могу поставить там проверку, чтобы увидеть, сработала ли переменная define или нет. Затем замените текст таким, каким он должен быть.
Как я могу это сделать? Сейчас я хочу полностью игнорировать слово BAD, как если бы я определил его как #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) вставить новые правильные символы.