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