public static void BuildAbstractSyntaxTree(earley.EarleyParser parser) { List<string> child = new List<string>(); List<List<string>> tree = new List<List<string>>(); parser.Charts.Reverse(); foreach (var chart in parser.Charts) chart.chart.Reverse(); parser.Words.Reverse(); foreach (var word in parser.Words) { hasSChanged = false; collapse = false; BuildSyntaxNode(parser, word, child); tree.Add(child); child = new List<string>(); } foreach (var ch in tree) { string line = ""; foreach (var node in ch.AsEnumerable().Reverse()) { line += "\t" + node; } Console.WriteLine(line); } }
public static void BuildSyntaxNode(earley.EarleyParser parser, string s, List<string> tree) { foreach (var charts in parser.Charts) { MatchEnum? match = null; foreach (var chart in charts.chart) { if (hasSChanged) { match = charts.chart.MatchLevelInRightTermsOnStateList(s); if (match == MatchEnum.None) break; if (match == MatchEnum.Perfect) { if (chart.termsRight.termsRight.ContainsPerfectMatchAfterDot(s)) BuildChartTree(chart, ref tree, ref s, match); } else if (match == MatchEnum.Good) { if (chart.termsRight.termsRight.ContainsAfterDot(s)) BuildChartTree(chart, ref tree, ref s, match); } if (collapse) return; } else { if (chart.termsRight.termsRight.Contains(s)) { BuildChartTree(chart, ref tree, ref s); hasSChanged = true; } } } } }
private static void BuildChartTree(earley.State chart, ref List<string> tree, ref string s, MatchEnum? match = null) { if (hasSChanged) { foreach (var term in chart.termsRight.termsRight.StringListAfterDot()) if (term != earley.DOT && term == s) tree.Add(term); } else { foreach (var term in chart.termsRight.termsRight) if (term != earley.DOT && term == s) tree.Add(term); } if (chart.termsLeft == "S") { tree.Add(chart.termsLeft); collapse = true; } else s = chart.termsLeft; }
public static void RunTest(p.Grammar grammar, List<string> sentence) { //Printing out what the sentence is Console.WriteLine(p.GetStringFromList(sentence)); //Initializing parser p.EarleyParser parser = new p.EarleyParser(); //Printing information if parsing was successfull (sentence was parsed for given grammar or not) Console.WriteLine(parser.Parse(sentence, grammar) ? "Parsed successfully +" : "Parsing was unsuccessfull -"); //Printing chart parser.PrintOutChart(); EarleyParserLogic.ASTLogic.BuildAbstractSyntaxTree(parser); Program.WaitForPress(); }