С помощью генератора машин состояний
Guile-SMC сделал разбор формата Portable Network Graphics (PNG):
https://github.com/artyom-poptsov/guile-pngGuile-PNG позволяет читать изображения в формате PNG и разбирать их на части (чанки, "chunks"). Для некоторых чанков я уже написал разбор на осмысленные поля, остальные содержат в себе просто двоичные данные — которые тем не менее можно разобрать на что-то вменяемое, если посмотреть в
стандарт PNG.
Интересно было попробовать, насколько хорошо Guile-SMC подходит для решения подобных сложных задач с разбором двоичного формата. Пришлось дорабатывать Guile-SMC по ходу дела.
Из основных новшеств Guile-SMC:
- Добавил возможность задавать входные и выходные действия для каждого состояния.
- Добавил возможность задавать источники событий как для ДКА в целом, так и для каждого отдельного состояния.
На данный момент архитектура системы получилось достаточно гибкая. Можно разбить большой ДКА на несколько более простых, построенных иерархическим способом — подобyые ДКА называются по понятным причинам иерархическими (Hierarchical State Machines,
HSM). HSM позволяет разбить крупную задачу на несколько более мелких, таким образом, снизив сложность решения в целом, что очень важно для практического применения автоматного программирования.
Конечной целью Guile-SMC я вижу упрощение написания различных парсеров и в целом программ, придерживающихся автоматного стиля. При этом, смысл не только в кодогенерации на основе формального описания, но и формальная проверка получившихся ДКА, а также (возможно) оптимизация — но это уже более сложная задача. На данный момент Guile-SMC например способен проверять ДКА на тупиковые и недостижимые состояния.
В целом, очень интересная фундаментальная задача.
#projects #guile #fsm