Frage

Wie würde ich #define Makros mit yacc / Bison implementieren?

Ich dachte, alle define Zeichen müssen eine reguläre Variable entsprechen. Variablen wie [a-zA-Z_][a-zA-Z0-9_]* definiert, damit ich mich heraus es einen Scheck setzen kann, um zu sehen, ob die Variablen ein define'd sind funktionierte oder nicht. Dann ersetzen Sie den Text mit dem, was es sein sollte.

Wie kann ich das tun? Im Moment möchte ich völlig das Wort BAD ignorieren, als ob ich es als #define BAD in C definierte Unten ist der Code für die lex Regel aber ich tue es falsch. Auch lex beschwert sich über „BA“ in dem Strom ist. Ich weiß, das unter völlig falsch und unlogisch, so wie kann ich ignorieren BAD und dann, wie ersetze ich es mit so etwas wie float

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

Ich kenne die wichtigsten Schritte sind: 1) definieren die definieren, 2) erkennen sie in der Quelle 3) machen lex die Makro-Zeichen 4) vergessen, die neuen richtigen Zeichen eingefügt werden.

War es hilfreich?

Lösung

Setzen Sie eine Regel in lex die Definition zu finden. Danach erfolgt die Eingabe verwenden Sie den Ersetzungstext einzufügen. den Text Hinweis ist nach hinten eingefügt werden

[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; 
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top