我有一个由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 解析器返回标记?
最后,有没有其他替代或更好的方法来实现这一目标?
看看如何升压波 http://www.boost.org/doc/libs/1_49_0/libs/wave/index.html做事:
The Wave
C++ 预处理器库使用Spirit
解析器构建库,用于实现具有符合 ISO/ANSI 标准的预处理功能的 C++ 词法分析器。它公开一个迭代器接口,该接口从输入流返回当前预处理的标记。该预处理标记是在迭代预处理器迭代器序列时动态生成的(在 STL 的术语中,这些迭代器是前向迭代器)。
关于功能:
C++ 预处理器提供了四个独立的工具,您可以根据需要使用它们:
Their 快速入门示例 http://www.boost.org/doc/libs/1_49_0/libs/wave/samples/quick_start/quick_start.cpp展示了如何使用 Boost Wave 的词法分析器界面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)