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