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(); }
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)); }