Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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));
 }
Beispiel #4
0
 /// <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)));
 }