private Grammar MakeGrammarLeft() { IDictionary <char, TerminalSymbol> charTerminalMap = Alphabet.ToDictionary(c => c, c => new TerminalSymbol(c)); IDictionary <Label, NonTerminalSymbol> stateNonTerminalMap = States.ToDictionary(s => s, s => new NonTerminalSymbol(s)); NonTerminalSymbol target = Grammar.GetNewNonTerminal(stateNonTerminalMap.Values); ISet <Rule> rules = new HashSet <Rule>(); foreach (Transition transition in Transitions) { Chain chain = new Chain( EnumerateHelper.Sequence <Symbol>( stateNonTerminalMap[transition.CurrentState], charTerminalMap[transition.Symbol] ) ); rules.Add(new Rule(chain.AsSequence(), stateNonTerminalMap[transition.NextState])); } rules.Add(new Rule(Chain.Empty.AsSequence(), stateNonTerminalMap[InitialState])); IEnumerable <Chain> chains = FinalStates.Select(fs => new Chain(stateNonTerminalMap[fs].AsSequence())); rules.Add(new Rule(chains, target)); return(new Grammar(rules, target)); }