public static void ExprGrammarCh4DragonBook()
        {
            var grammar = DragonBook_ExprGrammarCh4.GetGrammar();

            // Create NFA (digraph of items labeled by symbols)
            var characteristicStringsNfa = grammar.GetLr0AutomatonNfa();

            SaveFile("DragonNCG.dot", DotLanguagePrinter.ToDotLanguage(characteristicStringsNfa, DotRankDirection.TopBottom));

            var dfa = characteristicStringsNfa.ToDfa();

            SaveFile("DragonDCG.dot", DotLanguagePrinter.ToDotLanguage(dfa, DotRankDirection.LeftRight, skipStateLabeling: true));

            var dfa2 = grammar.GetLr0AutomatonDfa();

            SaveFile("DragonDCGLr.dot", DotLanguagePrinter.ToDotLanguage(dfa2, DotRankDirection.LeftRight, skipStateLabeling: true));

            var lexer = DragonBook_ExprGrammarCh4.GetLexer("a*a+a");

            grammar.ComputeSlrParsingTable().Parse(lexer, Console.Out);
        }
        public void CreateSlrTable()
        {
            var grammar = DragonBook_ExprGrammarCh4.GetGrammar();

            // Grammar is not LR(0)
            grammar.ComputeLr0ParsingTable().AnyConflicts.ShouldBeTrue();

            var parser = grammar.ComputeSlrParsingTable();

            // Grammar is not SLR(1)
            parser.AnyConflicts.ShouldBeFalse();

            var writer = new TestWriter();

            parser.PrintParsingTable(writer);
            writer.WriteLine();
            writer.WriteLine();

            // "a*a+a"
            var lexer = new FakeLexer <Sym>((Sym.ID, "a"), (Sym.ASTERISK, "*"), (Sym.ID, "a"), (Sym.PLUS, "+"),
                                            (Sym.ID, "a"));

            parser.Parse(lexer, writer);
        }