FSM之SMC使用总结
原创
©著作权归作者所有:来自51CTO博客作者mapaware的原创作品,请联系作者获取转载授权,否则将追究法律责任
FSM之SMC使用总结
Part1: Smc.jar state machine compiler usage
Reference:
http://smc.sourceforge.net/
(Updated February 16, 2015)
Downloads:
http://sourceforge.net/projects/smc/files/
1) show help:
$ java -jar ./Smc.jar -help
2) generate java (c, cpp, js, python, object-c ...) classes from user_defined.sm file:
$ java -jar Smc.jar -c++ user_defined.sm
$ java -jar Smc.jar -graph -glevel 1 user_defined.sm
A
Filename.dot file also generated
(Filename should replaced by actural dot filename).
$ java -jar ./Smc.jar -java7 user_defined.sm
3) generate a workflow map
You need graphviz installed first, and add path to .../bin/dot.exe into system environments. in my pc, that is:
C:\DEVPACK\graphviz-2.38\release\bin
Now enter folder of Filename.dot generated in step 2), and type:
$ dot Filename.dot -Tpng -o Filename.png
Enjoy it!
Part2: Example
1) user_defined.sm. The only file we should created by hands
///
// ColorTable.sm
// -- ColorTable State Map for C++ classes auto-generation
//
// 1) generate c++ classes:
// $ java -jar Smc.jar -c++ ColorTable.sm
//
// 2) generate graphviz dot graph:
// $ java -jar Smc.jar -graph -glevel 1 ColorTable.sm
//
// see also:
// http://graphviz.org/
//
// Author: cheungmine
// Copyright 2015-?, All rights reserved.
//
///
%class ColorTable
%header ColorTable.h
%start ColorTableMap::Shuffle
%map ColorTableMap
%%
/**
* State {
* Transition [Guard Condition]
* EndState {
* Action(s)
* }
*
* Transition [context.getOwner().is_valid()]
* EndState {
* Action(s)
* }
* ...
* }
*/
Shuffle
Entry {
enterShuffle();
}
Exit {
leaveShuffle();
}
{
Next [ context.getOwner().shuffleDone() ]
Swappable {
//=>user swap actions
}
}
Swappable
Entry {
enterSwappable();
}
Exit {
leaveSwappable();
}
{
Next [context.getOwner().swapDone() && context.getOwner().canErase()]
Erasable {
}
Next [context.getOwner().swapDone()]
Shuffle {
}
}
Erasable
Entry {
enterErasable();
}
Exit {
leaveErasable();
}
{
Next [ context.getOwner().eraseDone() ]
Collapse {
}
}
Collapse
Entry {
enterCollapse();
}
Exit {
leaveCollapse();
}
{
Next [context.getOwner().collapseDone() && context.getOwner().canErase()]
Erasable {
}
Next [context.getOwner().collapseDone()]
Crash {
}
}
Crash
Entry {
enterCrash();
}
Exit {
leaveCrash();
}
{
Next [ context.getOwner().crashDone() && context.getOwner().canErase() ]
Erasable {
}
Next [ context.getOwner().crashDone() ]
Swappable {
//=>user swap actions
}
}
%%
2) generate all derived files(default is c++):
$ java -jar Smc.jar -graph -glevel 1 ColorTable.sm
3) generate flow map using graphviz:
$ dot ColorTable.dot -Tpng -o ColorTable.png
没图你说个毛! 下面上图:
Game Over!