2010-05-08 9 views
16

Ich bin bison & flex (über Cygwin heruntergeladen) mit VC++. Wenn ich das Programm kompilieren bekam ich einen Fehler:Unistd.h verwandte Schwierigkeit beim Kompilieren von Bison & Flex-Programm unter VC++

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

Der entsprechende Code in der Flex-generierte Datei ist:

#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 

Wenn ich YY_NO_UNISTD_H in der Flex-Datei (.l) dieser Fehler definieren verschwinden, aber ich bekomme mehrere andere Fehler:

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

Wie kann ich dieses Problem beheben?

Alle diese Fehler treten im Flex-generierten Scanner auf.

Ich weiß, es ist, weil unistd.h nicht in Windows existiert. Muss ich mein eigenes unistd.h schreiben? Wenn ja, wie schreibe ich es, um diese Fehler zu beseitigen?

Antwort

12

isatty wird vom Lexer verwendet, um festzustellen, ob der Eingabestream ein Terminal oder eine Pipe/Datei ist. Der Lexer verwendet diese Information, um sein Caching-Verhalten zu ändern (der Lexer liest große Teile der Eingabe, wenn es kein Terminal ist). Wenn Sie wissen, dass Ihr Programm niemals interaktiv verwendet wird, können Sie Ihrem Lexmark hinzufügen. Wenn das Programm mit Benutzereingaben ausgeführt wird, verwenden Sie %option interactive. Wenn beide Verwendungsmöglichkeiten gewünscht werden, können Sie entweder einen interaktiven Lexer generieren, der im Batch-Modus zu einem Leistungsverlust führt, oder eine eigene isatty-Funktion bereitstellen.

2

unistd.h ist ein UNIX-Header, daher ist es in VC++ nicht vorhanden; Ihre beste Wette ist wahrscheinlich, es mit g ++ in Cygwin (oder mingw/msys) zu kompilieren. Sie können auch this question für andere Vorschläge ansehen.

1

Ich verwende Flex 2.5.4, die aus dem GnuWin32 Projekt kommt, die für YY_NO_UNISTD_H nicht überprüfen.

In meiner Version sucht Flex nur nach unistd.h, wenn es als C++ kompiliert wird, also können Sie sich all diese Probleme ersparen, wenn Ihr yylval keine C++ - Konstrukte verwendet.

ich die STL in yylval zu verwenden hatte (einen Zeiger verwenden sie ein POD-Typ zu machen), so, um in C flex Kompilierung zu machen ++ Ich habe diese einfache unistd.h:

#include <io.h> 

Das ist alles, was es braucht (eigentlich könnte ich die unistd.h-Datei, die mit GnuWin32 kommt, wie flyontheweb suggests kopieren).

P.S. Um etwas zu ergänzen: In Bison habe ich Yylvals erforderliche STL-Header-Dateien in %code requires {} eingefügt und das aktuelle Verzeichnis den INCLUDE-Pfaden in meinem Makefile hinzugefügt.

+0

hatte ein ähnliches Problem zu hacken genau diese Version – Greg

12

Verwenden %option nounistd in Ihrer .l Datei, um die Abhängigkeit von unistd.h zu entfernen.

+4

ich es in der Dokumentation gefunden, aber es wird einfach nicht funktionieren für mich. 'unrecognized% option unistd' (obwohl ich Nomenistd angegeben habe, so scheint es zu versuchen, es zu lösen. Irgendwelche Idee? Im Handbuch: http://flex.sourceforge.net/manual/Code_002dLevel-And-API-Options.html# index-nounistd-320 – Kissaki

0

Ich bin zu spät, aber trotzdem werde ich meine Erkenntnisse teilen jemand noch nach Antworten suchen zu speichern. In meinem Fall funktioniert eine leere unistd.h-Datei an dem Ort, an dem der Compiler nach Headern sucht, für mich.

0

Nun Dieser Beitrag ist alt, aber ich vor dem gleichen Problem und hier ist etwas, das funktionieren sollte. WinFlexBison

+0

und hier ist ein Artikel darüber, wie man dies mit vs http://www.di-mgt.com.au/flex_and_bison_in_msvc.html verwenden – smit

3

Verwendung win_flex.exe mit Option --wincompat und Sie nicht benötigen eine lex Datei mit