structure AllDfa = struct type t = { curInt: int , curSpace: int , curBrace: int , lastInt: int , lastSpace: int , lastBrace: int } val initial: t = { curInt = IntDfa.start , curSpace = SpaceDfa.start , curBrace = BraceDfa.start , lastInt = ~1 , lastSpace = ~1 , lastBrace = ~1 } fun areAllDead ({curInt, curSpace, curBrace, ...}: t) = curInt = 0 andalso curSpace = 0 andalso curBrace = 0 fun update (chr, dfa, pos) = let val {curInt, curSpace, curBrace, lastInt, lastBrace, lastSpace} = dfa val curInt = IntDfa.next (curInt, chr) val curSpace = SpaceDfa.next (curSpace, chr) val curBrace = BraceDfa.next (curBrace, chr) val lastInt = if IntDfa.isFinal curInt then pos else lastInt val lastSpace = if SpaceDfa.isFinal curSpace then pos else lastSpace val lastBrace = if BraceDfa.isFinal curBrace then pos else lastBrace in { curInt = curInt , curSpace = curSpace , curBrace = curBrace , lastInt = lastInt , lastBrace = lastBrace , lastSpace = lastSpace } end end