24
votes

I'm using bison & flex (downloaded via cygwin) with vc++. When I compile the program I got an error:

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

The corresponding code in the flex-generated file is:

#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

If I define YY_NO_UNISTD_H in the flex file(.l) this error will disappear, but I get several other errors:

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

How can I fix this problem?

All these errors occur in the flex-generated scanner.

I know it's because unistd.h doesn't exist in windows. Do I have to write my own unistd.h? If so how to write it in order to eliminate those errors?

8

8 Answers

17
votes

isatty is used by the lexer to determine if the input stream is a terminal or a pipe/file. The lexer uses this information to change its caching behavior (the lexer reads large chunks of the input when it is not a terminal). If you know that your program will never be used in an interactive kind, you can add %option never-interactive to you lexer. When the program is run with user input, use %option interactive. When both uses are desired, you can either generate an interactive lexer, which gives a performance loss when used in batch mode, or provide your own isatty function.

16
votes

Use %option nounistd in your .l file to remove the dependence on unistd.h.

10
votes

use win_flex.exe with option --wincompat and you dont need to hack your lex file

9
votes

just in case somebody's still this problem, Flex comes with unistd.h within its devel files. I found this here:

http://sourceforge.net/tracker/index.php?func=detail&aid=931222&group_id=23617&atid=379173

to put it short, just make sure your compiler can reach it. in my case it's just adding "C:\GnuWin32\include" to the additional inclusion directories

2
votes

unistd.h is a UNIX header, so it's not present in VC++; your best bet is probably to compile it using g++ in Cygwin (or mingw/msys). You could also look at this question for other suggestions.

1
votes

I'm using flex 2.5.4 that comes from the GnuWin32 project, which doesn't check for YY_NO_UNISTD_H.

In my version, Flex looks for unistd.h only when being compiled as C++, so you can save yourself all this trouble if your yylval doesn't use any C++ constructs.

I had to use the STL in yylval (using a pointer to make it a POD type), so in order to make flex compile in C++ I created this simple unistd.h:

#include <io.h>

That's all it takes (actually, I could copy the unistd.h file that comes with GnuWin32, like flyontheweb suggests).

P.S. To wrap things up: in Bison I put yylval's required STL header files in %code requires {} and added the current directory to the INCLUDE paths in my makefile.

1
votes

I am too late but anyway I will share my findings to save someone still looking for answer. In my case having an empty unistd.h file in the location where compiler looks for headers works for me.

0
votes

Well this post is old but I face the same problem and here is something that should work. WinFlexBison