示例#1
0
        private void HandleWorksheetNameToken()
        {
            // use this and the following three tokens
            var tokenType = _navigator.GetTokenAtRelativePosition(3).TokenType;

            ChangeTokenTypeOnCurrentToken(tokenType);
            var sb        = new StringBuilder();
            var nToRemove = 3;

            if (_navigator.NbrOfRemainingTokens < nToRemove)
            {
                ChangeTokenTypeOnCurrentToken(TokenType.InvalidReference);
                nToRemove = _navigator.NbrOfRemainingTokens;
            }
            else if (_navigator.GetTokenAtRelativePosition(3).TokenType != TokenType.ExcelAddress &&
                     _navigator.GetTokenAtRelativePosition(3).TokenType != TokenType.ExcelAddressR1C1)
            {
                ChangeTokenTypeOnCurrentToken(TokenType.InvalidReference);
                nToRemove--;
            }
            else
            {
                for (var ix = 0; ix < 4; ix++)
                {
                    sb.Append(_navigator.GetTokenAtRelativePosition(ix).Value);
                }
            }
            ChangeValueOnCurrentToken(sb.ToString());
            for (var ix = 0; ix < nToRemove; ix++)
            {
                _context.RemoveAt(_navigator.Index + 1);
            }
        }
        private void HandleColon()
        {
            var prevToken = _navigator.GetTokenAtRelativePosition(-1);
            var nextToken = _navigator.GetTokenAtRelativePosition(1);

            if (prevToken.TokenTypeIsSet(TokenType.ClosingParenthesis))
            {
                // Previous expression should be an OFFSET function
                var index             = 0;
                var openedParenthesis = 0;
                var closedParethesis  = 0;
                while (openedParenthesis == 0 || openedParenthesis > closedParethesis)
                {
                    index--;
                    var token = _navigator.GetTokenAtRelativePosition(index);
                    if (token.TokenTypeIsSet(TokenType.ClosingParenthesis))
                    {
                        openedParenthesis++;
                    }
                    else if (token.TokenTypeIsSet(TokenType.OpeningParenthesis))
                    {
                        closedParethesis++;
                    }
                }
                var offsetCandidate = _navigator.GetTokenAtRelativePosition(--index);
                if (IsOffsetFunctionToken(offsetCandidate))
                {
                    _context.ChangeTokenType(TokenType.Function | TokenType.RangeOffset, _navigator.Index + index);
                    if (nextToken.TokenTypeIsSet(TokenType.ExcelAddress))
                    {
                        // OFFSET:A1
                        _context.ChangeTokenType(TokenType.ExcelAddress | TokenType.RangeOffset, _navigator.Index + 1);
                    }
                    else if (IsOffsetFunctionToken(nextToken))
                    {
                        // OFFSET:OFFSET
                        _context.ChangeTokenType(TokenType.Function | TokenType.RangeOffset, _navigator.Index + 1);
                    }
                }
            }
            else if (prevToken.TokenTypeIsSet(TokenType.ExcelAddress) && IsOffsetFunctionToken(nextToken))
            {
                // A1: OFFSET
                _context.ChangeTokenType(TokenType.ExcelAddress | TokenType.RangeOffset, _navigator.Index - 1);
                _context.ChangeTokenType(TokenType.Function | TokenType.RangeOffset, _navigator.Index + 1);
            }
        }