SMC状态机代码生成工具-一个小demo

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截图:


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张子怡です

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值