Разработчик (и) | Адриан Терстон |
---|---|
Стабильная версия | 6.10 / 24 марта 2017 г.; 3 года назад (24 марта 2017 г.) |
Предварительный выпуск | 7.0.0.12 / 14 мая 2019 г.; 16 месяцев назад (2019-05-14) |
Репозиторий | |
Написано на | C ++ |
Операционная система | Unix-подобный, Windows |
Тип | Конечный автомат компилятор |
Лицензия | «Ragel 6 остается под GPL v2 [ сгенерированный код], на который распространяется действие MIT (или GPL v2) ».. Ragel 7: Лицензия MIT |
Веб-сайт | www.colm.net / open-source / ragel / |
Ragel - это конечный автомат компилятор и генератор парсера. Первоначально Ragel поддерживал вывод для исходного кода C, C ++ и Assembly, был расширен для поддержки нескольких других языков, включая Objective C, D, Go, Ruby и Java. Дополнительная языковая поддержка также находится в разработке. Он поддерживает создание таблиц или управляемых потоков управления конечных автоматов из регулярных выражений и / или диаграмм состояний, а также может создавать лексические анализаторы с помощью метода самого длинного совпадения. Ragel специально нацелен на синтаксический анализ текста и проверку ввода.
Ragel поддерживает создание таблиц или управляемых потоков управления, конечных автоматов из регулярных выражений и / или диаграммы состояний, а также может создавать лексические анализаторы с помощью метода самого длительного совпадения. Уникальной особенностью Ragel является то, что действия пользователя могут быть связаны с произвольными переходами конечного автомата с помощью операторов, интегрированных в регулярные выражения. Ragel также поддерживает визуализацию сгенерированной машины с помощью graphviz.
. График представляет собой конечный автомат, который принимает вводимые пользователем данные в виде серии байтов, представляющих символы ASCII и управляющие коды. 48..57 эквивалентно регулярному выражению [0-9] (т. Е. Любой цифре), поэтому можно распознать только последовательности, начинающиеся с цифры. Если встречается 10 (перевод строки), все готово. 46 - это десятичная точка ('.'), 43 и 45 - положительные и отрицательные знаки ('+', '-'), а 69/101 - это прописная / строчная буква 'e' (для обозначения числа в научном формате). Таким образом, он правильно распознает следующее:
2 45 055 46. 78.1 2e5 78.3e12 69.0e-3 3e + 3
, но не:
.3 -5 3.e2 2e5.1
Ввод Рагеля является регулярным выражением только в том смысле, что он описывает регулярный язык ; обычно он не записывается в кратком регулярном выражении, а разбивается на несколько частей, как в расширенной форме Бэкуса – Наура. Например, вместо поддержки классов символов POSIX в синтаксисе регулярных выражений Ragel реализует их как встроенные производственные правила. Как и в случае с обычными генераторами синтаксического анализатора, Ragel позволяет обрабатывать код для создания продукции с использованием синтаксиса. Код, приводящий к приведенному выше примеру с официального сайта:
action dgt {printf ("DGT:% c \ n", fc); } действие dec {printf ("DEC:. \ n"); } действие exp {printf ("EXP:% c \ n", fc); } действие exp_sign {printf ("SGN:% c \ n", fc); } action number {/ * NUMBER * /} # Литерал числа с плавающей запятой. число = ([0-9] + $ dgt ('.' @dec [0-9] + $ dgt)? ([eE] ([+ \ -] $ exp_sign)? [0-9] + $ exp) ?) %количество; основной: = (число '\ n') *;