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); } }