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

36 lines
1.0 KiB
Standard ML
Raw Normal View History

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