Example #1
0
 private IEnumerable StringMode(Itr itr)
 {
     if (currentItem.Length == 0)
     {
         currentItem.Append('"');
     }
     currentItem.Append(itr.Current());
     if (SwitchMode(itr.Mode))
     {
         yield return(PopString(currentItem));
     }
     else
     {
         if (itr.IsFinalIndex())
         {
             currentItem.Append('"');
             yield return(PopString(currentItem));
         }
         else if ('\\'.Equals(itr.Current()))
         {
             currentItem.Append(itr.Peek(1));
             itr.MoveNext(); //don't check next character since already added
         }
     }
 }
Example #2
0
        /// <summary>
        /// Switches lexing mode if necessary, returns true if switch was performed
        /// </summary>
        private bool SwitchMode(LexerMode mode)
        {
            if (mode == LexerMode.Normal)
            {
                if ('"'.Equals(itr.Current()))
                {
                    itr.Mode = LexerMode.String;
                    return(true);
                }
                if ('/'.Equals(itr.Current()))
                {
                    if ('/'.Equals(itr.Peek(1)))
                    {
                        itr.Mode = LexerMode.Comment;
                        return(true);
                    }
                    if ('*'.Equals(itr.Peek(1)))
                    {
                        itr.Mode = LexerMode.MultiComment;
                        return(true);
                    }
                }
            }
            else if (mode == LexerMode.String)
            {
                if (itr.Current() == '"')
                {
                    itr.Mode = LexerMode.Normal;
                    return(true);
                }
            }
            else
            {
                if (mode == LexerMode.Comment)
                {
                    if (itr.IsFinalIndex())
                    {
                        itr.Mode = LexerMode.Normal;
                        return(true);
                    }
                }
                else if (mode == LexerMode.MultiComment)
                {
                    if (itr == "*/")
                    {
                        itr.Mode = LexerMode.Normal;
                        itr.MoveNext(); //move to '/'
                        return(true);
                    }
                }
            }

            return(false);
        }
Example #3
0
 private IEnumerable <string> NormalMode(Itr itr)
 {
     if (!SwitchMode(itr.Mode))
     {
         if (' '.Equals(itr.Current()))
         {
             if (currentItem.Length > 0)
             {
                 yield return(PopString(currentItem));
             }
         }
         else if (SplitOnDot(itr))
         {
             if (currentItem.Length > 0)
             {
                 yield return(PopString(currentItem));
             }
             yield return(itr.Current().ToString());
         }
         else if (MatchDoubleSymbolDelimiter(__multi_symbol_delimiters__, itr))
         {
             if (currentItem.Length > 0)
             {
                 yield return(PopString(currentItem));
             }
             currentItem.Append(itr.Current());
             currentItem.Append(itr.Peek(1));
             itr.MoveNext();
         }
         else if (MatchDelimiter(__Updated_Delimiters__, itr))
         {
             if (currentItem.Length > 0)
             {
                 yield return(PopString(currentItem));
             }
             yield return(itr.Current().ToString());
         }
         else
         {
             currentItem.Append(itr.Current());
         }
         if (itr.IsFinalIndex() && currentItem.Length > 0)
         {
             yield return(PopString(currentItem));
         }
     }
     else if (itr.Current() != ' ' && currentItem.Length > 0)
     {
         yield return(PopString(currentItem));
     }
 }