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