2012-05-09 1 views
6

У меня есть простой синтаксический анализатор конфигурации, построенный из spirit :: lex и spirit :: qi. Когда лексер достигает шаблона include "path" Я хочу, чтобы текст файла был включен. Как вы знаете, дух :: лексер :: начать() запускает процесс сканирования:Как реализовать директивы include с помощью boost :: spirit :: lex?

// 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; 
}; 

lexer будет распознан шаблон для include "path" и в семантическом действии выберете путь к включенному файлу. Затем текущее лексерское состояние помещается в стек, содержимое файла загружается в строку, а новое состояние инициализируется, как указано выше, с помощью lexer :: begin().

Когда лексер находит символ EOF, стек выталкивается, а lexer :: begin() вызывается с использованием предыдущих переменных состояния лексера.

Можно ли повторно называть lexer :: begin() следующим образом? Как мне получить lex :: lexer для распознавания шаблона include "path" и символа EOF без возврата маркера в парсер qi?

И, наконец, есть ли какие-либо альтернативные или лучшие способы достижения этого?

ответ

3

Посмотрите, как Boost Wave делает вещи:

Библиотека препроцессор Wave C++ использует Spirit парсера библиотеку строительства для реализации C++ лексера со стандартами ANSI/ISO согласующихся возможности предварительной обработки. Он предоставляет интерфейс итератора, который возвращает текущий предварительно обработанный токен из входного потока. Этот предварительно обработанный токен генерируется «на лету», итерации по последовательности итератора препроцессора (в терминологии STL эти итераторы являются итераторами вперед).

А относительно возможности:

C++ препроцессор содержит четыре отдельных объектов, которые вы можете использовать по своему усмотрению:

  • включения заголовочных файлов
  • макроподстановкам
  • Условная компиляция
  • Контроль линии

Их Quick Start Sample показывает, как вы будете использовать Повысьте интерфейс лексического анализатора волны.

 Смежные вопросы

  • Нет связанных вопросов^_^