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.

È stato utile?

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; 
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top