LINUX.ORG.RU

boost::spirit, результат выражения.


0

2

Читаю главу в доках про возаращаемое грамматикой значение при парсинге через qi::parse().

Пишут, что если я парсю череду значений, типа

double_ >> "," >> char_ >> ".";

То возвращаемое значение должно быть tuple<A,B> - подобного типа, то есть std::pair<double,char> например. Или boost::fusion-аналог.

Я вот чё хочу понять - как оно там внутри, во время матчинга грамматики, возвращает результат? Оно смотрит на плоскую память, и ходит по ней указателем, шагая на разное количество байт, в зависимости от различных типов? То есть, например std::pair<double,char> - это что-то типа

struct S
{
   double first;
   char second;

   // в случае добавления ещё каких-то параметров:
   //int third;
   //float fourth;
};

Я предполагаю, что spirit берёт указатель на экземпляр S. Продвигаясь по грамматике, он записывает очередное заматченное значение, используя указатель нужного типа и шагает на sizeof(TYPE) дальше. Если кусок грамматики отвалился, он откатывается на точку, где начинается отвалившаяся ветка и продолжает пытаться матчить другую ветку.

Как-то так?

Вариантов как бы не так. Всё же придумали ещё при царе Горохе

http://ru.wikipedia.org/wiki/LL(1) например и далее.

Не любят люди изучать основы, ох не любят, сразу boost::spirit подавай.

anonymous
()
Ответ на: комментарий от kiverattes

Я об этом:

Я предполагаю, что spirit берёт указатель на экземпляр S. Продвигаясь по грамматике, он записывает очередное заматченное значение, используя указатель нужного типа и шагает на sizeof(TYPE) дальше. Если кусок грамматики отвалился, он откатывается на точку, где начинается отвалившаяся ветка и продолжает пытаться матчить другую ветку.

У человека хоть немного знакомого с основами, такие безграмотные вопросы просто не возникают.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.