我有一個從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解析器?
最後,有沒有其他方法或更好的方法來完成這個?