Тип грамматики не влияет на сложность определения синтаксиса языка, а вот возможность применять РБНФ существенно упрощает определение. Также упрощается определение синтаксиса, если есть возможность задать приоритет и ассоциативность операций.
Определение лексем с помощью RE немного проще, чем с помощью правил грамматики, но с другой стороны удобнее использовать единый синтаксис для описания всех частей языка. Более важной для описания языка является возможность выделять лексемы в зависимости от контекста.
В конечном итоге результат синтаксического анализа должен быть представлен в виде AST и наличие в инструменте встроенных средств для этого существенно упрощает разработку трансляторов. Но многие инструменты ограничиваются применением шаблона проектирования слушатель или выполнением действий при свёртке, что ограничивает их область применения загрузкой данных сложной структуры.
Название/ссылка | Популярность | Год выхода последней версии | Группа | Тип грамматики | Формат правил | Приоритеты и ассоциативность операций | Лексический анализ | Формат задания лексем | Подавтоматы/контекст в лексическом анализе | Создание и обработка AST/деревьев разбора | Поддерживаемые языки программирования | Пример |
BISON/YACC/ GPPG/fsyacc и др. | высокая | 2015 | генератор кода | LR(1)/GLR | вариант БНФ | есть | интеграция с FLEX/GPLEX/fslex | RE | есть | нет | 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 | |