C++状态机生成器

8

您是否知道有哪些适用于Linux的开源状态机C++代码生成器?理想情况下,该工具将输出所有状态机逻辑和存根,并接受UML或人类可读清单文件作为输入。


7
你看过Boost.MSM吗?它有一个旨在模仿UML的EDSL,并且具有出色的运行时性能。 - ildjarn
5
Lex和Yacc一定会生成状态机,而g++则不是。 - perreal
我建议使用SMC,但它不支持UML。 - tinman
@perreal:这也是我的第一反应。问题太过宽泛了。 - Sebastian Mach
我发现这篇关于主题的文章非常好:http://security.hsr.ch/mse/projects/2011_Code_Generator_for_UML_State_Machines.pdf - odinthenerd
6个回答

5

Ragel在IT技术领域有相当好的声誉。

(我没有具体的使用经验)。


在Ragel上+1——简单实现,良好的运行时性能。 - JimR

4

3
请看Thingml。它提供了一种类似于UML状态机的文本语法(不依赖于C语言)。例如:
import "../hardware/bricks/led.thingml"

thing Blink includes LedMsgs, TimerMsgs
{
    required port HW 
    {   
        sends led_toggle, timer_start
        receives timer_timeout
    }

    statechart BlinkImpl init Blinking 
    {    
        state Blinking 
        {    
            on entry HW!timer_start (1000)

            transition -> Blinking 
            event HW?timer_timeout 
            action HW!led_toggle () 
        }
    }
}

ThingML可以生成易于嵌入到C++程序中的C代码。它实际上可以生成完全操作的代码,而不仅仅是存根。当涉及到底层实现细节时,我们提供一种方式将ThingML代码与C代码混合使用。
请注意,我们还支持Java和JavaScript。

1
你可能会对我的STTCL框架感兴趣。它不是一个生成器,但可用的(基础)类非常好地映射到UML状态图定义。
http://makulik.github.com/sttcl/

0

请查看开源的QP/C++状态机框架和免费的QM建模工具(请参见http://www.state-machine.com)。QP/C++框架支持分层状态机(UML状态图),并允许您同时执行多个这样的状态机。QP/C++已被移植到Linux(请参见http://www.state-machine.com/linux)。

现在,关于代码生成器,免费的QM建模工具(请参见http://www.state-machine.com/qm)允许您绘制状态机图并为QP/C++框架生成C++代码。QM本身是跨平台的,可以在Linux、Windows和Mac OS X上运行。


0

我见过最接近你要求的可能是 StateProto. 但它输出的是C#代码。

你应该看看StateProto和QHSM。开源项目在这里:http://code.google.com/p/gqhsm/

StateProto是开源的,可以修改输出函数以输出c++代码。但它使用委托。

我建议你使用数据驱动设计。StateProto将输出XML状态机,有C#代码可用于从数据中加载XML并驱动状态机。

你可以在c++中找到很多QHSM实现,我不知道是否有可用的XML加载器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接