Pregunta

¿Cómo implementaría las macros #define con yacc / bison?

Estaba pensando que todos los caracteres definidos deben coincidir con una variable regular. Las variables se definen como [a-zA-Z _] [a-zA-Z0-9 _] * , así que imagino que puedo poner un cheque allí para ver si la variable está definida o no. . Luego reemplaza el texto con lo que debería ser.

¿Cómo puedo hacer eso? En este momento quiero ignorar completamente la palabra BAD como si la definiera como #define BAD en C. A continuación se muestra el código para esa regla de lex, pero lo estoy haciendo mal. También lex se queja de " BA " estar en la corriente Sé que lo siguiente es completamente incorrecto e ilógico, así que, ¿cómo puedo ignorar MALO y luego cómo reemplazarlo con algo como flotar?

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

Sé que los pasos principales son 1) definir la definición, 2) detectarla en la fuente 3) hacer que lex olvide los caracteres macro 4) insertar los nuevos caracteres correctos.

¿Fue útil?

Solución

Ponga una regla en lex para encontrar la definición. Luego use unput para insertar el texto de reemplazo. Tenga en cuenta que el texto se insertará al revés

[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; 
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top