private void NextToken()

in src/extensions/template_extension/ExpressionCalculator.cs [537:670]


        private void NextToken()
        {
            _position = _nextPosition;
            if (_nextPosition >= _expression.Length)
            {
                _tokenType = TokenType.Eos;
            }
            else
            {
                if (char.IsLetter(_expression[_nextPosition]) || _expression[_nextPosition] == '_')
                {
                    while (_nextPosition < _expression.Length &&
                           (char.IsLetter(_expression[_nextPosition]) ||
                            char.IsDigit(_expression[_nextPosition]) ||
                            _expression[_nextPosition] == '_'))
                    {
                        _nextPosition++;
                    }

                    _token = _expression.Substring(_position, _nextPosition - _position);
                    _tokenType = _token.ToUpper() switch
                    {
                        "MOD" => TokenType.Mod,
                        "DIV" => TokenType.Div,
                        "TRUE" => TokenType.Bool,
                        "FALSE" => TokenType.Bool,
                        _ => TokenType.Identifier,
                    };

                    SkipWhiteSpace();
                }
                else if (char.IsDigit(_expression[_position]) || _expression[_position] == '.')
                {
                    while (_nextPosition < _expression.Length && (char.IsDigit(_expression[_nextPosition]) || _expression[_nextPosition] == '.'))
                    {
                        _nextPosition++;
                    }

                    _token = _expression.Substring(_position, _nextPosition - _position);
                    _tokenType = TokenType.Number;
                    SkipWhiteSpace();
                }
                else if (_expression[_position] == '"')
                {
                    _nextPosition++;
                    while (_nextPosition < _expression.Length && _expression[_nextPosition] != '"')
                    {
                        _nextPosition++;
                    }
                    if (_nextPosition >= _expression.Length)
                    {
                        throw new CalcException("Expected closing quote", _position);
                    }

                    _token = _expression.Substring(_position + 1, _nextPosition - _position - 1);
                    _nextPosition++;
                    _tokenType = TokenType.String;
                    SkipWhiteSpace();
                }
                else if (_expression.Substring(_nextPosition).StartsWith("&&"))
                {
                    _tokenType = TokenType.LogicalAnd;
                    _token = "&&";
                    _nextPosition += 2;
                    SkipWhiteSpace();
                }
                else if (_expression.Substring(_nextPosition).StartsWith("||"))
                {
                    _tokenType = TokenType.LogicalOr;
                    _token = "||";
                    _nextPosition += 2;
                    SkipWhiteSpace();
                }
                else
                {
                    switch (_expression[_nextPosition])
                    {
                        case '=':
                            _tokenType = TokenType.Equal;
                            break;
                        case '+':
                            _tokenType = TokenType.Plus;
                            break;
                        case '-':
                            _tokenType = TokenType.Minus;
                            break;
                        case '*':
                            if (_nextPosition + 1 < _expression.Length &&
                                _expression[_nextPosition + 1] == '*')
                            {
                                _tokenType = TokenType.Power;
                                _nextPosition++;
                            }
                            else
                            {
                                _tokenType = TokenType.Times;
                            }
                            break;
                        case '/':
                            _tokenType = TokenType.Divide;
                            break;
                        case '(':
                            _tokenType = TokenType.OpenParen;
                            break;
                        case ')':
                            _tokenType = TokenType.CloseParen;
                            break;
                        case ',':
                            _tokenType = TokenType.Comma;
                            break;
                        case '!':
                            _tokenType = TokenType.LogicalNot;
                            break;
                        case '~':
                            _tokenType = TokenType.BitwiseNot;
                            break;
                        case '&':
                            _tokenType = TokenType.BitwiseAnd;
                            break;
                        case '^':
                            _tokenType = TokenType.Power;
                            break;
                        case '|':
                            _tokenType = TokenType.BitwiseOr;
                            break;
                        default:
                            throw UnexpectedCharacterCalcException(_nextPosition);
                    }
                    _token = _expression.Substring(_position, _nextPosition - _position);
                    _nextPosition++;
                    SkipWhiteSpace();
                }
            }
        }