https://github.com/cpslabgu/swift-fsmlib
Library for logic-labelled finite-state machines
https://github.com/cpslabgu/swift-fsmlib
finite-state-machine fsms llfsm model-driven-development
Last synced: 7 days ago
JSON representation
Library for logic-labelled finite-state machines
- Host: GitHub
- URL: https://github.com/cpslabgu/swift-fsmlib
- Owner: CPSLabGU
- Created: 2023-08-11T04:38:46.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2026-02-24T03:25:17.000Z (19 days ago)
- Last Synced: 2026-02-24T07:40:07.681Z (19 days ago)
- Topics: finite-state-machine, fsms, llfsm, model-driven-development
- Language: Swift
- Homepage: https://cpslabgu.github.io/swift-fsmlib/documentation/fsm/
- Size: 1.3 MB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# swift-fsmlib
A cross-platform Swift library for Logic-Labelled Finite-State Machines
(LLFSMs) and FSM conversion tools.
## Overview
`swift-fsmlib` provides robust, type-safe tools for defining, analysing,
serialising, and converting finite-state machines. It supports both
macOS and Linux and is designed for research and production use.
- **FSM**: Core framework for state machines, including states,
transitions, state activities, language bindings, and code generation.
- **fsmconvert**: Command-line tool for converting machines between
language formats and creating arrangements from multiple FSMs.
- **SCXML Support**: Full round-trip conversion between directory-based `.machine` and single-file `.scxml` formats.
## Features
- Type-safe state and transition definitions with UUID-based identifiers
- Logic-Labelled FSM model with Boolean transition expressions
- Suspend and resume support for interruptible state machines
- C and Objective-C++ language bindings with code generation
- Arrangements for composing multiple FSMs into coordinated systems
- CMake build system integration for generated code
- Layout and geometry types for graphical FSM editors
- Round-trip serialisation via `.machine`, `.arrangement`, and `.scxml` formats
- Multi-namespace SCXML compatible with ScxmlEditor, Qt Creator, and other tools
## Installation
Add `swift-fsmlib` as a dependency in your `Package.swift`:
```swift
dependencies: [
.package(url: "https://github.com/CPSLabGU/swift-fsmlib.git", from: "1.0.0")
]
```
Then add `FSM` as a target dependency:
```swift
.target(
name: "YourTarget",
dependencies: [
.product(name: "FSM", package: "swift-fsmlib")
]
)
```
## Quick Start
```swift
import FSM
// Define states
let red = State(name: "Red")
let green = State(name: "Green")
// Define transitions with Boolean expressions
let toGreen = Transition(label: "after_ms(5000)", source: red.id, target: green.id)
let toRed = Transition(label: "after_ms(5000)", source: green.id, target: red.id)
// Create a logic-labelled FSM
let fsm = LLFSM(states: [red, green], transitions: [toGreen, toRed])
print("States: \(fsm.stateNames)")
print("Initial state: \(fsm.initialState)")
```
## Using fsmconvert
Convert a machine to a different language format:
```bash
swift run fsmconvert MyMachine.machine -f c -o MyMachine_C.machine
```
Convert a machine to SCXML format:
```bash
swift run fsmconvert MyMachine.machine -f scxml -o MyMachine.scxml
```
Create an arrangement from multiple machines:
```bash
swift run fsmconvert Machine1.machine Machine2.machine -a -o System.arrangement
```
Run with verbose output:
```bash
swift run fsmconvert MyMachine.machine -v -o output.machine
```
## Examples
The `examples/` directory contains pre-built machines and arrangements:
- `Counter.machine` / `CounterC.machine` / `CounterCPP.machine`:
Basic counter FSMs in different language formats.
- `SuspendCounter.machine` / `SuspendCounterC.machine`:
Suspensible counter FSMs demonstrating suspend and resume.
- `SuspendCounter.arrangement` / `Counter.arrangement`:
Multi-machine arrangements.
See `examples/README.md` for detailed descriptions.
## Documentation
Generate DocC documentation locally:
```bash
swift package generate-documentation
```
Preview the documentation in a browser:
```bash
swift package --disable-sandbox preview-documentation --target FSM
```
The documentation includes:
- API reference for all public types and functions
- Conceptual articles on architecture, language bindings, and
arrangement design
- Hands-on tutorials for getting started, working with examples,
and using fsmconvert
## Licence
Copyright © 2015, 2016, 2023, 2025 Rene Hexel. All rights reserved.