-- SPDX-FileCopyrightText: Chris Pressey, the creator of this work, has dedicated it to the public domain. -- For more information, please refer to -- SPDX-License-Identifier: Unlicense module Language.Turmac.IRCompiler where import Data.List (nub) import Language.Turmac.Model import Language.Turmac.IR -- Group rules by state groupByState :: [TMRule] -> [(StateId, [(Symbol, (StateId, Symbol, Direction))])] groupByState rules = [(state, [(sym, (newSym, newState, dir)) | (s, sym, newSym, newState, dir) <- rules, s == state]) | state <- states] where states = nub [s | (s,_,_,_,_) <- rules] -- Convert a single state's rules to CondSymbol stateRulesToProg :: [(Symbol, (Symbol, StateId, Direction))] -> Prog stateRulesToProg rules = CondSymbol [(sym, Seq [WriteMoveGoto newSym dir newState]) | (sym, (newSym, newState, dir)) <- rules] -- Convert all rules to full program buildProgram :: [TMRule] -> Prog buildProgram rules = Program (CondState [(state, stateRulesToProg stateRules) | (state, stateRules) <- groupByState rules])