示例#1
0
        private bool TryReadStringPart(StringBuilder builder)
        {
            var lineLength = _line.Length;

            if (_columnIndex >= lineLength || _line[_columnIndex] != '"')
            {
                AddError(DiagnosticCodes.ExpectedToken, new TextLocation(_lineIndex, _columnIndex >= 0 ? _columnIndex : lineLength), '"');
                return(false);
            }

            var startIndex = ++_columnIndex;

            for (; _columnIndex < lineLength; _columnIndex++)
            {
                if (_line[_columnIndex] == '"' && !IsEscaped(startIndex))
                {
                    var endIndex = _columnIndex++;
                    _columnIndex = FindNextTokenInLine();
                    if (_columnIndex >= 0)
                    {
                        AddError(DiagnosticCodes.UnexpectedToken, new TextLocation(_lineIndex, lineLength));
                        return(false);
                    }

                    var index = POString.Decode(builder, _line, startIndex, endIndex - startIndex);
                    if (index >= 0)
                    {
                        AddError(DiagnosticCodes.InvalidEscapeSequence, new TextLocation(_lineIndex, index));
                        return(false);
                    }

                    _columnIndex = lineLength;
                    return(true);
                }
            }

            AddError(DiagnosticCodes.ExpectedToken, new TextLocation(_lineIndex, lineLength), '"');
            return(false);

            bool IsEscaped(int si)
            {
                bool result = false;

                for (var i = _columnIndex - 1; i >= si; i--)
                {
                    if (_line[i] == '\\')
                    {
                        result = !result;
                    }
                    else
                    {
                        break;
                    }
                }

                return(result);
            }
        }
示例#2
0
文件: POComment.cs 项目: dmc31a42/po
        public static bool TryParse(string value, out POPreviousValueComment result)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            string idKindToken = null;

            value = value.Trim();
            var index = value.FindIndex(char.IsWhiteSpace);

            if (index >= 0)
            {
                idKindToken = value.Remove(index);
                value       = value.Substring(index + 1).TrimStart();
            }

            int           length;
            POIdKind      idKind;
            StringBuilder sb;

            if (index < 0 ||
                (length = value.Length) < 2 || value[0] != '"' || value[length - 1] != '"' ||
                (idKind = POKey.GetIdKind(idKindToken)) == POIdKind.Unknown ||
                POString.Decode(sb = new StringBuilder(), value, 1, length - 2) >= 0)
            {
                result = null;
                return(false);
            }

            result = new POPreviousValueComment {
                IdKind = idKind, Value = sb.ToString()
            };
            return(true);
        }