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