LINUX.ORG.RU

[Qt::QString,boost::spirit::qi,утро понедельника] Корректность совместного использования


0

2

Для разбора конфигурационной строки в Qt-шной программе используется парсер Spirit::Qi. Используется таким образом:

QString value = ... ;// Строка, которую надо разобрать
std::string::const_iterator walker = value.toStdString().begin();// Итератор_1
std::string::const_iterator end = value.toStdString().end();// Итератор_2
parse_data(walker,end,...);// Функция разбора строки

Вопрос в том, насколько корректным будет использование Итератор_1 и Итератор_2. QString::toStdString() каждый раз возвращает временный объект std::string, а я от него беру итератор, и использую в дальнейшем. Оно-то, вроде, работает, но будет ли работать всегда?

Ответ на: комментарий от najar

> зачем использовать Qt

Рисовать гуй.

зачем использовать boost

Много полезных безгуёвых библиотек. В частности, Spirit.

one_more_hokum ★★★
() автор топика

У меня такое ощущение, что так делать не стоит, лучше создать свой временный объект std::string, распарсить его, а потом вернуть результат в QString.

И ощущение у меня возникло по этому: http://doc.qt.nokia.com/latest/qstring.html#toStdString

Метод возвращает std::string по значению, а значит в твоём коде ты фактически используешь два итератора от разных объектов, к это сработало я хз.

PS Хотя могу и ошибаться, у меня же тоже утро понедельника =)

DELIRIUM ☆☆☆☆☆
()

мы свой проект начали с намерением делать внутри буст, гуй на кьют. потом оказалось что в кьют удобный XML, потом сокеты. теперь вот думаем что структуры данных удобно хранить в QAbstractItemModel

VladimirMalyk ★★★★★
()
Ответ на: комментарий от one_more_hokum

> Вот и меня это настораживает. Буду, наверное, делать из QString std::string.

Вот-вот, по факту в итоге у тебя используется два указателя на абсолютно разные области памяти, и что получится в итоге невозможно предсказать =)

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от nikitos

> А чиста на Qt никак?

Да можно, в принципе. Но меня невероятно раздражает Qt-шная реализация механизма сигнал-слот, точнее, её отсутствующая типобезопасность в compile-time. Ну и ещё по мелочи всякое. Вот и получается винегрет Qt + std + boost.

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

перфоманс еще не тестили, но на сейчас то что есть работает сносно. специфика задачи в том, что мы не парсим большие XML, но часто парсим небольшие порции - на нем у нас межкомпонентное взаимодействие.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от Begemoth

Был у Qt какой-то свой генератор парсеров. Вроде парсер для QtScript использует этот генератор.

А boost::spirit при чуть более сложной грамматике начинает оочень дооолго компиляться, и при этом выжирать гигабайты памяти. Т.е. годится только для микропарсеров.

kamre ★★★
()
Ответ на: комментарий от kamre

> boost::spirit при чуть более сложной грамматике начинает оочень дооолго компиляться

Зато быстро исполняться. Да и за время конпеляции можно чаю попить, или литературу почитать. :-)

годится только для микропарсеров

Где-то читал, что на новом spirit-е вполне успешно распарсили грамматику самих плюсов.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от kamre

генератор парсеров

Посмотрел я на ЭТО... Ну, встроили они bison / yacc в свой фреймворк. Всё равно для его запуска будет недостаточно плюсового конпелятора. А все части spirit-а сделаны на плюсах, и не требуют внешних приблуд.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> Всё равно для его запуска будет недостаточно плюсового конпелятора. А все части spirit-а сделаны на плюсах, и не требуют внешних приблуд.

Что-то я не понял какие приблуды ты имеешь ввиду, неужели Qt?

rival ★★
()
Ответ на: комментарий от rival

> какие приблуды ты имеешь ввиду

Непришейсобакехвост-приблуда под названием moc (Meta-Object Compilator). Без неё Qt не существует.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

Непришейсобакехвост-приблуда под названием moc (Meta-Object Compilator).

moc_facepalm.cpp

Без неё Qt не существует.

Qt, пожалуй, таки не существуют, а вот программы использующие Qt вполне могут и существовать.

/tmp/qlalr $ grep -r Q_OBJECT src/ | wc -l
0
/tmp/qlalr $ grep -r QObject src/ | wc -l
0
Ох, внезапно, оказывается qlarl как раз является такой программой.

rival ★★
()
Ответ на: комментарий от rival

> moc_facepalm.cpp

Вроде того...

а вот программы использующие Qt вполне могут и существовать

И не получать всей функциональности Qt, которая, несмотря на корявость решения, всё же есть. Зачем писАть «на Qt», не используя Qt?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> И не получать всей функциональности Qt, которая, несмотря на корявость решения, всё же есть. Зачем писАть «на Qt», не используя Qt?

Понятия не имею зачем тебе писАть на Qt. Другие люди вполне себе могут использовать Qt и без QObject'ов. Вот, только что прочитал e-mail одного такого человека:
http://lists.qt.nokia.com/pipermail/qt5-feedback/2011-September/001102.html

QLARL, кстати, генерирует не-Qt код.

rival ★★
()
Ответ на: комментарий от rival

> зачем тебе писАть на Qt

Зачем было вводить функционал, если после сознательно отказываться от его использования?

использовать Qt и без QObject'ов

Это уже слегка не Qt получается. Всё равно, что «использовать C++ без шаблонов».

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> отсутствующая типобезопасность в compile-time

Это сильно критично для вашего parse_data(...)? Ну и конвертирование в std::string с его итераторами? /me никак не поймёт где могут встретиться сигналы со слотами в реализации парсера.

nikitos ★★★
()
Ответ на: комментарий от Begemoth

> Претензия-то к Qt в целом.

Разве? Я нашел претензии только к сигналам-слотам и moc'у, причем последний не нужен, если не пользоваться первыми.

rival ★★
()
Ответ на: комментарий от rival

Сигналы-слоты - один из центральных механизмов Qt, если их отбросиить, то из полезного остаётся QtXml и QtXmlPatterns (если не рассматривать саму полезность Xml), остальное - велосипеды.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

> Сигналы-слоты - один из центральных механизмов Qt, если их отбросиить, то из полезного остаётся QtXml и QtXmlPatterns (если не рассматривать саму полезность Xml), остальное - велосипеды.

Но ведь он все равно использует Qt, почему бы не воспользоваться велосипедами в таком случае?

rival ★★
()
Ответ на: комментарий от one_more_hokum

>> boost::spirit при чуть более сложной грамматике начинает оочень дооолго компиляться

Зато быстро исполняться. Да и за время конпеляции можно чаю попить, или литературу почитать. :-)

Вот такой он C++. А уж какие оно ошибки любит при этом вываливать просто жуть.

Переписывал потом свою грамматику на Java+ANTLR в Eclipse, там вообще все мгновенно почти происходит - перегенерация java исходников из грамматики и их компиляция прям по сохранению файла грамматики. И сообщения об ошибках в грамматике/коде тоже вменяемые. На порядок удобнее получается по сравнению со spirit.

kamre ★★★
()
Ответ на: комментарий от Begemoth

У ТС проблемы с совместным использованием, в пределах продемонстрированного контекста, я лишь предложил вариант решения проблемы уйдя от совместного использования (оставив Qt).

Да, Qt там чота умеет ещё с регулярными выражениями, насколько велосипедно - хз, не эксперт.

nikitos ★★★
()
Ответ на: комментарий от nikitos

Просто альтернатива - либо использование ещё одного стороннего кодогенератора (QLALR не поставляется с qt), не документированного (я не увидел нормальной документации в их репозитории) к тому же. Регулярные выражения скорее всего не адекватны задаче, раз уж был взят spirit. Так что qt всё равно придётся с чем-то скрещивать.

Begemoth ★★★★★
()
Ответ на: комментарий от kamre

> Вот такой он C++. А уж какие оно ошибки любит при этом вываливать просто жуть.

Ну, C++ такой C++. Ошибки, конечно, на первый взгляд кажутся нечитаемыми, но позже довольно быстро разбираешься, где что не так.

Java+ANTLR

В Spirit, опять же, есть не только генератор парсеров, но и генератор генераторов, и лексический анализатор.

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