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
for index in range(len(self.state_gos)