我有一个简单的配置文件解析器,由 spirit::lex 和 spirit::qi 构建。当词法分析器达到模式时,include "path"
我希望包含文件的文本。你可能知道,spirit::lexer::begin() 开始扫描过程:
// 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);
我的想法是有一个堆栈来存储表示为结构的词法分析器状态:
struct LexerState
{
const char* first;
const char* last;
std::string contents;
};
词法分析器将识别模式include "path"
并在语义操作中提取包含文件的路径。然后,当前的词法分析器状态被压入堆栈,文件的内容被加载到一个字符串中,并使用 lexer::begin() 像上面一样初始化新状态。
当词法分析器找到 EOF 字符时,堆栈被弹出并使用先前的词法分析器状态变量调用 lexer::begin()。
像这样反复调用 lexer::begin() 可以吗?如何让 lex::lexer 识别include "path"
模式和 EOF 字符而不向 qi 解析器返回令牌?
最后,是否有任何替代或更好的方法来实现这一点?