【问题标题】:How do I implement include directives using boost::spirit::lex?如何使用 boost::spirit::lex 实现包含指令?
【发布时间】:2012-05-09 22:47:40
【问题描述】:

我有一个从 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 解析器返回令牌?

最后,是否有任何替代或更好的方法来实现这一点?

【问题讨论】:

    标签: c++ boost boost-spirit boost-spirit-lex


    【解决方案1】:

    看看Boost Wave是怎么做的:

    Wave C++ 预处理器库使用Spirit 解析器构造库来实现具有符合 ISO/ANSI 标准的预处理功能的 C++ 词法分析器。它公开了一个迭代器接口,该接口从输入流中返回当前预处理的令牌。此预处理标记是在迭代预处理器迭代器序列时动态生成的(在 STL 的术语中,这些迭代器是前向迭代器)。

    关于功能:

    C++ 预处理器提供了四种不同的工具,您可以根据需要使用它们:

    • 包含头文件
    • 宏扩展
    • 条件编译
    • 线路控制

    他们的Quick Start Sample 展示了您将如何使用 Boost Wave 的词法分析器界面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多