|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||||||||||||
boost::spirit08.09.2011, 12:17. Показов 8148. Ответов 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 - семантическое действие
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|