2010-05-08 37 views
16

Tôi đang sử dụng bison & flex (tải xuống qua cygwin) với vC++. Khi tôi biên dịch chương trình tôi có một lỗi:khó khăn liên quan đến unistd.h khi biên dịch chương trình bison & flex theo vC++

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

Mã tương ứng trong file flex tạo là:

#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 

Nếu tôi xác định YY_NO_UNISTD_H trong file flex (.l) lỗi này sẽ biến mất, nhưng tôi gặp một số lỗi khác:

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

Làm cách nào để khắc phục sự cố này?

Tất cả các lỗi này xảy ra trong máy quét được tạo flex.

Tôi biết đó là vì unistd.h không tồn tại trong cửa sổ. Tôi có phải viết unistd.h của riêng mình không? Nếu vậy làm thế nào để viết nó để loại bỏ những sai sót?

Trả lời

12

isatty được lexer sử dụng để xác định xem luồng đầu vào có là đầu cuối hay đường ống/tệp hay không. Các lexer sử dụng thông tin này để thay đổi hành vi bộ nhớ đệm của nó (lexer đọc khối lớn của đầu vào khi nó không phải là một thiết bị đầu cuối). Nếu bạn biết rằng chương trình của bạn sẽ không bao giờ được sử dụng trong một loại tương tác, bạn có thể thêm %option never-interactive để bạn lexer. Khi chương trình được chạy với đầu vào của người dùng, hãy sử dụng %option interactive. Khi sử dụng cả hai mong muốn, bạn có thể tạo ra một lexer tương tác, cho phép giảm hiệu suất khi được sử dụng trong chế độ hàng loạt hoặc cung cấp chức năng isatty của riêng bạn.

2

unistd.h là tiêu đề UNIX, vì vậy nó không có trong VC++; đặt cược tốt nhất của bạn có lẽ là biên dịch nó bằng cách sử dụng g ++ trong Cygwin (hoặc mingw/msys). Bạn cũng có thể xem this question để biết các đề xuất khác.

9

chỉ trong trường hợp ai đó vẫn gặp sự cố này, Flex đi kèm với unistd.h trong các tệp devel của nó. Tôi thấy điều này ở đây:

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

để đặt nó ngắn, chỉ cần đảm bảo trình biên dịch của bạn có thể đạt được nó. trong trường hợp của tôi, chỉ cần thêm "C: \ GnuWin32 \ include" vào các thư mục bao gồm bổ sung

1

Tôi đang sử dụng flex 2.5.4 đến từ dự án GnuWin32, không kiểm tra YY_NO_UNISTD_H.

Trong phiên bản của tôi, Flex chỉ cho unistd.h khi được biên dịch thành C++, vì vậy bạn có thể tự khắc phục mọi sự cố này nếu yylval không sử dụng bất kỳ cấu trúc C++ nào.

tôi đã phải sử dụng STL trong yylval (sử dụng một con trỏ để làm cho nó một loại POD), vì vậy để thực hiện biên dịch flex trong C++ Tôi tạo ra này đơn giản unistd.h:

#include <io.h> 

Đó là tất cả phải mất (thực sự, tôi có thể sao chép tập tin unistd.h đi kèm với GnuWin32, như flyontheweb suggests).

P.S. Để kết thúc mọi thứ: trong Bison, tôi đặt các tệp tiêu đề STL yêu cầu của yylval trong %code requires {} và thêm thư mục hiện tại vào đường dẫn INCLUDE trong tệp makefile của tôi.

+0

đã có một vấn đề tương tự với chính xác rằng phiên bản – Greg

12

Sử dụng %option nounistd trong tệp .l của bạn để xóa sự phụ thuộc vào unistd.h.

+4

Tôi tìm thấy nó trong các tài liệu, nhưng nó chỉ sẽ không làm việc cho tôi. 'unrecognized% option unistd' (mặc dù tôi đã chỉ định nounistd, vì vậy nó dường như cố gắng giải quyết nó. Bất kỳ ý tưởng nào? Trong hướng dẫn sử dụng: http://flex.sourceforge.net/manual/Code_002dLevel-And-API-Options.html# index-nounistd-320 – Kissaki

0

Tôi đã quá muộn nhưng dù sao tôi cũng sẽ chia sẻ những phát hiện của mình để cứu ai đó vẫn đang tìm câu trả lời. Trong trường hợp của tôi có một tập tin unistd.h trống ở vị trí mà trình biên dịch tìm tiêu đề làm việc cho tôi.

0

Bài đăng này là cũ nhưng tôi phải đối mặt với cùng một vấn đề và đây là một cái gì đó mà nên làm việc. WinFlexBison

+0

và đây là một bài viết về cách sử dụng nó với vs http://www.di-mgt.com.au/flex_and_bison_in_msvc.html – smit

3

sử dụng win_flex.exe với tùy chọn --wincompat và bạn không cần phải hack tập tin lex bạn

Các vấn đề liên quan