2012-05-09 29 views
6

Tôi có một trình phân tích cú pháp tệp cấu hình đơn giản được xây dựng từ tinh thần :: lex và tinh thần :: qi. Khi lexer đạt đến mẫu include "path" Tôi muốn văn bản của tệp được đưa vào. Như bạn đã biết, tinh thần :: lexer :: bắt đầu() bắt đầu quá trình quét:Làm cách nào để thực hiện bao gồm các chỉ thị bằng cách sử dụng boost :: spirit :: lex?

// Read file contents into a std::string 
... 

// _first and _last are const char* 
_first = _contents.c_str(); 
_last = &_first[_input.size()]; 

// _token is a lexer::iterator_type for the current token 
_token = _lexer.begin(_first, _last); 

Ý tưởng của tôi là phải có một ngăn xếp lưu trữ nhà nước lexer biểu diễn dưới dạng một cấu trúc:

struct LexerState 
{ 
    const char* first; 
    const char* last; 
    std::string contents; 
}; 

Các lexer sẽ được thực hiện để nhận ra các mô hình cho include "path" và trong một hành động ngữ nghĩa trích xuất đường dẫn đến tệp bao gồm. Sau đó, trạng thái lexer hiện tại được đẩy lên ngăn xếp, nội dung của tệp được nạp vào một chuỗi và trạng thái mới được khởi tạo như trên bằng cách sử dụng lexer :: begin().

Khi lexer tìm thấy ký tự EOF, ngăn xếp được bật và lexer :: begin() được gọi bằng cách sử dụng các biến trạng thái lexer trước đó.

Bạn có thể liên tục gọi lexer :: begin() như thế này không? Làm cách nào để nhận lex :: lexer để nhận dạng mẫu include "path" và ký tự EOF mà không trả lại mã thông báo cho trình phân tích cú pháp qi?

Cuối cùng, có cách nào thay thế hoặc tốt hơn để hoàn thành việc này không?

Trả lời

3

Hãy nhìn vào cách Boost Wave làm những việc:

Các Wave Thư viện C++ Preprocessor sử dụng thư viện xây dựng Spirit phân tích cú pháp để thực hiện một C++ lexer với tiêu chuẩn/ANSI ISO khả năng tiền xử lý tuân thủ QTI. Nó cho thấy một giao diện trình lặp, trả về mã thông báo được xử lý hiện tại từ luồng đầu vào. Mã thông báo được xử lý này được tạo ra khi đang di chuyển trong khi lặp qua trình tự của trình xử lý tiền xử lý (trong thuật ngữ của STL các trình vòng lặp này là các trình vòng lặp chuyển tiếp).

Và liên quan đến các tính năng:

C++ Preprocessor cung cấp bốn cơ sở vật chất riêng biệt mà bạn có thể sử dụng như bạn thấy phù hợp:

  • Bao gồm các tập tin tiêu đề
  • mở rộng Macro
  • Biên soạn có điều kiện
  • Điều khiển dòng

Quick Start Sample của chúng hiển thị cách bạn sử dụng giao diện lexer của Wave Wave.

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