State Machine Compiler -> SMC
支持java语言,会生成一个.sm脚本和一些拥有状态的主体类。
%class 状态机所作用的类,实体对象,用于实现状态机中具体行为名字的类。
%fsmclass 要生成的状态机类的名字。
%fsmfile 要生成状态机类所在的源文件名。
%start HelloWordMap::aa 指定初始状态。
%map HelloWordMap 状态迁移图的名称。
%% %%各个状态及迁移关系括起来进行标识
在Entry{里面写进入此状态的行为}
在Exit{里面写退出此状态的行为}
简单迁移:
当前状态,目标状态,触发方法
SLEEP
Entry{changeState();}
{
cancle()
START
{
enclose();//转换到此状态前会被执行
}
cancle1()
WELCOME
{
enclose1();
}
cancle2()
nil//不会触发状态转换,将当前状态设置为最终状态
{
enclose1();
}
Default//默认
nil//不会触发状态转换,将当前状态设置为最终状态
{
enclose2();
}
}
目录:
1.创建一个SchMatchState.sm文件,在SchMatchState.sm文件里面写状态
%{
%}
%class SchMatchState
%package com.example.myapplication
%start SchMatchStateMap::WAKE_UP
%map SchMatchStateMap
%%
WAKE_UP
{
play
PLAY{}
hungry
EAT{}
}
PLAY
Entry{changeState();}
{
hungry
EAT{}
sleep
SLEEP{}
}
EAT
Entry{changeState();}
{
sleep
SLEEP{}
play
PLAY{}
}
SLEEP
Entry{changeState();}
{
wakeUp()
WAKE_UP{}
}
%%
2.下载smc.jar到文件夹里面
3.打开Smc.jar所属文件夹输入命令行
java -jar Smc.jar -java -nocatch SchMatchState.sm
(因为我的Smc.jar和SchMatchState.sm在统一目录下,所以路径直接就是文件名,不一样的话需要适当更改)
回车之后,会生成SchMatchStateContext.java文件
(我当时生成的文件会出现很多错误,为解决错误,引入一个文件夹statemap)
statemap代码地址:Java Source Code: statemap.FSMContext
(我发现了一个问题,当我使用push、pop方法的时候,会出现错误,无法执行,我就又重新找了一个FSMContext文件)
4.创建SchMatchState.java文件,在里面写主代码,逻辑
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class SchMatchState extends AppCompatActivity {
private com.example.myapplication.SchMatchStateContext fsm;
private int preState;
private String spreState;
private int curState=-1;
private String TAG = "SchMatchState";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new SchMatchState().start();
}
private void start() {
System.out.println("状态机开始: ");
this.fsm = new com.example.myapplication.SchMatchStateContext(this);//实例化
startCoreSchMatch();
}
private void startCoreSchMatch() {
fsm.enterStartState();//启动状态机
System.out.println("currentState: "+fsm.getState().getName());
fsm.play();//执行状态机里面的方法
fsm.hungry();
fsm.sleep();
fsm.wakeUp();
}
public void changeState(){//状态更改
preState = curState;//将当前状态赋值为之前的状态
curState = fsm.getState().getId();//获取新状态为当前状态
System.out.println("Transition to "+fsm.getState().getName());
}
}
不太重要的java代码:
如下是生成的SchMatchStateContext.java文件的内容
/*
* ex: set ro:
* DO NOT EDIT.
* generated by smc (http://smc.sourceforge.net/)
* from file : SchMatchState.sm
*/
package com.example.myapplication;
import java.util.logging.Logger;
public class SchMatchStateContext
extends statemap.FSMContext
{
//---------------------------------------------------------------
// Member methods.
//
public SchMatchStateContext(SchMatchState owner)
{
this (owner, SchMatchStateMap.WAKE_UP);
}
public SchMatchStateContext(SchMatchState owner, SchMatchStateState initState)
{
super (initState);
_owner = owner;
}
@Override
public void enterStartState()
{
getState().entry(this);
return;
}
//getLog()方法如果是我上传的新的FSMContext.java,这个方法应该删掉
@Override
public Logger getLog() {
return null;
}
public void hungry()
{
_transition = "hungry";
getState().hungry(this);
_transition = "";
return;
}
public void play()
{
_transition = "play";
getState().play(this);
_transition = "";
return;
}
public void sleep()
{
_transition = "sleep";
getState().sleep(this);
_transition = "";
return;
}
public void wakeUp()
{
_transition = "wakeUp";
getState().wakeUp(this);
_transition = "";
return;
}
public SchMatchStateState getState()
throws statemap.StateUndefinedException
{
if (_state == null)
{
throw(
new statemap.StateUndefinedException());
}
return ((SchMatchStateState) _state);
}
protected SchMatchState getOwner()
{
return (_owner);
}
public void setOwner(SchMatchState owner)
{
if (owner == null)
{
throw (
new NullPointerException(
"null owner"));
}
else
{
_owner = owner;
}
return;
}
//---------------------------------------------------------------
// Member data.
//
transient private SchMatchState _owner;
//-----------------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
//---------------------------------------------------------------
// Inner classes.
//
public static abstract class SchMatchStateState
extends statemap.State
{
//-----------------------------------------------------------
// Member methods.
//
protected SchMatchStateState(String name, int id)
{
super (name, id);
}
protected void entry(SchMatchStateContext context) {}
protected void exit(SchMatchStateContext context) {}
protected void hungry(SchMatchStateContext context)
{
Default(context);
}
protected void play(SchMatchStateContext context)
{
Default(context);
}
protected void sleep(SchMatchStateContext context)
{
Default(context);
}
protected void wakeUp(SchMatchStateContext context)
{
Default(context);
}
protected void Default(SchMatchStateContext context)
{
throw (
new statemap.TransitionUndefinedException(
"State: " +
context.getState().getName() +
", Transition: " +
context.getTransition()));
}
//-----------------------------------------------------------
// Member data.
//
//-------------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
}
/* package */ static abstract class SchMatchStateMap
{
//-----------------------------------------------------------
// Member methods.
//
//-----------------------------------------------------------
// Member data.
//
//-------------------------------------------------------
// Constants.
//
public static final SchMatchStateMap_WAKE_UP WAKE_UP =
new SchMatchStateMap_WAKE_UP("SchMatchStateMap.WAKE_UP", 0);
public static final SchMatchStateState PLAY =
new SchMatchStateMap_PLAY("SchMatchStateMap.PLAY", 1);
public static final SchMatchStateMap_EAT EAT =
new SchMatchStateMap_EAT("SchMatchStateMap.EAT", 2);
public static final SchMatchStateMap_SLEEP SLEEP =
new SchMatchStateMap_SLEEP("SchMatchStateMap.SLEEP", 3);
}
protected static class SchMatchStateMap_Default
extends SchMatchStateState
{
//-----------------------------------------------------------
// Member methods.
//
protected SchMatchStateMap_Default(String name, int id)
{
super (name, id);
}
//-----------------------------------------------------------
// Member data.
//
//---------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
}
private static final class SchMatchStateMap_WAKE_UP
extends SchMatchStateMap_Default
{
//-------------------------------------------------------
// Member methods.
//
private SchMatchStateMap_WAKE_UP(String name, int id)
{
super (name, id);
}
@Override
protected void hungry(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.EAT);
(context.getState()).entry(context);
return;
}
@Override
protected void play(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.PLAY);
(context.getState()).entry(context);
return;
}
//-------------------------------------------------------
// Member data.
//
//---------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
}
private static final class SchMatchStateMap_PLAY
extends SchMatchStateMap_Default
{
//-------------------------------------------------------
// Member methods.
//
private SchMatchStateMap_PLAY(String name, int id)
{
super (name, id);
}
@Override
protected void entry(SchMatchStateContext context)
{
SchMatchState ctxt = context.getOwner();
ctxt.changeState();
return;
}
@Override
protected void hungry(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.EAT);
(context.getState()).entry(context);
return;
}
@Override
protected void sleep(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.SLEEP);
(context.getState()).entry(context);
return;
}
//-------------------------------------------------------
// Member data.
//
//---------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
}
private static final class SchMatchStateMap_EAT
extends SchMatchStateMap_Default
{
//-------------------------------------------------------
// Member methods.
//
private SchMatchStateMap_EAT(String name, int id)
{
super (name, id);
}
@Override
protected void entry(SchMatchStateContext context)
{
SchMatchState ctxt = context.getOwner();
ctxt.changeState();
return;
}
@Override
protected void play(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.PLAY);
(context.getState()).entry(context);
return;
}
@Override
protected void sleep(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.SLEEP);
(context.getState()).entry(context);
return;
}
//-------------------------------------------------------
// Member data.
//
//---------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
}
private static final class SchMatchStateMap_SLEEP
extends SchMatchStateMap_Default
{
//-------------------------------------------------------
// Member methods.
//
private SchMatchStateMap_SLEEP(String name, int id)
{
super (name, id);
}
@Override
protected void entry(SchMatchStateContext context)
{
SchMatchState ctxt = context.getOwner();
ctxt.changeState();
return;
}
@Override
protected void wakeUp(SchMatchStateContext context)
{
(context.getState()).exit(context);
context.setState(SchMatchStateMap.WAKE_UP);
(context.getState()).entry(context);
return;
}
//-------------------------------------------------------
// Member data.
//
//---------------------------------------------------
// Constants.
//
private static final long serialVersionUID = 1L;
}
}
/*
* Local variables:
* buffer-read-only: t
* End:
*/
最后的Log截图: