/// <summary> /// Replaces all occurrences of a specified String, with another specified string. /// Before oldValue must not follow specified prefix - string. /// </summary> /// <param name="prefix">Prefix - string.</param> /// <param name="oldValue">A String to be replaced.</param> /// <param name="newValue">A String to replace all occurrences of oldValue.</param> /// <returns>Replaced string.</returns> public void ReplaceWithNotEqualPrefix(StiTokenType prefix, string oldValue, string newValue) { this.Reset(); StiToken prefixToken = this.GetToken(); if (prefixToken.Type == StiTokenType.EOF) { return; } StiToken token = null; do { token = this.GetToken(); if (token.Type == StiTokenType.Ident && prefixToken.Type != prefix && ((string)token.Data) == oldValue) { text = text.Replace(oldValue, newValue, token.Index, token.Length); this.positionInText += newValue.Length; } prefixToken = token; }while (token.Type != StiTokenType.EOF); baseText = text.ToString(); }
///// <summary> ///// Replaces all occurrences of a specified string, with another specified string. ///// Replacing is produced with provision for tokens. ///// </summary> ///// <param name="textValue">Text for replace.</param> ///// <param name="oldValue">A String to be replaced.</param> ///// <param name="newValue">A String to replace all occurrences of oldValue.</param> ///// <returns>Replaced string.</returns> //public static string Replace(string textValue, string oldValue, string newValue) //{ // StringBuilder sb = new StringBuilder(textValue); // StiLexer lexer = new StiLexer(textValue); // StiToken token = null; // do // { // token = lexer.GetToken(); // if (token.Type == StiTokenType.Ident && ((string)token.Data) == oldValue) // { // sb = sb.Replace(oldValue, newValue, token.Index, token.Length); // lexer.positionInText += newValue.Length; // } // } // while (token.Type != StiTokenType.EOF); // return sb.ToString(); //} /// <summary> /// Replaces all occurrences of a specified String, with another specified String. /// Before oldValue must follow specified prefix - token. /// Replacing is produced with provision for tokens. /// </summary> /// <param name="textValue">Text for replace.</param> /// <param name="prefix">Prefix - token.</param> /// <param name="oldValue">A String to be replaced.</param> /// <param name="newValue">A String to replace all occurrences of oldValue.</param> /// <returns>Replaced string.</returns> public static string ReplaceWithPrefix(string textValue, string prefix, string oldValue, string newValue) { StringBuilder sb = new StringBuilder(textValue); StiLexer lexer = new StiLexer(textValue); StiToken prefixToken = lexer.GetToken(); if (prefixToken.Type == StiTokenType.EOF) { return(textValue); } StiToken token = null; do { token = lexer.GetToken(); if (token.Type == StiTokenType.Ident && prefixToken.Type == StiTokenType.Ident && ((string)prefixToken.Data) == prefix && ((string)token.Data) == oldValue) { sb = sb.Replace(oldValue, newValue, token.Index, token.Length); lexer.positionInText += newValue.Length; } prefixToken = token; }while (token.Type != StiTokenType.EOF); return(sb.ToString()); }
/// <summary> /// Gets next token. /// </summary> /// <returns>Next token.</returns> public StiToken GetToken() { Skip(); #region End of the text if (Text.Length <= positionInText) { return(new StiToken(StiTokenType.EOF, positionInText, 0)); } #endregion #region Ident else if (Char.IsLetter(Text[positionInText]) || Text[positionInText] == '_' || Text[positionInText] == '№') { int startIndex = positionInText; SavePosToken(); StiToken token = ScanIdent(); switch ((string)token.Data) { case "true": return(new StiToken(StiTokenType.Value, startIndex, 4, true)); case "false": return(new StiToken(StiTokenType.Value, startIndex, 5, false)); } return(token); } #endregion #region Number else if (Char.IsDigit(Text[positionInText])) { SavePosToken(); return(ScanNumber()); } #endregion #region String else if (Text[positionInText] == '"') { SavePosToken(); return(ScanString()); } #endregion #region Char else if (Text[positionInText] == '\'') { SavePosToken(); return(ScanChar()); } #endregion else { #region Operators switch (Text[positionInText]) { case '€': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Euro, positionInText - 1, 1)); case '®': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Copyright, positionInText - 1, 1)); case '(': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.LPar, positionInText - 1, 1)); case ')': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.RPar, positionInText - 1, 1)); case '{': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.LBrace, positionInText - 1, 1)); case '}': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.RBrace, positionInText - 1, 1)); case ',': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Comma, positionInText - 1, 1)); case '.': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Dot, positionInText - 1, 1)); case ';': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.SemiColon, positionInText - 1, 1)); case ':': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Colon, positionInText - 1, 1)); case '!': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Minus, positionInText - 1, 1)); case '*': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Mult, positionInText - 1, 1)); case '^': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Not, positionInText - 1, 1)); case '/': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Div, positionInText - 1, 1)); case '\\': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Splash, positionInText - 1, 1)); case '%': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Percent, positionInText - 1, 1)); case '#': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Sharp, positionInText - 1, 1)); case '$': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Dollar, positionInText - 1, 1)); case '@': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Ampersand, positionInText - 1, 1)); case '[': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.LBracket, positionInText - 1, 1)); case ']': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.RBracket, positionInText - 1, 1)); case '?': SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Question, positionInText - 1, 1)); #region Symbol "|" case '|': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '|') { positionInText++; return(new StiToken(StiTokenType.DoubleOr, positionInText - 2, 2)); } return(new StiToken(StiTokenType.Or, positionInText - 1, 1)); #endregion #region Symbol "&" case '&': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '&') { positionInText++; return(new StiToken(StiTokenType.DoubleAnd, positionInText - 2, 2)); } return(new StiToken(StiTokenType.And, positionInText - 1, 1)); #endregion #region Symbol "+" case '+': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '+') { positionInText++; return(new StiToken(StiTokenType.DoublePlus, positionInText - 2, 2)); } return(new StiToken(StiTokenType.Plus, positionInText - 1, 1)); #endregion #region Symbol "-" case '-': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '-') { positionInText++; return(new StiToken(StiTokenType.DoubleMinus, positionInText - 2, 2)); } return(new StiToken(StiTokenType.Minus, positionInText - 1, 1)); #endregion #region Symbol "=" case '=': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '=') { positionInText++; return(new StiToken(StiTokenType.Equal, positionInText - 2, 2)); } return(new StiToken(StiTokenType.Assign, positionInText - 1, 1)); #endregion #region Symbol "<" case '<': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '=') { positionInText++; return(new StiToken(StiTokenType.LeftEqual, positionInText - 2, 2)); } if (positionInText != Text.Length && Text[positionInText] == '<') { positionInText++; return(new StiToken(StiTokenType.Shl, positionInText - 2, 2)); } return(new StiToken(StiTokenType.Left, positionInText - 1, 1)); #endregion #region Symbol ">" case '>': SavePosToken(); positionInText++; if (positionInText != Text.Length && Text[positionInText] == '=') { positionInText++; return(new StiToken(StiTokenType.RightEqual, positionInText - 2, 2)); } if (positionInText != Text.Length && Text[positionInText] == '>') { positionInText++; return(new StiToken(StiTokenType.Shr, positionInText - 2, 2)); } return(new StiToken(StiTokenType.Right, positionInText - 1, 1)); #endregion default: { SavePosToken(); positionInText++; return(new StiToken(StiTokenType.Unknown, positionInText - 1, 1)); } } #endregion } }
/// <summary> /// Wait the right brace. /// </summary> public bool WaitRbrace2() { StiToken token = GetToken(); return(token.Type == StiTokenType.RBrace); }
/// <summary> /// Wait the semicolon. /// </summary> public bool WaitSemicolon2() { StiToken token = GetToken(); return(token.Type == StiTokenType.SemiColon); }
/// <summary> /// Wait the right paren. /// </summary> public bool WaitRparen2() { StiToken token = GetToken(); return(token.Type == StiTokenType.RPar); }
/// <summary> /// Wait the assign. /// </summary> public bool WaitAssign2() { StiToken token = GetToken(); return(token.Type == StiTokenType.Assign); }
/// <summary> /// Wait the right bracket. /// </summary> public bool WaitComma2() { StiToken token = GetToken(); return(token.Type == StiTokenType.Comma); }