Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/picalines/stateviz
Приложение для визуализации и отладки конечного автомата
https://github.com/picalines/stateviz
custom-language electron-app gradle java lombok-gradle spring-boot state-machine sveltejs typescript vizualization
Last synced: 1 day ago
JSON representation
Приложение для визуализации и отладки конечного автомата
- Host: GitHub
- URL: https://github.com/picalines/stateviz
- Owner: Picalines
- Created: 2023-04-03T23:26:23.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-09-26T17:23:05.000Z (about 1 year ago)
- Last Synced: 2024-04-28T01:08:18.683Z (7 months ago)
- Topics: custom-language, electron-app, gradle, java, lombok-gradle, spring-boot, state-machine, sveltejs, typescript, vizualization
- Language: Java
- Homepage:
- Size: 429 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# stateviz
Приложение для визуализации и отладки конечного автомата.
Автомат задаётся программой на собственном языке statelang, по которой приложение строит дерево состояний. При отсутствии ошибок компиляции программу можно запустить, чтобы пошагово отследить изменение значений.
## Список технологий
* Компилятор языка написан на Java, коммуникация с фронтендом осуществляется с помощью Spring
* Фронтенд реализован на [Svelte](https://svelte.dev/)
* [Monaco Editor](https://microsoft.github.io/monaco-editor/) для редактора кода
* [vis.js](https://visjs.org/) для визуализации дерева автомата## Справка по языку statelang
Для примера рассмотрим программу, которая увеличивает счётчик, пока не достигнет заданного значения.
У такого автомата будет два состояния: `COUNTING` и `STOPPED`. Они определяются с помощью блока `state` на верхнем уровне программы:
```
state {
COUNTING, # первое состояние считается начальным
STOPPED
}
```Далее нам нужно объявить переменную счётчика и константу остановки:
```
let count := 0;
const stop := 10;
```Замечания:
* язык строго типизирован, но указывать типы вручную не нужно
* нет разграничения на int и float, все числа дробные
* оператор присваивания - `:=`, а сравнения - `=`Затем объявим действия автомата в состоянии `COUNTING`:
```
when COUNTING {
assert count < stop; # проверяем корректность состояния
count := count + 1; # увеличиваем счётчик
if count = stop {
state := STOPPED; # переходим в STOPPED, если достигнуто значение stop
}
}
```Замечания:
* `assert` завершит программу с ошибкой, если его условие не равно истине
* присваивание в `state` - переход в другое состояние
* программа выходит из блока при переходе по аналогии с `return` в обычных языках
* код после перехода будет помечен как недостижимый