2011-01-17 36 views
6

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!

Trả lời

6

Spirit Lex làm việc với bất kỳ trình lặp nào miễn là nó tuân theo các yêu cầu của các trình vòng lặp chuyển tiếp chuẩn. Điều đó có nghĩa là bạn có thể nạp lexer (gọi lex::tokenize()) với bất kỳ trình lặp nào phù hợp. Ví dụ, nếu bạn muốn sử dụng một std::istream, bạn có thể quấn nó thành một boost::spirit::istream_iterator:

bool tokenize(std::istream& is, ...) 
{ 
    lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

    boost::spirit::istream_iterator first(is); 
    boost::spirit::istream_iterator last; 

    return lex::tokenize(first, last, lex_functor, 
     boost::bind (lex_callback_functor(), _1, ...)); 
} 

và nó sẽ làm việc.

Đối với phần thứ hai của câu hỏi của bạn (liên quan đến số dòng/cột của đầu vào): có, bạn có thể theo dõi vị trí đầu vào bằng cách sử dụng từ khóa. Nó không phải là tầm thường, mặc dù. Bạn cần phải tạo loại mã thông báo của riêng bạn lưu trữ thông tin dòng/cột và sử dụng thông tin này thay vì loại mã thông báo được xác định trước. Nhiều người đã yêu cầu điều này, vì vậy tôi có thể chỉ cần đi trước và tạo một ví dụ.

+0

+1, vâng, các ví dụ mới trong tài liệu về Tinh thần sẽ tuyệt vời :) – Viet

+1

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

+0

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

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