コード例 #1
0
        public IniToken(IniTokenType tokenType, IniTokenPosition position)
        {
            TokenType    = tokenType;
            StringValue  = null;
            IntegerValue = int.MinValue;
            LongValue    = long.MinValue;
            FloatValue   = float.MinValue;

            Position = position;
        }
コード例 #2
0
        private int GetTokenIndex(IniTokenType tokenType)
        {
            var index = (int)tokenType;

            if ((index < 0) ||
                (index >= _TokenClassifications.Length))
            {
                index = 0;
            }
            return(index);
        }
コード例 #3
0
ファイル: IniParser.cs プロジェクト: modulexcite/PowerStudio
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
ファイル: IniParser.cs プロジェクト: modulexcite/PowerStudio
        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
                    });
                }
            }
        }
コード例 #6
0
 private IniToken CreateToken(IniTokenType tokenType) => new IniToken(tokenType, CurrentPosition);
コード例 #7
0
        public IClassificationType GetTokenTypeClassification(IniTokenType tokenType)
        {
            int index = GetTokenIndex(tokenType);

            return(_TokenClassifications[index]);
        }