Files
sml-projects/fcore/parser/all-dfa.sml

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