git-subtree-dir: dotscape git-subtree-mainline:6b91d64fc3git-subtree-split:f306501a68
45 lines
1.1 KiB
Standard ML
45 lines
1.1 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
|