public static IEnumerable <Log> Kill(string input) { var dot = new DotTreeGenerator(); var result = new List <Log>(); Print(input); input = input.ToLowerInvariant().Trim(); if (Cache.ContainsKey(input)) { result = Cache[input].ToList(); } else { var parser = ParseWithASTParser(input); var tree = parser.evaluate().Tree; PrintString(dot.ToDot(tree)); Parse(tree, result); Cache.Add(input, result); } TexasRanger.ValidateLogs(result); result.ForEach(x => Print(x.ToString())); foreach (var log in result) { log.OriginalInput = input; yield return(log.Return()); } }
private static void ParseLog(CommonTree tree, Log log) { if (tree.Type == PowerLogASTLexer.EXERCISE_NAME) { if (tree.ChildCount < 1) { throw new Exception("Exercise is missing a name."); } else if (tree.Children.Any(x => x.Type == PowerLogASTLexer.WORD) == false) { throw new Exception("Exercise is missing a name."); } log.Name = string.Join(" ", tree.Children.Select(x => x.Text)); PrintString(log.Name); } else if (tree.Type == PowerLogASTLexer.FLAGGED_SET) { var set = new Set(); var childSet = (from s in tree.Children where s.Type == PowerLogASTLexer.SET || s.Type == PowerLogASTLexer.MULTI_SET select(CommonTree) s) .FirstOrDefault(); var childFlags = (from s in tree.Children where s.Type == PowerLogASTLexer.FLAGS select(CommonTree) s) .FirstOrDefault(); if (childSet == null) { throw new Exception(string.Format("No sets defined for [{0}]", log.Name)); } ParseSet(childSet, set); ParseSetFlags(childFlags, set); TexasRanger.ValidateSet(set); log.Sets.Add(set); } ParseChildren(tree, log, ParseLog); }
private static void Parse(CommonTree tree, ICollection <Log> list) { if (tree.Type == PowerLogASTLexer.EXERCISE) { if (tree.ChildCount > 0) { var log = new Log(); foreach (var child in tree.Children) { ParseLog((CommonTree)child, log); } TexasRanger.ValidateLog(log); list.Add(log); } } ParseChildren(tree, list, Parse); }