boost :: spirit с нестандартным (нестроковым) входным потоком - PullRequest
2 голосов
/ 28 марта 2012

Как можно использовать boost :: spirit с вводом, который состоит из чего-то, кроме символов?

В моем случае у меня есть std :: vector , который я хотел бы рассматривать как поток токенов в моей грамматике, где каждый AbstractBaseClass является токеном.Что-то вроде:

struct AbstractBaseClass
{
};

struct ConcreteClassA : public AbstractBaseClass
{
};

struct ConcreteClassB : public AbstractBaseClass
{
};


std::vector<AbstractBaseClass> stream;
std::vector<AbstractBaseClass>::iterator iter = stream.begin();
std::vector<AbstractBaseClass>::iterator end = stream.end();
bool r = boost::spirit::qi::parse( iter, end, TOKEN_ID_FOR_CONCRETE_CLASS_A >> TOKEN_ID_FOR_CONCRETE_CLASS_B >> TOKEN_ID_FOR_CONCRETE_CLASS_A );

Какие методы мне нужно добавить в мои классы / как должен выглядеть идентификатор токена для поддержки этого?

Предположительно, мне нужно предоставить что-то аналогичное для повышения:: spirit :: lex :: token_def <> и boost :: spirit :: lex :: token <>.

Я рассмотрел их использование напрямую, но эти два класса, похоже, предполагают, что под токеном лексера существует необработанный поток символов, что не так в моем случае;Я получаю токены напрямую.

Редактировать:

Ну, я ответил на свой вопрос.Я оставлю это на всякий случай, если кто-то еще может найти это полезным.Основы объяснены здесь .Есть несколько предостережений.

  • Моей первой попыткой было использование boost :: variable для описания моих токенов.Парсер требует, чтобы токены были преобразованы в bool.Чтобы решить эту проблему, я обернул свой boost :: Вариант в boost :: необязательный.Изменить: На самом деле, кажется, что это отладочная способность навязывает это требование.Мое текущее решение добавляет пользовательский обработчик отладки вместо стандартного, который больше не проверяет, является ли значение итератора "true".
  • Аналогично, должен быть определен оператор <<, по крайней мере, если вы хотите отладкуoutput. </li>
  • В методе parse () вам нужно проверить, не заканчивается ли ваш итератор, прежде чем разыменовывать его.
  • Если у вас много типов токенов, вам может потребоваться увеличитьразмер вектора MPL и список, как описано здесь .

1 Ответ

1 голос
/ 02 апреля 2012

Похоже, что ваш ответ отвечает на аналогичный, но другой вопрос:

  • Как создать класс синтаксического анализатора, который использует элементы, не являющиеся символами

ОднакоВаш первоначальный вопрос был примерно таким: «Как я могу использовать анализаторы спирта с токен-потоком, не являющимся символом»?

В этом случае наиболее полезной будет ссылка на Spirit Lex , который является LexerTL, интегрированным в платформу Boost Spirit.

Вы можете легко заставить Spirit Lex выставлять информацию токена(помимо идентификатора токена) при необходимости, хотя по умолчанию диапазон исходного итератора всегда доступен.Таким образом, вы можете смешивать и сочетать Spirit Lex и Spirit Qi весьма гибкими способами.

У меня нет времени на простой пример, но,

...