Как можно использовать 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 и список, как описано здесь .