コード例 #1
0
        public override Symbol VisitRightDownSearch([NotNull] PageInterpreterParser.RightDownSearchContext context)
        {
            var maxSteps             = int.Parse(context.Steps.Text);
            var results              = new List <Tuple <Direction, TraversalResult> >();
            var currentPageTraverser = pageTraverser;
            var rightPageTraverser   = (PageTraverser)pageTraverser.Clone();
            var downPageTraverser    = (PageTraverser)pageTraverser.Clone();

            results.Add(Tuple.Create(Direction.Right, rightPageTraverser.Traverse(Direction.Right, maxSteps)));
            results.Add(Tuple.Create(Direction.Down, downPageTraverser.Traverse(Direction.Down, maxSteps)));

            results = results.Where(x => x.Item2 != null && x.Item2.Steps < maxSteps).OrderBy(x => x.Item2.Steps).ToList();

            foreach (var result in results)
            {
                try
                {
                    pageTraverser = result.Item1 == Direction.Right ? rightPageTraverser : downPageTraverser;
                    base.VisitRightDownSearch(context);
                    return(new Symbol(SymbolType.Success));
                }
                catch { }
            }

            throw new ParseCanceledException();
        }
コード例 #2
0
        public override Symbol VisitPattern([NotNull] PageInterpreterParser.PatternContext context)
        {
            var onlyFirstCaptured = context.Any() == null ? true : false;

            var subsets = context?.subset()?.Accept(this)?.GetValue <Dictionary <SubsetPart, int> >();

            for
            (
                int x = page.Contents.GetLength(0) - calculateSubsetOnPage(subsets, SubsetPart.Right);
                x < calculateSubsetOnPage(subsets, SubsetPart.Left);
                x++
            )
            {
                for
                (
                    int y = page.Contents.GetLength(1) - calculateSubsetOnPage(subsets, SubsetPart.Bottom);
                    y < calculateSubsetOnPage(subsets, SubsetPart.Top);
                    y++
                )
                {
                    if (page.Contents[x, y] == null || page.Contents[x, y].Count == 0)
                    {
                        continue;
                    }

                    pageTraverser = new PageTraverser(page, new PageIndex(x, y));

                    currentPatternResult = new PatternResult();

                    try
                    {
                        base.VisitPattern(context);
                        if (currentPatternResult != null)
                        {
                            foreach (var item in currentPatternResult.Result)
                            {
                                Result.AddResult(queryLabel, item.Key, item.Value);
                            }
                        }
                        if (onlyFirstCaptured)
                        {
                            x = page.Contents.GetLength(0);
                            break;
                        }
                    }
                    catch (ParseCanceledException)
                    {
                        currentPatternResult = null;
                    }
                }
            }

            return(new Symbol(SymbolType.Success));
        }