2009-10-23 14 views
2

Comment implémenter les macros #define avec yacc/bison?Gestion des macros #define dans yacc/bison lex

Je pensais que tous les caractères doivent correspondre à une variable régulière. Les variables sont définies comme [a-zA-Z_][a-zA-Z0-9_]* donc je pense que je peux y mettre une coche pour voir si la variable est définie ou non. Puis remplacez le texte par ce qu'il devrait être.

Comment puis-je faire cela? En ce moment je veux complètement ignorer le mot BAD comme si je l'ai défini comme #define BAD en C. Ci-dessous est le code pour cette règle lex mais je le fais mal. Aussi lex se plaint de "BA" étant dans le flux. Je sais que le dessous est complètement faux et illogique alors comment puis-je ignorer BAD et comment puis-je le remplacer par quelque chose comme flotteur

if(strcmp(yytext, "BAD")==0) { 
     int i, l = strlen(yytext); 
     for(i=0; i<l; i++) { REJECT } 
     return; 
    } 
    return VAR; } 

Je connais les grandes étapes sont 1) définissent la définissent, 2) détecter dans source 3) make lex oublie les macros 4) insère les nouveaux caractères corrects.

Répondre

2

Mettez une règle dans lex pour trouver le define. Utilisez ensuite 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; 
     }