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.

Était-ce utile?

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; 
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top