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

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

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

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


person Kostya    schedule 24.11.2011    source источник
comment
Лучше всего спрашивать в списке Духовных Генералов ...   -  person sehe    schedule 24.11.2011
comment
Какой интерпретатор LISP? есть ли где-нибудь интерпретатор LISP, написанный на Spirit?   -  person alfC    schedule 25.07.2016
comment
А, я вижу, на связанных слайдах: github.com/boostcon/ 2011_presentations / raw / master / fri /   -  person alfC    schedule 25.07.2016


Ответы (1)


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

Нет, это не официальная точка зрения.

У семантических действий есть недостатки

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

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

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

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


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

  1. Рассмотрите возможность использования qi::locals<> и унаследованных атрибутов (код из _ 2_ sample) - они включают семантические действия:

    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
    

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

  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 в целом.

person sehe    schedule 24.11.2011
comment
Что вы можете сказать о семантических действиях в последней версии библиотеки (X3)? Будут ли они там присутствовать? - person Tomilov Anatoliy; 02.11.2013
comment
@Dukales Конечно, будут. У семантических действий могут быть свои недостатки, но их отсутствие наносит гораздо больший вред. Хотя у меня нет большого опыта работы с X3 - person sehe; 02.11.2013