Gestion des macros #define dans yacc / bison lex
-
06-07-2019 - |
Question
Comment implémenter des macros #define
avec yacc / bison?
Je pensais que tous les caractères définis devaient correspondre à une variable normale. Les variables sont définies comme suit: [a-zA-Z _] [a-zA-Z0-9 _] *
afin que je puisse y insérer une vérification pour voir si la variable est définie ou non . Puis remplacez le texte par ce qu'il devrait être.
Comment puis-je faire ça? Pour le moment, je veux ignorer complètement le mot BAD, comme si je le définissais comme suit: #define BAD
en C. Le code de cette règle lex est présenté ci-dessous, mais je le fais mal. Lex se plaint également de "BA". être dans le courant. Je sais que le texte ci-dessous est complètement faux et illogique. Alors, comment puis-je ignorer MAUVAIS et comment puis-je le remplacer par quelque chose comme float
if(strcmp(yytext, "BAD")==0) {
int i, l = strlen(yytext);
for(i=0; i<l; i++) { REJECT }
return;
}
return VAR; }
Je sais que les étapes principales sont 1) définir le définir, 2) le détecter dans la source 3) faire oublier à Lex les caractères macro 4) insérer les nouveaux caractères corrects.
La solution
Mettez une règle dans lex pour trouver le define. Ensuite, utilisez unput pour insérer le texte de remplacement. Notez que le texte doit être inséré à l'envers
[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;
}