Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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);
                        }
                    }
                }
            }
        }