From f8b707de20f5fcf19b79e9c6315cf54a35002a1a Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Mon, 29 Sep 2025 01:45:28 +0100 Subject: [PATCH] interpret concatenation and alternation in nfa --- fcore/search-list/nfa.sml | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/fcore/search-list/nfa.sml b/fcore/search-list/nfa.sml index 8fb49db..fb4f797 100644 --- a/fcore/search-list/nfa.sml +++ b/fcore/search-list/nfa.sml @@ -16,6 +16,28 @@ struct val concatLevel = 3 val altLevel = 4 + local + fun loop (tl, maxValid) = + case tl of + (_, VALID curValid) :: tl => loop (tl, Int.max (maxValid, curValid)) + | (_, UNTESTED) :: _ => UNTESTED + | (_, INVALID) :: _ => + raise Fail + "nfa.sml 24: \ + \should not have INVALID state in acc" + | [] => VALID maxValid + in + fun getAlternationState acc = + case acc of + (_, VALID maxValid) :: tl => loop (tl, maxValid) + | (_, UNTESTED) :: _ => UNTESTED + | (_, INVALID) :: _ => + raise Fail + "nfa.sml 26: \ + \should not have INVALID state in acc" + | [] => UNTESTED + end + local fun rebuildConcat (lst, chr, idx) = case lst of @@ -61,9 +83,9 @@ struct VALID _ => (hd, state) :: acc | UNTESTED => (hd, state) :: acc | INVALID => acc - (* todo: check if all are valid, and get max valid pos *) + val state = getAlternationState acc in - (ALTERNATION (acc, UNTESTED), UNTESTED) + (ALTERNATION (acc, state), state) end | (hd, _) :: tl => let @@ -88,7 +110,7 @@ struct | CONCAT (lst, UNTESTED) => rebuildConcat (lst, chr, idx) | CONCAT (_, state) => (nfa, state) - | ALTERNATION (lst, UNTESTED) => rebuildAlternation (lst, chr, idx) + | ALTERNATION (lst, UNTESTED) => rebuildAlternation (lst, chr, idx, []) | ALTERNATION (_, state) => (nfa, state) | _ => raise Fail "nfa.sml 69: not char literal or concat"