2012-03-15 78 views
7

你知道任何开源状态机c + +代码生成器(这将在Linux上工作)?理想情况下,该工具将输出所有状态机逻辑和存根。它也会接受UML或人类可读清单文件作为输入。C++状态机生成器

+7

你看着[Boost.MSM](http://www.boost.org/libs/ MSM /)?它有一个EDSL意味着模仿UML并具有极好的运行时性能。 – ildjarn 2012-03-15 22:25:51

+5

lex和yacc肯定会生成状态机,而g ++ :) – perreal 2012-03-15 22:26:36

+0

我会建议[SMC](http://smc.sourceforge.net/),但它不支持UML。 – tinman 2012-03-15 22:43:39

回答

4

Ragel有很好的声誉。

(我没有具体的经验)。

+0

+1相当不错 - KISS实现具有良好的运行时性能。 – JimR 2012-03-16 03:05:38

0

我见过的最接近的东西可能适合你,是StateProto。但它输出C#代码。

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

StateProto是开源的,输出函数可以修改为输出C++代码给你。但它使用代表。

我会建议您改用数据驱动设计。 StateProto将输出XML状态机,并且有C#代码来加载XML并从数据驱动状态机。

你可以在C++中找到大量的QHSM实现。我不知道是否有XML加载器可用。

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

看看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