Tôi đang tìm cách viết lexer bằng cách sử dụng boost :: spirit :: lex, nhưng tất cả các ví dụ tôi có thể tìm thấy dường như giả định rằng bạn đã đọc toàn bộ tệp vào RAM trước. Tôi muốn viết một lexer mà không yêu cầu toàn bộ chuỗi được trong RAM, là có thể? Hay tôi cần phải sử dụng cái gì khác?Làm thế nào để sử dụng Boost :: Spirit :: Lex để lex một tập tin mà không cần đọc toàn bộ tập tin vào bộ nhớ đầu tiên?
Tôi đã thử sử dụng istream_iterator, nhưng tăng cung cấp cho tôi một lỗi biên dịch trừ khi tôi sử dụng const char * làm loại trình lặp.
ví dụ: Tất cả các ví dụ tôi có thể tìm về cơ bản đều làm như sau:
lex_functor_type< lex::lexertl::lexer<> > lex_functor;
// assumes entire file is in memory
char const* first = str.c_str();
char const* last = &first[str.size()];
bool r = lex::tokenize(first, last, lex_functor,
boost::bind(lex_callback_functor(), _1, ...));
Ngoài ra, có thể xác định số dòng/cột từ mã thông báo lex bằng cách nào đó không?
Cảm ơn!
+1, vâng, các ví dụ mới trong tài liệu về Tinh thần sẽ tuyệt vời :) – Viet
Tôi đã thực hiện điều đó. Boost V1.47 sẽ có loại mã thông báo như vậy và một ví dụ mới minh họa cách sử dụng nó. – hkaiser
Cảm ơn bạn Harmut! Rất mong được tăng 1,47 phát hành với Thần mới! – Viet