/// <summary> /// Vráti hranice grupy. /// Ukazuje na začiatočný znak grupy ( { [. /// //TODO: otestovať!!!! /// </summary> /// <param name="parser"></param> /// <param name="openElem"></param> /// <param name="closeElem"></param> /// <param name="dir"></param> /// <param name="tree"></param> /// <param name="vis"></param> /// <param name="startIndex"></param> /// <param name="length"></param> public void GetGroupCorners(TokenType openElem, TokenType closeElem, SearchVisibility vis, out int startIndex, out int length) { MoveInfo oldMoveInfo = new MoveInfo(this); IElement start = Find(SearchDirection.LeftToRight, vis, a => a.IsTT(openElem)); if (start == null) { throw new SyntaxException("Could not find start of block '" + openElem.ToString() + "'", oldMoveInfo.GetErrorInfo()); } MoveInfo startMoveInfo = new MoveInfo(this); int level = 0; startIndex = CurrentIndex; IElement cur = Current; do { if (cur == null) { throw new SyntaxException("Could not find end of block '" + closeElem.ToString() + "'", oldMoveInfo.GetErrorInfo()); } if (CheckVisible(cur, vis)) { if (cur.IsTT(openElem)) { level++; } else if (cur.IsTT(closeElem)) { level--; } } if (level != 0) { cur = Move(SearchDirection.LeftToRight); } }while (level != 0); length = (CurrentIndex + 1) - startIndex; Restore(startMoveInfo); }
/// <summary> /// Nájde nasledujúci elem vyhovujúci všetkým podmienkam. /// Do hľadania zahrnuje aj Current elem! /// Ukazuje na tento elem. /// </summary> /// <param name="dir"></param> /// <param name="tree"></param> /// <param name="vis"></param> /// <param name="predicate"></param> /// <returns></returns> public IElement Find(SearchDirection dir, SearchVisibility vis, Predicate <IElement> predicate) { IElement cur = Current; while (true) { if (cur == null) { break; } if (!CheckVisible(cur, vis) || (predicate != null && !predicate.Invoke(cur))) { cur = Move(dir); } else { break; } } return(cur); }
/// <summary> /// Nájde nasledujúci elem vyhovujúci všetkým podmienkam. /// Ukazuje na tento elem. /// </summary> /// <param name="dir"></param> /// <param name="tree"></param> /// <param name="vis"></param> /// <returns></returns> public IElement Find(SearchDirection dir, SearchVisibility vis) { return(Find(dir, vis, null)); }
/// <summary> /// Zkontroluje, či viditeľnosť elemu zodpovedá zadaným kritériám. /// </summary> /// <param name="elem"></param> /// <param name="vis"></param> /// <returns></returns> private static bool CheckVisible(IElement elem, SearchVisibility vis) { return(!((vis == SearchVisibility.Unvisible && elem.Visible) || (vis == SearchVisibility.Visible && !elem.Visible))); }