All Projects → clnhlzmn → Makina

clnhlzmn / Makina

Licence: mit
A simple hierarchical state machine compiler that generates C.

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Makina

Oqaml
An OCaml based implementation of a Quil QVM
Stars: ✭ 31 (-66.67%)
Mutual labels:  state-machine
React Context Hook
A React.js global state manager with Hooks
Stars: ✭ 50 (-46.24%)
Mutual labels:  state-machine
Tulip Control
Temporal Logic Planning toolbox
Stars: ✭ 81 (-12.9%)
Mutual labels:  state-machine
Kfin State Machine
Kotlin Finite State Machine
Stars: ✭ 36 (-61.29%)
Mutual labels:  state-machine
Yii2 Lifecycle Behavior
Define the lifecycle of a model by defining allowed status changes.
Stars: ✭ 47 (-49.46%)
Mutual labels:  state-machine
River Admin
🚀 A shiny admin interface for django-river built with DRF, Vue & Vuetify
Stars: ✭ 55 (-40.86%)
Mutual labels:  state-machine
Workflow
A Swift and Kotlin library for making composable state machines, and UIs driven by those state machines.
Stars: ✭ 860 (+824.73%)
Mutual labels:  state-machine
Finity
A finite state machine library for Node.js and the browser with a friendly configuration DSL.
Stars: ✭ 88 (-5.38%)
Mutual labels:  state-machine
Trck
Query engine for TrailDB
Stars: ✭ 48 (-48.39%)
Mutual labels:  state-machine
Xstateful
A wrapper for xstate that stores state, handles transitions, emits events for state changes and actions/activities, and includes an optional reducer framework for updating state and invoking side-effects
Stars: ✭ 81 (-12.9%)
Mutual labels:  state-machine
Redstone
Redstone has a State Machine
Stars: ✭ 36 (-61.29%)
Mutual labels:  state-machine
Formatwith
String extensions for named parameterized string formatting.
Stars: ✭ 44 (-52.69%)
Mutual labels:  state-machine
Hal
🔴 A non-deterministic finite-state machine for Android & JVM that won't let you down
Stars: ✭ 63 (-32.26%)
Mutual labels:  state-machine
Mineflayer Statemachine
A state machine plugin for Mineflayer to aid in designing more complex behavior trees.
Stars: ✭ 32 (-65.59%)
Mutual labels:  state-machine
Statemachineone
State Machine library for PHP
Stars: ✭ 84 (-9.68%)
Mutual labels:  state-machine
Rust fsm macros
FSM in Rust's macros.
Stars: ✭ 20 (-78.49%)
Mutual labels:  state-machine
Aws Power Tuner Ui
AWS Lambda Power Tuner UI is an open source project creating a deployable easy to use website built on a layered technology stack allowing you to optimize your Lambda functions for cost and/or performance in a data-driven way via an easy to use UI.
Stars: ✭ 52 (-44.09%)
Mutual labels:  state-machine
React Automata
A state machine abstraction for React
Stars: ✭ 1,316 (+1315.05%)
Mutual labels:  state-machine
Jstate
Advanced state machines in Java.
Stars: ✭ 84 (-9.68%)
Mutual labels:  state-machine
State Machine
🤖 A state machine library for Kotlin, with extensions for Android.
Stars: ✭ 72 (-22.58%)
Mutual labels:  state-machine

Makina

Makina is a hierarchical state machine source-to-source translator. It takes state machine descriptions as input and produces C language implementations of those state machines.

Demo

Syntax

Each file given as input to the Makina compiler represents a single state machine. At the top of the file the name of the machine is specified with a machine statement:

Machines

machine Oven;

Here the machine is called Oven.

States

States are defined below that with state definitions:

machine Oven;
state closed {
    
}

Now the state machine Oven has one state called closed.

Of course state machines usually have more than one state. As many states as are required can be added to a single machine:

machine Oven;
state closed {
    
}
state open {
    
}

Now Oven has two states: closed and open.

Event Handlers

In addition to states, state machines also define events. Events are triggers that cause the state machine to take action. In order to assign an action to an event a state must include an event handler that could look like this:

machine Oven;
state closed {
    on open -> open;
}
state open {
    
}

The state closed now has an handler for the event named open. The handler causes the machine Oven to transition from closed to open. The full syntax for an event handler looks like this:

on <event-id> [(<guard>)] [<action>] [-> <target>];

The things in angle brackets can be arbitrary identifiers that conform to the C language concept of an identifier. Things in square brackets are optional. In the case above the handler includes an optional transition target, but not a guard or action.

Guards and actions can be used to create complex behavior. If a state includes a guarded handler then the user defined function that implements the guard must return a true value for the handler to be triggered. For example:

on foo (some_guard) guarded_action;
on foo default_action;

If a state has the previous two handlers defined and is processing the event foo first the user defined (C language) function some_guard will be called. If its return value is true then the function guarded_action will be called. If some_guard returned 0 then the machine will continue checking for handlers for event foo. The next defined handler is not guarded, so the function default_action will be called.

All actions and guards are implemented by the user as C language functions with the following prototype:

int <function-name>(struct <machine-name> *, struct <machine_name>_event *);

Hierarchical States

To avoid duplicating event handlers for similar states Makina allows you to define sub states that defer unhandled events to their parent states. The closed state of the oven machine might have a few sub states:

machine Oven;
initial state closed {
    on open -> open;
    initial state idle {
        on start -> cooking;
    }
    state cooking {
        entry enable_heater;
        on timeout -> idle;
        exit disable_heater; 
    }
}
state open {
    on close -> closed;
    on start error;
}

Now state closed has two sub states: idle and cooking. Additionally the states closed and closed.idle have been designated as initial. This isn't strictly necessary in this case, because default initial states are those appearing first in document order, but has been added to show the syntax. Initial states are the states that are first entered when the machine is initialized.

Since neither sub state of closed defines a handler for the open event if the Oven machine is in either of those states when an open event is processed the parent state's handler, and any associated actions or transitions, will be triggered. In this case the open event will cause a transition to the open state regardless of which sub state was active.

Entry and Exit Actions

Entry and exit actions are similar to event handlers except they are triggered when a state is entered or exited. For example: the entry handler entry enable_heater; in state closed.cooking causes the function enable_heater to be called when that state is entered. Similarly, exit disable_heater; causes disable_heater to be called when state closed.cooking is exited. Exit handlers will be triggered event if the event that causes the transition is defined in a parent state as is the case with the open event in the example above.

Invoking Makina

Get the jar

Clone the repo and build the makina-compiler project using Intellij. Or download the latest jar from here.

Run the compiler

java -jar <path>/<to>/makina-compiler.jar <input-file> [<input-file-2>]

Output

Two files, <machine-name>.h and <machine-name>.c will be created (or overwritten!) in the same directory as <input-file>.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].