private Token NextOperator()

in src/Parsing/Impl/Tokens/Tokenizer.cs [1693:1838]


        private Token NextOperator(int ch) {
            switch (ch) {
                case '+':
                    if (NextChar('=')) {
                        return Tokens.AddEqualToken;
                    }
                    return Tokens.AddToken;
                case '-':
                    if (NextChar('=')) {
                        return Tokens.SubtractEqualToken;
                    } else if (NextChar('>')) {
                        return Tokens.ArrowToken;
                    }
                    return Tokens.SubtractToken;
                case '*':
                    if (NextChar('=')) {
                        return Tokens.MultiplyEqualToken;
                    }
                    if (NextChar('*')) {
                        if (NextChar('=')) {
                            return Tokens.PowerEqualToken;
                        }
                        return Tokens.PowerToken;
                    }
                    return Tokens.MultiplyToken;
                case '/':
                    if (NextChar('=')) {
                        return Tokens.DivideEqualToken;
                    }
                    if (NextChar('/')) {
                        if (NextChar('=')) {
                            return Tokens.FloorDivideEqualToken;
                        }
                        return Tokens.FloorDivideToken;
                    }
                    return Tokens.DivideToken;
                case '%':
                    if (NextChar('=')) {
                        return Tokens.ModEqualToken;
                    }
                    return Tokens.ModToken;
                case '<':
                    if (LanguageVersion.Is2x() && NextChar('>')) {
                        return Tokens.LessThanGreaterThanToken;
                    }
                    if (NextChar('=')) {
                        return Tokens.LessThanOrEqualToken;
                    }
                    if (NextChar('<')) {
                        if (NextChar('=')) {
                            return Tokens.LeftShiftEqualToken;
                        }
                        return Tokens.LeftShiftToken;
                    }
                    return Tokens.LessThanToken;
                case '>':
                    if (NextChar('>')) {
                        if (NextChar('=')) {
                            return Tokens.RightShiftEqualToken;
                        }
                        return Tokens.RightShiftToken;
                    }
                    if (NextChar('=')) {
                        return Tokens.GreaterThanOrEqualToken;
                    }
                    return Tokens.GreaterThanToken;
                case '&':
                    if (NextChar('=')) {
                        return Tokens.BitwiseAndEqualToken;
                    }
                    return Tokens.BitwiseAndToken;
                case '|':
                    if (NextChar('=')) {
                        return Tokens.BitwiseOrEqualToken;
                    }
                    return Tokens.BitwiseOrToken;
                case '^':
                    if (NextChar('=')) {
                        return Tokens.ExclusiveOrEqualToken;
                    }
                    return Tokens.ExclusiveOrToken;
                case '=':
                    if (NextChar('=')) {
                        return Tokens.EqualsToken;
                    }
                    return Tokens.AssignToken;
                case '!':
                    if (NextChar('=')) {
                        return Tokens.NotEqualsToken;
                    }
                    return BadChar(ch);
                case '(':
                    _state.ParenLevel++;
                    return Tokens.LeftParenthesisToken;
                case ')':
                    if (_state.ParenLevel != 0) {
                        _state.ParenLevel--;
                    }
                    return Tokens.RightParenthesisToken;
                case '[':
                    _state.BracketLevel++;
                    return Tokens.LeftBracketToken;
                case ']':
                    if (_state.BracketLevel != 0) {
                        _state.BracketLevel--;
                    }
                    return Tokens.RightBracketToken;
                case '{':
                    _state.BraceLevel++;
                    return Tokens.LeftBraceToken;
                case '}':
                    if (_state.BraceLevel != 0) {
                        _state.BraceLevel--;
                    }
                    return Tokens.RightBraceToken;
                case ',':
                    return Tokens.CommaToken;
                case ':':
                    if (LanguageVersion >= PythonLanguageVersion.V38 && NextChar('=')) {
                        return Tokens.ColonEqualToken;
                    }
                    return Tokens.ColonToken;
                case '`':
                    if (LanguageVersion.Is2x()) {
                        return Tokens.BackQuoteToken;
                    }
                    break;
                case ';':
                    return Tokens.SemicolonToken;
                case '~':
                    return Tokens.TwiddleToken;
                case '@':
                    if (LanguageVersion >= PythonLanguageVersion.V35) {
                        if (NextChar('=')) {
                            return Tokens.MatMultiplyEqualToken;
                        }
                        if (GroupingLevel > 0) {
                            // @ can't be a decorator here.
                            return Tokens.MatMultiplyToken;
                        }
                    }
                    return Tokens.AtToken;
            }

            return null;
        }