2010-05-08 13 views
16

J'utilise bison & flex (téléchargé via cygwin) avec vC++. Quand je compile le programme que je suis une erreur:difficulté liée à unistd.h lors de la compilation bison & programme flex sous vC++

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

Le code correspondant dans le fichier flex généré est:

#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 je définis YY_NO_UNISTD_H dans le fichier flex (de .L) cette erreur disparaissent, mais je reçois plusieurs autres erreurs:

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

Comment puis-je résoudre ce problème?

Toutes ces erreurs se produisent dans le scanner généré par flex.

Je sais que c'est parce que unistd.h n'existe pas dans Windows. Dois-je écrire mon propre unistd.h? Si oui, comment l'écrire pour éliminer ces erreurs?

Répondre

12

isatty est utilisé par le lexeur pour déterminer si le flux d'entrée est un terminal ou un canal/fichier. Le lexeur utilise cette information pour changer son comportement de mise en cache (le lexeur lit de gros morceaux de l'entrée quand ce n'est pas un terminal). Si vous savez que votre programme ne sera jamais utilisé de manière interactive, vous pouvez ajouter %option never-interactive à votre lexer. Lorsque le programme est exécuté avec une entrée utilisateur, utilisez %option interactive. Lorsque les deux utilisations sont souhaitées, vous pouvez soit générer un lexer interactif, ce qui entraîne une perte de performances lorsqu'il est utilisé en mode de traitement par lots, soit fournir votre propre fonction isatty.

2

unistd.h est un en-tête UNIX, donc il n'est pas présent dans VC++; votre meilleur pari est probablement de le compiler en utilisant g ++ dans Cygwin (ou mingw/msys). Vous pouvez également regarder this question pour d'autres suggestions.

1

J'utilise flex 2.5.4 qui provient du projet GnuWin32, qui ne vérifie pas YY_NO_UNISTD_H.

Dans ma version, Flex ne recherche unistd.h que lorsqu'il est compilé en C++, vous pouvez donc vous épargner tout ce problème si votre yylval n'utilise aucune construction C++.

je devais utiliser la STL en yylval (à l'aide d'un pointeur pour en faire un type POD), donc afin de rendre la compilation flex en C++ je créé ce simple unistd.h:

#include <io.h> 

C'est tout ce qu'il faut (en fait, je pourrais copier le fichier unistd.h fourni avec GnuWin32, comme flyontheweb suggests).

P.S. Pour conclure: dans Bison, j'ai mis les fichiers d'en-tête STL requis par yylval dans %code requires {} et ajouté le répertoire courant aux chemins INCLUDE dans mon makefile.

+0

eu un problème similaire avec exactement cette version – Greg

12

Utilisez %option nounistd dans votre fichier .l pour supprimer la dépendance sur unistd.h.

+4

je l'ai trouvé dans la documentation, mais il ne fonctionnera pas moi. 'unrecognized% option unistd' (même si j'ai spécifié nounistd, donc il semble essayer de le résoudre.) Une idée? En manuel: http://flex.sourceforge.net/manual/Code_002dLevel-And-API-Options.html# index-nounistd-320 – Kissaki

0

Je suis trop en retard mais de toute façon je partagerai mes découvertes pour sauver quelqu'un qui cherche toujours la réponse. Dans mon cas ayant un fichier unistd.h vide à l'endroit où le compilateur cherche des en-têtes fonctionne pour moi.

0

Eh bien, ce post est vieux mais je suis confronté au même problème et voici quelque chose qui devrait fonctionner. WinFlexBison

+0

et voici un article sur la façon d'utiliser ceci avec vs http://www.di-mgt.com.au/flex_and_bison_in_msvc.html – smit

3

utilisation win_flex.exe avec option --wincompat et vous ne avez pas besoin de pirater votre fichier lex