hi,我发布了一款小软件,
该软件提供了一套描述状态机的语言,并能根据描述生成 状态机的源代码, 状态机图, 以及完备的状态跃迁路径的测试用例.
此外,还做了一些增强的检查,
1、一个状态机必须有且仅有一个开始状态。(在语法检查时候排除)
2、一个状态机至少要有一个结束状态。 在状态机的定义里面,这个终结符集合可以允许为空,但是为了不让程序陷入无休止的运行中,强制规定了必须要有一个结束。 (在语法检查时排除)
3、开始状态不能是结束状态。 (在语法检查时排除)
4、任意两个状态之间,只允许一条转移,而不允许多条转移。(语义检查时实现)
5、不存在孤立的状态,或者孤立的状态网络.(对状态图做了连通性检测) (语义检查是实现)
6、确保每一个状态的可到达性,避免死状态,(出度入度的限制+连通性+关节点的判定)由于时间比较紧,还没有来得及整理出文档和代码结构,待整理好代码后再行开源,以免贻笑大方。
至于文档方面,我相信这个软件提供的描述语言是足够简单的,不需要文档也应该能用。
如果需要文档,请等正式版发布。
下载
http://code.google.com/p/makefsm/downloads/list使用方法
http://code.google.com/p/makefsm/wiki/how_to_use

解决方案 »

  1.   

    语法文件MOORE FSM Door  "关于门的状态机生成 详细见 http://www.ibm.com/developerworks/cn/linux/l-fsmachine/index.html ";
    STATUS: opened DESC "打开状态", closed DESC "关闭状态" ,locked "锁定状态" ,unlocked "非锁定状态", end "自定义的结束状态";
    START=opened;
    END=end;//为了保证状态机可以退出,避免陷入死循环,增加了个自定义的结束状态,并规定,门在关闭后锁定了才允许离开。
    opened->closed[closeDoor DESC "关门"];
    closed->opened[openDoor DESC "开门"];
    closed->locked[lockDoor DESC "锁门"];
    locked->unlocked[unLockDoor DESC "不锁门"];
    unlocked->locked[lockDoor2 DESC "锁门"];
    unlocked->opened[openDoor2 DESC "解锁后开门"];
    locked->end[finish DESC "完结"];==================================================================
    语法说明:
    MOORE //moore型的状态机,两种状态机 ,一种是 moore型的,一种是mealy型的,目前只支持moore型的FSM  //状态机
    Door // 状态机名字
    "关于门的状态机生成 详细见 http://www.ibm.com/developerworks/cn/linux/l-fsmachine/index.html ";  //说明,你懂得STATUS: opened DESC "打开状态", closed DESC "关闭状态" ,locked "锁定状态" ,unlocked "非锁定状态", end "自定义的结束状态"; //定义状态,语法是  STATUS: 状态名字[DESC][描述],状态名字[DESC][描述]...; 正式文档会一个bnf规范的描述
    START=opened; //指定开始状态
    END=end;  //指定结束状态集//为了保证状态机可以退出,避免陷入死循环,增加了个自定义的结束状态,并规定,门在关闭后锁定了才允许离开。opened->closed[closeDoor DESC "关门"];  //定义一个事件,语法  跃迁前状态->跃迁后状态\[事件名字 [DESC] [时间描述]\]
      

  2.   

    为什么不能像 graphviz 一样直接把字符串用来当作 identifier 呢?比如:
    "开着" -> "关着" [ "关上" ];
      

  3.   

    good, 这是一个很好的建议 ,我会在下一版本加入这个特性的支持. 并再提供一个严格和宽松的编译选项.
      

  4.   

    MOORE FSM Door "blah blah"START="开着"
    END="离开""开着" -> "关着" [ "关上" ]
    "关着" -> "开着" [ "打开" ]
    "关着" -> "锁着" [ "锁上" ]
    "锁着" -> "关着" [ "开锁" ]
    "开着" -> "锁着" [ "关门锁上" ]
    "锁着" -> "开着" [ "一并打开" ]
    "锁着" -> "离开" [ "离开" ]
    稍微亮一点。
      

  5.   

    哈哈,这语法好,直接改造成 graphviz