Bry*_*man 6 c++ boost boost-spirit boost-spirit-lex
我有一个简单的配置文件解析器,由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);
Run Code Online (Sandbox Code Playgroud)
我的想法是有一个存储lexer状态的堆栈表示为结构:
struct LexerState
{
const char* first;
const char* last;
std::string contents;
};
Run Code Online (Sandbox Code Playgroud)
词法分析器将识别模式,include "path"并在语义动作中提取包含文件的路径.然后,将当前词法分析器状态推入堆栈,将文件的内容加载到字符串中,并使用lexer :: begin()按上述方式初始化新状态.
当词法分析器找到EOF字符时,弹出堆栈并使用先前的词法分析器状态变量调用lexer :: begin().
可以这样重复调用lexer :: begin()吗?如何让lex :: lexer识别include "path"模式和EOF字符而不将令牌返回到qi解析器?
最后,有没有其他或更好的方法来实现这一目标?
看看Boost Wave是如何做事的:
C
Wave++ 预处理器库使用Spirit解析器构造库来实现具有符合 ISO/ANSI 标准的预处理功能的 C++ 词法分析器。它公开一个迭代器接口,该接口从输入流返回当前预处理的标记。该预处理标记是在迭代预处理器迭代器序列时动态生成的(在 STL 的术语中,这些迭代器是前向迭代器)。
关于功能:
C++ 预处理器提供了四个独立的工具,您可以根据需要使用它们:
- 包含头文件
- 宏观扩张
- 条件编译
- 线路控制
他们的快速入门示例展示了如何使用 Boost Wave 的词法分析器界面。
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |