Подтвердить что ты не робот

Boost Spirit: "Семантические действия - это зло"?

Чтение и просмотр этой презентации: http://boost-spirit.com/home/2011/06/12/ast-construction-with-the-universal-tree/
Я обнаружил это утверждение - в основном нам предлагается не использовать семантические действия.

Я должен признать, что я уже чувствовал что-то вроде этого: грамматики с семантическими действиями действительно выглядят кажущимися уродливыми. и, когда мне нужно было продлить/изменить их, это заняло много "микроменеджмента" именно с семантическими действиями. Подход с грамматикой атрибутов, продемонстрированный в презентации, кажется намного более элегантным и многообещающим.

Поэтому я хотел бы спросить: это "официальный" пункт? Должен ли я научиться работать с грамматикой атрибутов и более подробно избегать семантических действий? Если это так, я хотел бы спросить некоторые базовые (возможно, даже тривиальные) примеры, демонстрирующие такой подход - интерпретатор LISP слишком сложный для меня, чтобы пережевывать...

4b9b3361

Ответ 1

Я уверен, что Хартмут ответит через секунду. До тех пор это мой прием:

Нет, что не является официальной точкой.

Семантические действия имеют некоторые недостатки

  • Простейшим недостатком семантических действий является стилистическое понятие разделения проблем. Вы хотите выразить синтаксис в одном месте и семантику в другом. Это помогает ремонтопригодности (особенно в отношении длительных периодов компиляции для составления грамматик духа)

  • Более сложные последствия, если у них есть побочные эффекты (что часто бывает). Представьте себе обратное отслеживание из проанализированного node, когда семантическое действие имело побочный эффект: состояние парсера будет возвращено, но внешние эффекты не будут.

    В некотором смысле использование атрибутов походит на использование детерминированных, чистых функций в функциональной программе, легче рассуждать о правильности программы (или, в данном случае, машины грамматики), когда она состоит из чистого только функции.

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


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

  • Рассмотрим использование qi::locals<> и унаследованных атрибутов (код из Mini XML - ASTs! образец) - они включают в себя семантические действия:

    xml =
            start_tag                   [at_c<0>(_val) = _1]
        >>  *node                      
        >>  end_tag(at_c<0>(_val)) // passing the name from the 
                                   // ... start_tag as inherited attribute
    ;
    

    Или один с использованием qi:: locals:

    rule<char const*, locals<char> > rl;
    rl = alpha[_a = _1] >> char_(_a); // get two identical characters
    test_parser("aa", rl); // pass
    test_parser("ax", rl); // fail
    

    IMO, эти семантические действия обычно представляют собой проблему нередко, потому что, когда они возвращаются, в следующий раз, когда выполнение проходит (то же) семантическое действие, локальная будет просто перезаписана новым, правильным, значением.

  • Кроме того, некоторые задания действительно "быстро и грязно" и не требуют использования utree или ручного типа AST:

     qi::phrase_parse(first, last, // imagine qi::istream_iterator... 
         intesting_string_pattern  // we want to match certain patterns on the fly
                [ log_interesting_strings ], // and pass them to our logger
         noise_skipper             // but we skip all noise
     );
    

    Здесь семантическое действие является ядром функции парсеров. Он работает, потому что на уровне узлов с семантическими действиями не происходит обратного отслеживания.

  • Семантические действия являются зеркальным отображением семантических действий в Spirit Karma, где они обычно представляют меньше проблем, чем в Qi; поэтому даже если только для согласованности интерфейса /API, семантические действия являются "хорошей вещью" и повышают удобство использования Boost Spirit в целом.