Каковы недостатки платформы парсера-генератора Духа из boost.org?

Простую альтернативу этой проблеме можно решить, предоставив соответствующие разрешения в самой базе данных. Например: если вы используете базу данных mysql, введите в базу данных через терминал или предоставленный интерфейс и просто следуйте этой команде:

 GRANT SELECT, INSERT, DELETE ON database TO username@'localhost' IDENTIFIED BY 'password';

Это ограничит пользователя ограничиться только указанным запросом только. Удалите разрешение удаления, и поэтому данные никогда не будут удалены из запроса, запущенного с php-страницы. Второе, что нужно сделать, это очистить привилегии, чтобы mysql обновлял разрешения и обновления.

FLUSH PRIVILEGES; 

Дополнительная информация о flush .

To см. текущие привилегии для пользователя, вызывают следующий запрос.

select * from mysql.user where User='username';

Подробнее о GRANT .

42
задан TemplateRex 31 December 2015 в 20:23
поделиться

5 ответов

Это - довольно классная идея, и мне понравился он; было особенно полезно действительно изучить, как использовать шаблоны C++.

, Но их документация рекомендует использование духа для маленького к синтаксическим анализаторам среднего размера. Синтаксический анализатор для полного языка взял бы возрасты для компиляции. Я перечислю три причины.

  • парсинг Scannerless. В то время как это вполне более просто, когда отслеживание в обратном порядке требуется, это может замедлить синтаксический анализатор. Это является дополнительным, хотя - лексический анализатор мог бы быть интегрирован, посмотрите препроцессор C, созданный с Духом. Грамматика ~300 строк (и включая.h и включая .cpp файлы) компиляции (неоптимизированные) в файл 6M с GCC. Встраивание и максимальная оптимизация снижает это к ~1,7M.

  • Медленный парсинг - нет никакой статической проверки грамматики, ни чтобы подсказать о чрезмерном предвидении, требуемом, ни проверить основные ошибки, такой что касается использования экземпляра левой рекурсии (который приводит к бесконечной рекурсии в LL-грамматиках синтаксических анализаторов с рекурсивным спуском). Левая рекурсия не является действительно трудной ошибкой для разыскивания, тем не менее, но чрезмерное предвидение могло бы вызвать экспоненциальные времена парсинга.

  • использование шаблона Heavy - в то время как это имеет определенные преимущества, это влияет на время компиляции и размер кода. Кроме того, определение грамматики должно обычно быть видимо всем другим пользователям, влияя еще на большее количество времени компиляции. Я был в состоянии переместить грамматики в .cpp файлы путем добавления явных шаблонных инстанцирований с правильными параметрами, но это не было легко.

ОБНОВЛЕНИЕ: мой ответ ограничен моим опытом с классиком Духа, не Духом V2. Я все еще ожидал бы, что Дух будет в большой степени основан на шаблоне, но теперь я просто предполагаю.

37
ответ дан Blaisorblade 26 November 2019 в 23:33
поделиться

Вот то, что мне не нравится приблизительно он:

  • документация ограничена. Существует одна большая веб-страница, где "все" объяснено, но текущее отсутствие объяснений в деталях.

  • плохое поколение AST. ASTs плохо объяснены и, даже после удара Вашей головы против стены, чтобы понять, как модификаторы AST работают, трудно получить легкое для управления AST (т.е. тот, который отображается хорошо на проблемную область)

  • , Это увеличивает время компиляции чрезвычайно, даже для "носителя" - измеренные грамматики

  • , Синтаксис слишком тяжел. Это - факт жизни, что в C/C++ необходимо копировать код (т.е. между объявлением и определением). Однако кажется что в повышении:: дух, когда Вы объявляете grammar<>, необходимо повторить некоторые вещи 3 раза :D (когда Вы хотите ASTs, который является тем, что я хочу :D)

Кроме этого, я думаю, что они сделали довольно хорошее задание с синтаксическим анализатором, учитывая ограничения C++. Но я думаю, что они должны улучшить его больше. Страница истории описывает, что был "динамический" дух перед текущим "статическим" духом; я задаюсь вопросом, насколько быстрее и сколько лучшего синтаксиса это имело.

14
ответ дан user51568 26 November 2019 в 23:33
поделиться

Я сказал бы, что самой большой проблемой является отсутствие любого диагноза или другой справки для проблем грамматики. Если Ваша грамматика неоднозначна, синтаксический анализатор не мог бы проанализировать то, к чему Вы ожидаете это, и нет никакого хорошего способа заметить это.

3
ответ дан Chris Dodd 26 November 2019 в 23:33
поделиться

В ускорении 1.41 выходит новая версия Spirit, и она превосходит дух. :: classic:

После долгое время в бете (более 2 лет с Spirit 2.0), Spirit 2.1 наконец будет выпущен с предстоящий выпуск Boost 1.41. Код сейчас очень стабилен и готов к производственный код. Мы прилагаем все усилия, по оформлению документации в срок для Boost 1.41. Вы можете взглянуть на текущее состояние документации here. Currently, you can find the code and documentation in the Boost SVN trunk. If you have a new project involving Spirit, we highly recommend starting with Spirit 2.1 now. Allow me to quote OvermindDL's post from the Spirit mailing list:

I may start to sound like a bot with how often I say this, but Spirit.Classic is ancient, you should switch to Spirit2.1, it can do everything you did above a GREAT deal easier, a lot less code, and it executes faster. For example, Spirit2.1 can build your entire AST inline, no weird overriding, no need to build things up afterwards, etc..., all as one nice and fast step. You really need to update. See the other posts from the past day for links to docs and such for Spirit2.1. Spirit2.1 is currently in Boost Trunk, but will be formally released with Boost 1.41, но в остальном является полным.

24
ответ дан 26 November 2019 в 23:33
поделиться

Для меня самой большой проблемой является то, что выражения в Spirit, как их видит компилятор или отладчик, довольно длинные (я скопировал ниже часть одного выражения в Spirit Classic). Эти выражения пугают меня. Когда я работаю над программой, использующей Spirit, я боюсь использовать valgrind или печатать бэктрейс в gdb.

boost::spirit::classic::parser_result, boost::spirit::classic::ref_actor >, boost::spirit::classic::clear_action> >, boost::spirit::classic::ref_actor >, boost::spirit::classic::clear_action> >, boost::spirit::classic::sequence, boost::spirit::classic::chlit >, boost: :spirit::classic::positive >, boost::spirit::classic::chlit > > > > >, boost::spirit::classic::chlit: ref_value_actor >, boost::spirit::classic::push_back_action> >, boost::spirit::classic::action, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy> >, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit:: classic::ref_const_ref_actor >, std::string, boost::spirit::classic::push_back_action> > >, boost::spirit::classic::contiguous, boost:: :spirit::classic::action, boost::spirit::classic::ref_value_actor >, boost::spirit::classic::push_back_action> > > > > >, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::chlit >, boost::spirit::classic::positive >, boost::spirit::classic::chlit > > > > >, boost::spirit::classic::ref_value_actor >, boost::spirit::classic::push_back_action> > >, boost::spirit::classic::action, boost::spirit::classic::match_policy, boost::spirit::classic:: action_policy> >, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::ref_const_ref_actor >, std::string, boost::spirit::classic::push_back_action> > >, boost:: spirit::classic::contiguous, boost::spirit::classic::action, boost::spirit::classic::ref_value_actor >, boost::spirit::classic::push_back_action> > > > > > > > > > > >, void ()(char const, char const*)>, boost::spirit::classic::scanner, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy> > >::type boost::spirit::classic::action

19
ответ дан 26 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: