module CanonSharp.Parser.LexicalAnalyzer.NondeterministicFiniteAutomation open System open System.Collections.Generic open CanonSharp.Parser.LexicalAnalyzer.RegularExpression type NondeterministicState(id: Guid, transaction: Option -> list) = member val id = id member val transaction = transaction override this.GetHashCode() = this.id.GetHashCode() new() = NondeterministicState(Guid.NewGuid(), fun a -> list.Empty) type NondeterministicFiniteAutomation(states: HashSet, entryTransaction: Option -> list) = member val states = states member val entryTransaction = entryTransaction let convertEmptyToNonDeterministicFiniteAutomation (expression: EmptyExpression) = let final = NondeterministicState() let transaction (a: Option) = match a with | Some _ -> list.Empty | None -> [final] let states = HashSet() let _ = states.Add(final) NondeterministicFiniteAutomation(states, transaction) let convertToNondeterministicFiniteAutomation expression: RegularExpression = match expression with | EmptyExpression ->