有限状态机

python实现

FSM

有限状态机(Finite-state machine, FSM) (具体可见参考1 有限状态机)

有限状态机是一个五元组M=(Q,Σ,δ,q0,F),其中:
Q={q0,q1,…,qn}是有限状态集合。在任一确定的时刻,有限状态机只能处于一个确定的状态qi;
Σ={σ1,σ2,…,σn}是有限输入字符集合。在任一确定的时刻,有限状态机只能接收一个确定的输入σj;
δ:Q×Σ→Q是状态转移函数,在某一状态下,给定输入后有限状态机将转入状态迁移函数决定的一个新状态;
q0∈Q是初始状态,有限状态机由此状态开始接收输入;
F⊆Q是最终状态集合,有限状态机在达到终态后不再接收输入。

背景

对固定格式的conf增加校验, 要处理的格式如下:

[PRIVILEGE]
[.158]
	[..data]
		linkIcon:
		linkTips: open app
		webSiteLink:  http://some.com
		iosDownloadLink: http://some.com
 [.159]
	[..data]
		linkIcon:
		linkTips: open app
		webSiteLink:
		iosDownloadLink: http://some.com

实现

对比此conf文件,可以直观的获得一些规则与语法规则
有限状态机需要实现五元组每一个元素:M=(Q,Σ,δ,q0,F)

  • q0 初始状态: ‘STATE_START’
  • F 结束集: ‘STATE_UNDEFINED’, ‘STATE_SUCCESS’, ‘STATE_ERROR’
  • Q 状态集: ‘STATE_LEVEL_HIGH’, 'STATE_LEVEL_NUM’等
    这里使用枚举类列举各种状态 EnumStates
  • E 输入字符: “^[PRIVILEGE]$”
  • δ 状态转移: stateGo(self, inputX)
    δ:Q×Σ→Q 通过公式可以看出状态转移函数需要2个输入一个输出
    input: current_state, string #触发转移的输入
    output: new_state
    这里将状态转移函数定义为了状态类,状态类有三个必要数据:
    • state_name 类实例的状态名称
    • me_effect 是否是当前状态
    • states_gos [E,Q] 输入字符,在当前字符生效下的转移状态

状态机

拥有所有状态,定义状态的转移关系
作用:状态管理
from enum import Enum
import re,sys,fileinput

EnumStates = Enum('STATE_WARN','STATE_UNDEFINED', 'STATE_SUCCESS', 'STATE_ERROR', 'STATE_START', 'STATE_LEVEL_HIGH', 'STATE_LEVEL_NUM', 'STATE_LEVEL_DATA', 'STATE_LEVEL_CONTENT_ICON','STATE_LEVEL_CONTENT_TIPS', 'STATE_LEVEL_CONTENT_WEB', 'STATE_LEVEL_CONTENT_IOS', 'STATE_LEVEL_CONTENT_ANDR')

class ConfState:
    def __init__(self, me_effect=False, state_name=EnumStates.STATE_UNDEFINED, state_gos=[]):
        self.state_name = state_name
        self.me_effect = me_effect    
        self.state_gos = state_gos

    def ismenoteffect(self):
        if not self.me_effect :
            print "not state: " + str(self.state_name)
            return EnumStates.STATE_ERROR

    def stateGo(self, inputX):
        if self.ismenoteffect() == EnumStates.STATE_ERROR:
            return EnumStates.STATE_ERROR

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值