36 lines
1.0 KiB
Standard ML
36 lines
1.0 KiB
Standard ML
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
|