diff --git a/fcore/search-list/dfa-gen.sml b/fcore/search-list/dfa-gen.sml index 6b1b96a..800a145 100644 --- a/fcore/search-list/dfa-gen.sml +++ b/fcore/search-list/dfa-gen.sml @@ -729,13 +729,21 @@ struct in Vector.concat [dtran, el] end - else + else if dStateIdx < Vector.length dtran then let val el = Vector.sub (dtran, dStateIdx) val el = Set.insertOrReplace (char, toStateIdx, el) in Vector.update (dtran, dStateIdx, el) end + else + let + val appendLength = dStateIdx - Vector.length dtran + val appendVecs = Vector.tabulate (appendLength, fn _ => Set.LEAF) + val dtran = Vector.concat [dtran, appendVecs] + in + insert (dStateIdx, char, toStateIdx, dtran) + end end fun convertChar diff --git a/test/regression.sml b/test/regression.sml index 4be552e..d3c4c79 100644 --- a/test/regression.sml +++ b/test/regression.sml @@ -67,6 +67,15 @@ struct in Expect.isTrue true end) + , test + "DfaGen does not cause exception \ + \when parsing alternation that contains a char \ + \from the previous alternation (1)" + (fn _ => + (let val dfa = CaseSensitiveDfa.fromString "str|s" + in Expect.isTrue true + end) + handle _ => Expect.isTrue false) ] val tests = [charEventTests]