如何使用boost :: spirit :: lex实现include指令?

时间:2012-05-09 22:47:41

标签: 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);

我的想法是拥有一个存储lexer状态的堆栈,表示为struct:

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解析器?

最后,有没有其他或更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

了解 Boost Wave 如何做事:

  

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

关于功能:

  

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

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

他们的Quick Start Sample显示了你如何使用Boost Wave的词法分析器接口。