Boost Spirit: «Семантические действия - это зло»? - PullRequest
21 голосов
/ 24 ноября 2011

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

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

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

1 Ответ

28 голосов
/ 24 ноября 2011

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

Нет , который не является официальным пунктом.

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

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

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

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

...