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?