2012-05-09 21 views
6

我有一個從spirit :: lex和spirit :: qi構建的簡單配置文件解析器。當詞法分析器達到include "path"模式時,我想要包含文件的文本。正如你可能知道,精神::詞法分析::開始()開始掃描:如何使用boost :: spirit :: lex實現include指令?

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

最後,有沒有其他方法或更好的方法來完成這個?

回答

3

看一看Boost Wave如何做的事情:

Wave C++預處理器庫使用Spirit解析器建設庫來實現與ISO/ANSI標準符合性預處理功能的C++詞法分析器。它公開了一個迭代器接口,它從輸入流中返回當前預處理的標記。這個預處理的標記是在迭代預處理器迭代器序列的同時動態生成的(在STL的術語中,這些迭代器是前向迭代器)。

以及有關特點:

C++預處理器提供了四個獨立的設施,你認爲合適,您可以使用:

  • 的頭文件納入
  • 宏擴展
  • 條件編譯
  • 行控制

他們Quick Start Sample顯示你如何使用boost Wave的詞法分析器接口。

相關問題