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

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

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

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

1 ответ

Решение

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

Нет, это не официальный вопрос.

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

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

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

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

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


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

  1. Рассмотрим использование 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, эти семантические действия обычно представляют меньшую проблему, потому что, когда они возвращаются назад, при следующем выполнении (того же самого) семантического действия выполнение, локальное будет просто заменяться новым, правильным значением.

  2. Кроме того, некоторые задания действительно "быстрые и грязные" и не требуют использования 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
     );
    

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

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

Другие вопросы по тегам