Pergunta

Como eu poderia implementar macros #define com yacc / bison?

Eu estava pensando tudo definir caracteres deve coincidir com uma variável regular. Variáveis ??são definidas como [a-zA-Z_][a-zA-Z0-9_]* então eu acho que eu posso colocar um cheque lá para ver se a variável é um define'd funcionou ou não. Em seguida, substitua o texto com o que deveria ser.

Como posso fazer isso? Agora eu quero ignorar completamente a palavra BAD como se eu definiu como #define BAD em C. Abaixo está o código para essa regra lex, mas eu estou fazendo errado. Também lex reclama "BA" estar no fluxo. Eu sei que o abaixo é completamente errada e ilógica assim como faço para ignorar BAD e, em seguida, como faço para substituí-lo por algo como flutuador

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

Eu sei que os principais passos são: 1) definir a definir, 2) detectá-lo na fonte 3) fazer lex esquecer os personagens macro 4) Introduza os novos caracteres corretos.

Foi útil?

Solução

Coloque uma regra lex para encontrar a definir. Em seguida, use a entrada para inserir o texto de substituição. Observe o texto deve ser inserido ao contrário

[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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top