Manipulação # define macros no yacc / bison lex
-
06-07-2019 - |
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.
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;
}