编译原理 × Haskell - NFA → DFA

Talk is Cheap

这周上编译系统课,讲词法分析,讲到了很多归纳 / 递归 / 树形结构 / … 相关的内容,这也太——适合放在 Haskell 里写了,加上这些函数这么纯,多适合用函数式的语言实现. 于是开始着手做这件事情,我们小组讨论的选题是 NFA (Nondeterministic Finite Automaton)转 DFA (Deterministic Finite Automaton),于是先从这里开始. 

Show Me the Code

项目的 GitHub 地址:Compiler in HS

希望后续可以多写点代码,不要让 NFA2DFA 成为留守模块.

数据抽象

首先对 NFA, DFA 做数据抽象,根据两者的形式化定义,如下:

type Symbol = Char 

type State = Int
type StatesCollection = Set.Set State

type NfaTransition = Map.Map (State, Maybe Symbol) (Set.Set State) 
type DfarTransition = Map.Map (State, Maybe Symbol) State 
type DfaTransition = Map.Map (StatesCollection, Maybe Symbol) StatesCollection 

data NFA = NFA {
    startState :: State,
    stateSet   :: Set.Set State,
    acceptSet  :: Set.Set State,
    alphabet   :: Set.Set Symbol,
    transition :: NfaTransition
} deriving Show 

data DFA = DFA {
    startStates     :: StatesCollection,
    alphabt         :: Set.Set Symbol,
    collectionSet   :: Set.Set StatesCollection,
    transitionRules :: DfaTransition
    -- acCollectionSet :: Set.Set StatesCollection
} deriving Show

data DFAr = DFAr {                  -- simplified DFA
    startNode    :: State,
    nodeSet      :: Set.Set State,
    acceptNodes  :: Set.Set State,
    alphabat     :: Set.Set Symbol,
    rules        :: DfarTransition
} deriving Show 

NFA 就是 NFA 了,DFAr 是简化的 DFA,这样的设计和代码的结构有关系(A.K.A. 想一出是一出,我对代码的结构并没有预先的宏观的设计:).

[TODO]

Wish You a Nice Day!
Built with Hugo
Theme Stack designed by Jimmy