public bool FindMatches( List <Path> currentPathList, List <State> currentStateList, ref List <Path> nextPathList, ref List <State> nextStateList, IParseTree input, bool use_backtracking = true) { if (!(input as AstParserParser.NodeContext != null || input as AstParserParser.AttrContext != null)) { throw new Exception(); } if (use_backtracking) { next = new Dictionary <IParseTree, IParseTree>(); next_sibling = new Dictionary <IParseTree, IParseTree>(); IParseTree last = null; var rev = input.Preorder().ToList(); rev.Reverse(); foreach (var v in rev) { next[v] = last; if (v as AstParserParser.NodeContext != null || v as AstParserParser.AttrContext != null) { IParseTree last_child = null; foreach (var child in v.ChildrenReverse()) { next_sibling[child] = last_child; last_child = child; } } last = v; } var x = BacktrackingFindMatches(currentStateList.First(), input, out bool match); if (match) { nextPathList.Add(x); return(true); } else { return(false); } } else { return(NonbacktrackingFindMatches(currentPathList, currentStateList, ref nextPathList, ref nextStateList, input)); } }
public void Match() { foreach (var pass in _passes) { _current_type = pass.Owner.Type; if (Piggy._debug_information) { Console.Error.WriteLine(pass.Owner.TemplateName + " " + pass.Name); } var thompsons_construction = new ThompsonsConstruction(); var nfa = thompsons_construction.NFA; foreach (var pattern in pass.Patterns) { thompsons_construction.post2nfa(pattern); } if (Piggy._debug_information) { Console.Error.WriteLine(nfa); } var nfa_optimizer = new NfaOptimizer(); Automaton optimized_nfa = null; if (false) { optimized_nfa = nfa_optimizer.Optimize(nfa); } else { optimized_nfa = nfa; } if (Piggy._debug_information) { Console.Error.WriteLine(optimized_nfa); } // Perform naive matching for each node. foreach (var input in _ast.Preorder()) { if (!(input as AstParserParser.NodeContext != null || input as AstParserParser.AttrContext != null)) { continue; } var has_previous_match = _matches.Contains(input); var do_matching = !has_previous_match; if (has_previous_match) { continue; } var currentStateList = new List <State>(); var currentPathList = new List <Path>(); var nextPathList = new List <Path>(); var nextStateList = new List <State>(); var nfa_match = new NfaMatch(_piggy._code_blocks, _instance, optimized_nfa); var start = optimized_nfa.StartStates.FirstOrDefault().Id; var st = optimized_nfa.Vertices.Where(s => s.Id == start).FirstOrDefault(); nfa_match.AddStateAndClosure(currentStateList, st); if (Piggy._debug_information) { System.Console.Error.WriteLine("Looking at " + input.GetText().Truncate(40)); } var matched = nfa_match.FindMatches(currentPathList, currentStateList, ref nextPathList, ref nextStateList, input); if (matched) { // If this node matched, then mark entire subtree as matched. var stack = new Stack <IParseTree>(); stack.Push(input); while (stack.Count > 0) { var v = stack.Pop(); _matches.Add(v); for (var i = v.ChildCount - 1; i >= 0; --i) { var c = v.GetChild(i); stack.Push(c); } } _top_level_matches.Add(input); foreach (var p in nextPathList) { _matches_path_start.MyAdd(input, p); } } } } }