para instalar descargar visual-c++ cygwin bison flex-lexer

visual c++ - instalar - dificultad relacionada con unistd.h al compilar el programa bison & flex en vc++



gnu flex download (8)

Bueno, esta publicación es antigua, pero tengo el mismo problema y aquí hay algo que debería funcionar. WinFlexBison

Estoy usando bison & flex (descargado a través de cygwin) con vc ++. Cuando compilo el programa, recibí un error:

...: fatal error C1083: Cannot open include file: ''unistd.h'': No such file or directory

El código correspondiente en el archivo generado por flex es:

#ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user''s section 1 to have been scanned first. * The user has a chance to override it with an option. */ /* %if-c-only */ #include <unistd.h> /* %endif */ /* %if-c++-only */ /* %endif */ #endif

Si defino YY_NO_UNISTD_H en el archivo flexible (.l), este error desaparecerá, pero tengo varios otros errores:

...: error C2447: ''{'' : missing function header (old-style formal list?) ...: warning C4018: ''<'' : signed/unsigned mismatch ...: error C3861: ''isatty'': identifier not found

¿Como puedo solucionar este problema?

Todos estos errores ocurren en el escáner generado por flex.

Sé que es porque unistd.h no existe en Windows. ¿Debo escribir mi propio unistd.h? Si es así, ¿cómo escribirlo para eliminar esos errores?


Estoy usando flex 2.5.4 que proviene del proyecto GnuWin32, que no verifica YY_NO_UNISTD_H .

En mi versión, Flex busca unistd.h solo cuando se compila como C ++, por lo que puedes ahorrarte todo este problema si tu yylval no usa ninguna construcción de C ++.

Tuve que usar el STL en yylval (usando un puntero para convertirlo en un tipo POD), así que para hacer una compilación flexible en C ++ creé este sencillo unistd.h :

#include <io.h>

Eso es todo lo que se necesita (en realidad, podría copiar el archivo unistd.h que viene con GnuWin32, como lo sugiere flyontheweb).

PD Para terminar: en Bison pongo los archivos de encabezado STL necesarios de yylval en %code requires {} y agregué el directorio actual a las rutas INCLUDE en mi archivo make.


Use %option nounistd en su archivo .l para eliminar la dependencia de unistd.h .


Ya llego tarde pero de todos modos compartiré mis hallazgos para salvar a alguien que todavía está buscando una respuesta. En mi caso, tener un archivo unistd.h vacío en la ubicación donde el compilador busca los encabezados funciona para mí.



use win_flex.exe con la opción --wincompat y no necesita hackear su archivo lex


isatty es utilizado por el lexer para determinar si el flujo de entrada es un terminal o una tubería / archivo. El lexer usa esta información para cambiar su comportamiento de almacenamiento en caché (el lexer lee grandes fragmentos de la entrada cuando no es un terminal). Si sabe que su programa nunca se usará de manera interactiva, puede agregar %option never-interactive a usted más lexer. Cuando el programa se ejecuta con la entrada del usuario, use %option interactive . Cuando se desean ambos usos, puede generar un lector interactivo, que da una pérdida de rendimiento cuando se utiliza en modo batch, o proporciona su propia función isatty .


unistd.h es un encabezado UNIX, por lo que no está presente en VC ++; su mejor apuesta es probablemente compilarlo usando g ++ en Cygwin (o mingw / msys). También puede ver esta pregunta para otras sugerencias.