|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||||||||||||
boost::spirit08.09.2011, 12:17. Показов 8193. Ответов 11
Метки нет (Все метки)
Пишу парсер на спирите. Задаюсь вопросом как нормально сделать примерно такое
А _1 имеет тип вектор чаров, который не приводится в string автоматически. Однако если сделать отдельное правило.
0
|
|||||||||||||||||||||
| 08.09.2011, 12:17 | |
|
Ответы с готовыми решениями:
11
Метапрограммирование в boost::proto (boost::spirit) Производительность boost::spirit::qi Boost::Spirit. Разбор конфигурационного файла |
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
| 09.09.2011, 14:20 [ТС] | |||||||||||
|
Появился еще вопрос...
Добавлено через 19 часов 28 минут Решено. Решил через bind и вектор в классе.
0
|
|||||||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 10.09.2011, 09:28 [ТС] | ||||||
Сообщение было отмечено как решение
Решение
niXman,
2
|
||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
| 14.09.2011, 00:12 | |||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
ForEveR, по поводу первого вопроса: на самом деле, новое правило — выход идеологически правильный, но если хочется конкретно в рамках одного правила поменять атрибут парсера и не хочется новое правило строить, то есть директива парсинга as<T>, которая преобразовывает атрибут подконтрольного парсера в тип T, для неё также существует два синонима, специально для типов std::string и std::wstring, называются as_string и as_wstring. C их использованием правило
![]()
). Короче, в этом правиле можно вообще избавиться от семантических действий и выглядеть оно будет так:
Кое-где также видно использование такой альтернативы в правилах: string(""). Если требуется распознать пустую строку (эпсилон-цепочку), то для этого есть специальный парсер qi::eps, который не имеет атрибута и возвращает результат считывания строки нулевой длины (то есть попросту никаких входных данных не поглощает), в таком случае атрибут левой части будет сконструирован значением по-умолчанию, то есть в данном случае пустой строкой. И ещё один очень важный момент, благодаря которому Ваш код, скорее всего, можно будет либо почти полностью, либо полностью переписать без семантических правил вообще. Есть такая штука в спирите как автоматическое распространение атрибутов (automatic attribute propagation), суть его в том, что сложные парсеры в правых частях правил могут быть иногда (если атрибут левой части и правой части совместимы между собой) сконвертированы автоматически в атрибут левой части, так что никаких семантических правил писать вообще не нужно. Но если добавить в правило хотя бы одно семантическое действие, например, здесь:
от "string("create") > name" атрибут будет чем-то вроде fusion::vector<std::string, std::string>, по сути и не важно, чем конкретно, потом при соединении с std::vector<std::string>, который атрибут от names_and_types, он будет вектором (опять же, реальные типы здесь и не важны, по сути), у которого в начале будет два std::string, которые являются элементами того fusion::vector'а, а далее пойдут элементы от names_and_types. Важно здесь что: контейнер из правой части правила совместим (в любом случае, хоть это будет std::vector<std::string> или что-то другое на самом деле) с контейнером-атрибутом от левой части, так что просто прозрачно присваивается контейнер из правой части контейнеру из левой части. Так что писать собственноручно функции типа push_tokens, а потом с помощью bind "добавлять" эти векторы в конец атрибута _val ни к чему, до тех пор, пока вы используете stl контейнеры в качестве атрибутов правил, они могут заполняться автоматически, вот такая есть полезная возможность. Иначе говоря, во всех правилах, где Вы синтезируете атрибут типа вектора строк, а каждый из парсеров имеет атрибут строки или вектора строк, то push_back'и писать не стоит, ибо всё сконвертируется автоматически и без семантических правил вообще. Ну и напоследок: наличие семантических действий очень сильно бьёт по compile-time performance'у (а если каждое из них будет более, чем односложной phoenix-лямбдой, то вообще можно вешаться), так что очень стоит стремиться избавиться от них там, где это только возможно, спасают только предкомпилированные заголовки, да и то лишь частично И вместо обычных функций вкупе с phoenix::bind рекомендуется использовать вариант с phoenix::funcion, состоит он в том, чтобы писать ленивый функтор, а потом из него создавать объект phoenix::function, который уже будет передаваться в семантическое действие. Например, как обычно дают реализацию того же push_back в ленивом варианте с помощью phoenix:
6
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 14.09.2011, 10:56 [ТС] | ||||||
|
Ma3a, С as_string вышел небольшой косяк. А именно версия буста на работе 1.42. Еще нет as_string, as<T> в той версии, Пришлось извращаться)
Добавлено через 25 минут Ну и в плюс к тому. У вас скомпилируется?
Все понятно. Из-за старой версии буста. Этот вариант работает на онлайн-компилере. http://liveworkspace.org/code/... 081d9a840c Так что мне пока такой вариант не пойдет. Но запомню. Спасибо!
1
|
||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|
| 15.09.2011, 16:23 | |
|
ForEveR, вот ещё один момент заметил: у Вас сигнатура грамматики и главного нетерминала root содержит объявление локальной переменной qi::locals<std::string> в посте N5, это просто неокончательный вариант и Вы потом код с использованием этой переменной написали, или просто как-то так получилось?
В случае, если код всё-таки законченный, то его можно просто вырезать, так как фениксовая локальная переменная _a нигде не используется.Добавлено через 29 секунд код из поста N8 работает
2
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||
| 22.05.2012, 16:13 [ТС] | ||||||||||||||||
|
Вопрос все о том же, потому подниму тему из небытия.
Сделал так.
Добавлено через 1 час 27 минут Временно сделал так, но мне очень очень не нравится этот вариант.
0
|
||||||||||||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
||||||
| 26.05.2012, 17:41 | ||||||
|
ForEveR, а можно более полный пример? А то следующий пример с потоком в классе у меня отрабатывает без проблем в MSVC и gcc:
1
|
||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 27.05.2012, 12:53 [ТС] | |
|
Ma3a, Такой пример отработает судя по всему, у меня в примере не было #define для использования 3 феникса. Что ж. Будем знать. Спасибо!
1
|
|
| 27.05.2012, 12:53 | |
|
Помогаю со студенческими работами здесь
12
Boost начало работы: Undefined reference to `boost::system::generic_category() ' Boost Log - undefined reference to `boost::system::system_category()' Использование boost и boost.build с несколькими компиляторами Spirit::qi - семантическое действие
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|