Pregunta

I creado test.l, de entrada se flexione, que termina con la función principal.

Cuando la función principal se implementa como:

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

No tengo ningún problema.

quiero engañar al analizador en la creencia de que el primer carácter es siempre un punto y coma, por lo que he implementado como principal

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

lo anterior conduce a un fallo de segmento.

¿Por qué el uso de plomo unput a un fallo segmento?

¿Fue útil?

Solución

Está causando un fallo segmento porque yylex () todavía no se ha inicializado las memorias intermedias de entrada, etc., que son necesarios por unput ().

Hay probablemente una mejor manera de diseñar el escáner sin necesidad de engañar en un punto y coma inicial, pero si tiene que hacer esto, entonces una solución podría ser el uso de condiciones de inicio. Algo como esto:

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

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

... rest of rules ...

Otros consejos

El código de abajo no está mal en su significado.

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

El problema vino de flexión que se declaró la macro unput y por supuesto que debería haber inicializado lex antes.

Sin embargo, si usted pone su exterior principal de la .l file, su código no será segfault.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top