2010-05-08 21 views
16

Estoy usando bison & flex (descargado a través de cygwin) con vC++. Cuando compilo el programa me dio un error:unistd.h dificultad relacionada al compilar el programa bison & flex en vC++

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

El código correspondiente en el archivo generado por el 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 flex (.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 

¿Cómo 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?

Respuesta

12

isatty es usado 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 lexer interactivo, que da una pérdida de rendimiento cuando se utiliza en modo batch, o proporcionar su propia función isatty.

2

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 consultar this question para otras sugerencias.

1

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

En mi versión, Flex busca unistd.h solo cuando se compila como C++, por lo que puede ahorrarse todos estos problemas si su yylval no utiliza ninguna construcción de C++.

tuve que usar el TEL en yylval (usando un puntero para que sea un tipo POD), por lo que con el fin de realizar la flexión de compilación en C++ que 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 flyontheweb suggests).

P.S. Para concluir: en Bison puse los archivos de encabezado STL necesarios de yylval en %code requires {} y agregué el directorio actual a las rutas INCLUDE en mi archivo MAKE.

+0

tenido un problema similar con exactamente esa versión – Greg

12

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

+4

lo encontré en la documentación, pero simplemente no funcionarán para yo. '% no-opción no reconocida unistd' (aun cuando especifique nounistd, entonces parece intentar resolverlo. ¿Alguna idea? En el manual: http://flex.sourceforge.net/manual/Code_002dLevel-And-API-Options.html# index-nounistd-320 – Kissaki

0

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í.

0

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

+0

y aquí hay un artículo sobre cómo usar esto con vs http://www.di-mgt.com.au/flex_and_bison_in_msvc.html – smit

3

uso win_flex.exe con la opción --wincompat y usted no necesita cortar su archivo lex

Cuestiones relacionadas