public IniToken(IniTokenType tokenType, IniTokenPosition position) { TokenType = tokenType; StringValue = null; IntegerValue = int.MinValue; LongValue = long.MinValue; FloatValue = float.MinValue; Position = position; }
private int GetTokenIndex(IniTokenType tokenType) { var index = (int)tokenType; if ((index < 0) || (index >= _TokenClassifications.Length)) { index = 0; } return(index); }
public IniTokenType GetAttributeTokenType(string value) { IniTokenType tokenType = IniTokenType.AttributeValue; if (NumberIdenifier.IsNumber(value)) { tokenType = IniTokenType.AttributeValueNumber; } else if (value.Length >= 2 && value[0] == '"' && value[value.Length - 1] == '"') { tokenType = IniTokenType.AttributeValueString; } return(tokenType); }
public IniToken?NextTokenIf(IniTokenType tokenType) { var state = GetState(); var token = Current; if (token.TokenType == tokenType) { _tokenIndex++; return(token); } // Undo lexing, because we might want to re-lex in a different mode. RestoreState(state); return(null); }
public IEnumerable <IniToken> ParseLine(string text, int offset = 0) { bool shouldReadAttributeValue = false; bool shouldReadSectionValue = false; string value; for (int index = 0; index < text.Length; index += value.Length) { char current = text[index]; IniTokenType tokenType = IniTokenType.None; if (DoesStringStartWithNewLine(text, index)) { value = Environment.NewLine; tokenType = IniTokenType.Whitespace; } else if (shouldReadAttributeValue) { shouldReadAttributeValue = false; value = TakeWhile(text, index, Delimiter.IsNotValue); tokenType = GetAttributeTokenType(value); } else if (shouldReadSectionValue) { shouldReadSectionValue = false; value = TakeWhile(text, index, Delimiter.IsNotSection); tokenType = IniTokenType.Section; } else { switch (current) { case Delimiter.CommentStart: int newlineLocation = text.IndexOf(Environment.NewLine, index); value = newlineLocation == -1 ? text.Substring(index) : text.Substring(index, newlineLocation - index); tokenType = IniTokenType.Comment; break; case Delimiter.Value: shouldReadAttributeValue = true; value = Delimiter.Value.ToString(); tokenType = IniTokenType.Delimiter; break; case Delimiter.SectionStart: shouldReadSectionValue = true; value = current.ToString(); tokenType = IniTokenType.Delimiter; break; case Delimiter.SectionEnd: value = current.ToString(); tokenType = IniTokenType.Delimiter; break; default: if (char.IsWhiteSpace(current)) { value = TakeWhile(text, index, char.IsWhiteSpace); tokenType = IniTokenType.Whitespace; } else if (char.IsLetterOrDigit(current)) { value = TakeWhile(text, index, (ch => char.IsLetterOrDigit(ch) || ch == Underscore)); tokenType = IniTokenType.Attribute; } else { value = current.ToString(); } break; } } if (value.Length > 0) { yield return(new IniToken { Start = index + offset, Text = value, Type = tokenType }); } } }
private IniToken CreateToken(IniTokenType tokenType) => new IniToken(tokenType, CurrentPosition);
public IClassificationType GetTokenTypeClassification(IniTokenType tokenType) { int index = GetTokenIndex(tokenType); return(_TokenClassifications[index]); }