Подразделы

Другие разделы

Дата и время

25/04/2024 15:13:07

Авторизация

Имя:
Пароль:
Зарегистрироваться
Восстановить пароль
 

printРазработка компиляторов и интерпретаторов

printСравнение инструментов для разработки трансляторов

Инструменты для разработки трансляторов можно разделить на три группы:
  • генераторы кода, которые создают наиболее эффективный код и позволяют указать действия по созданию AST в самом правиле (в некоторых случаях эти добавления могут ухудшать читабельность);
  • библиотеки классов или шаблонов, в которых правила грамматики задаются с помощью перегрузки операций или композиции вызовов, в результате чего правила грамматики имеют необычный вид, а также перед началом разбора затрачивается время на построение вспомогательных таблиц;
  • генераторы времени исполнения, в которых грамматика задается в форме строки, что дает возможность загружать синтаксис языка из файла, но сложнее сделать привязку действий к правилам.
Тип грамматики не влияет на сложность определения синтаксиса языка, а вот возможность применять РБНФ существенно упрощает определение. Также упрощается определение синтаксиса, если есть возможность задать приоритет и ассоциативность операций.
Определение лексем с помощью RE немного проще, чем с помощью правил грамматики, но с другой стороны удобнее использовать единый синтаксис для описания всех частей языка. Более важной для описания языка является возможность выделять лексемы в зависимости от контекста.
В конечном итоге результат синтаксического анализа должен быть представлен в виде AST и наличие в инструменте встроенных средств для этого существенно упрощает разработку трансляторов. Но многие инструменты ограничиваются применением шаблона проектирования слушатель или выполнением действий при свёртке, что ограничивает их область применения загрузкой данных сложной структуры.
Название/ссылкаПопулярностьГод выхода последней версииГруппаТип грамматикиФормат правилПриоритеты и ассоциативность операцийЛексический анализФормат задания лексемПодавтоматы/контекст в лексическом анализеСоздание и обработка AST/деревьев разбораПоддерживаемые языки программированияПример
BISON/YACC/ GPPG/fsyacc и др.высокая2015генератор кодаLR(1)/GLRвариант БНФестьинтеграция с FLEX/GPLEX/fslexREестьнетC, C++, Java, C#, F# и др.Пример
ANTLRвысокая2017генератор кодаLL(*)вариант РБНФ (с обозначениями из RE)естьвстроенныйна базе правил грамматикиестьвстроенная, слушатель или посетительC#, Java, Python, JavaScript, C++ и др.Пример
COCO/Rумеренная2018генератор кодаLL(*)вариант РБНФ (атрибуты и действия указываются в правилах, что затрудняет их чтение)нетвстроенныйна базе правил грамматики и специальные описания для некоторых видов лексемнетнетC#, C++, Java, F#, VB и др.
JavaCCвысокая2017генератор кодаLL(k)вариант РБНФ (указание типов и атрибутов в правилах затрудняет их чтение) нетвстроенныйсвой вариант REнетвстроенная, слушатель или посетительJava, C++, JavaScript
Ironyнизкая2017библиотека классовLR(1)БНФ (необходимо добавлять вспомогательные нетерминальные символы для формирования AST)естьтолько стандартные лексемынетнетвстроеннаяC#Пример
Boost::Spiritумеренная2017библиотека классовLL(*)вариант РБНФнетвстроенныйна базе правил грамматикинетнетC++
parglareнизкая2017генератор времени исполненияLR(1)/GLRвариант РБНФ (с обозначениями из RE)естьвстроенныйREнеттолько дерево разбораPython
Сравнение

loading