public static LexerNFA ConvertToNFA(LexerSpec spec)
        {
            spec = spec.HasBeenSimplified ? spec : spec.Simplify();
            var equivalenceClasses = MakeEquivalenceClasses(spec);
            var nfa = new NFA<LexerAction>(equivalenceClasses.Count);
            var modeMap = spec.Modes.ToDictionary(m => m, m => nfa.AddState(true));

            for(var i = 0; i < spec.Rules.Count; i++)
                spec.Rules[i].AddStates(modeMap, equivalenceClasses, nfa, i, spec.DefaultChannel);

            return new LexerNFA(spec, modeMap, equivalenceClasses, nfa);
        }
        public static LexerNFA ConvertToNFA(LexerSpec spec)
        {
            spec = spec.HasBeenSimplified ? spec : spec.Simplify();
            var equivalenceClasses = MakeEquivalenceClasses(spec);
            var nfa     = new NFA <LexerAction>(equivalenceClasses.Count);
            var modeMap = spec.Modes.ToDictionary(m => m, m => nfa.AddState(true));

            for (var i = 0; i < spec.Rules.Count; i++)
            {
                spec.Rules[i].AddStates(modeMap, equivalenceClasses, nfa, i, spec.DefaultChannel);
            }

            return(new LexerNFA(spec, modeMap, equivalenceClasses, nfa));
        }