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); }