Gestione delle macro #define in yacc / bison lex
-
06-07-2019 - |
Domanda
Come implementare le macro #define
con yacc / bison?
Pensavo che tutti i personaggi definiti dovessero corrispondere a una variabile normale. Le variabili sono definite come [a-zA-Z _] [a-zA-Z0-9 _] *
, quindi immagino di poter mettere un segno di spunta per vedere se la variabile è definita, funzionante o no . Quindi sostituire il testo con quello che dovrebbe essere.
Come posso farlo? In questo momento voglio ignorare completamente la parola BAD come se la definissi #define BAD
in C. Di seguito è riportato il codice per quella regola lex, ma sto sbagliando. Anche lex si lamenta di "BA" essere nel flusso. So che il seguito è completamente sbagliato e illogico, quindi come faccio a ignorare BAD e come posso sostituirlo con qualcosa come float
if(strcmp(yytext, "BAD")==0) {
int i, l = strlen(yytext);
for(i=0; i<l; i++) { REJECT }
return;
}
return VAR; }
So che i passaggi principali sono 1) definire la definizione, 2) rilevarla nella fonte 3) far dimenticare a lex i caratteri macro 4) inserire i nuovi caratteri corretti.
Soluzione
Metti una regola in lex per trovare la definizione. Quindi utilizzare unput per inserire il testo sostitutivo. Nota che il testo deve essere inserito al contrario
[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;
}