#状态机 #解释器 #语言 #定义 #条件 #SML #已定义

shakemyleg

一个简单的状态机定义语言和解释器

13 个稳定版本

2.5.0 2024年8月5日
2.4.1 2024年8月5日
2.2.2 2024年7月31日
1.0.2 2024年7月16日

220算法

Download history 283/week @ 2024-07-15 2/week @ 2024-07-22 931/week @ 2024-07-29 248/week @ 2024-08-05

1,464 每月下载量

MIT 许可证

57KB
1.5K SLoC

tests badge Written up - here!

SML - ShakeMyLeg,这是一个状态机语言吗?

一个简单的状态机定义语言和解释器。

状态机由状态组成 - 机器运行直到满足退出条件并移动到下一阶段。在 shakemyleg 中的状态机定义为每次机器运行时运行的表达式序列 - "头部"。与头部一起的是主体 - 一系列条件,当评估为 true 时,运行一系列表达式和一个 StateOp (changeto <state>stayend)。如果没有条件为真,则不采取任何操作。条件按顺序访问。注释从 # 开始。

一个简单的 shakemyleg 机器示例

# flip_flip.sml

state A:
    always:
        outputs.bar = inputs.bar + 1
        changeto B

state B:
    always:
        outputs.bar = inputs.bar + 1
        changeto A

(操作符和括号周围需要大量空格,因为编译器很傻。) 此机器在状态 A 和 B 之间交替,并将值 bar 从输入对象传播到输出,并递增它。

我们可以“编译”并运行它

use shakemyleg::compile;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Foo {
    bar: u8
}

let src = r#"
state A:
    always:
        outputs.bar = inputs.bar + 1
        changeto B
state B:
    always:
        outputs.bar = inputs.bar + 1
        changeto A
"#;

let mut machine = compile(src).unwrap();

let i = Foo { bar: 0 };
let o: Foo = machine.run(i).unwrap().unwrap();
// Two unwraps as the rv is Result<Option<Foo>>
// Result<...> checks if any errors occurred while running
// Option<...> checks if the machine is still running

// output.bar is incremented every time the machine is run
if o.bar != 1u8 {
    panic!();
}

依赖项

~3.5–5.5MB
~100K SLoC