Pergunta

Eu criei test.l, entrada para flex, que termina com a função principal.

Quando a função principal é implementada como:

int
main(void)
{
    yylex();
    return 0;
}

Não tenho nenhum problema.

Eu quero enganar o analisador em acreditar que o primeiro caractere é sempre um ponto e vírgula, então eu implementado principal como

int
main(void)
{
    unput(';');
    yylex();
    return 0;
}

os acima conduz a uma falha de segmento.

Por que o uso de chumbo unput a uma falha segmento?

Foi útil?

Solução

-se fazendo com que uma falha segmento porque yylex () ainda não foi inicializado os buffers de entrada, etc., que são necessários pelo unput ().

Há provavelmente uma maneira melhor de projetar seu scanner sem a necessidade de enganar-lo em um ponto e vírgula líder, mas se você deve fazer isso, então uma solução pode ser usar começar condições. Algo parecido com isto:

%x SPECIAL
%%
    BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */

<SPECIAL>.  { unput(*yytext); unput(';'); BEGIN(INITIAL); }

... rest of rules ...

Outras dicas

O código abaixo não é errado em significado.

int main(void) { unput(';'); yylex(); return 0; }

O problema veio flexível que declarou a macro unput e, claro, você deve ter inicializado lex antes.

Mas se você colocar o seu fora principal do .l file, seu código não vai segfault.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top