37 {
"def", TokenType::DEF }, {
"let", TokenType::LET },
38 {
"if", TokenType::IF }, {
"then", TokenType::THEN },
39 {
"else", TokenType::ELSE }, {
"import", TokenType::IMPORT },
40 {
"==", TokenType::EQUAL }, {
"!=", TokenType::NOTEQUAL },
41 {
">=", TokenType::GREATEREQUAL }, {
"<=", TokenType::LESSEQUAL },
42 {
"&&", TokenType::AND }, {
"||", TokenType::OR },
43 {
"+", TokenType::PLUS }, {
"-", TokenType::MINUS },
44 {
"*", TokenType::MULTIPLY }, {
"/", TokenType::DIVIDE },
45 {
"(", TokenType::LPAREN }, {
")", TokenType::RPAREN },
46 {
",", TokenType::COMMA }, {
";", TokenType::SEMICOLON },
47 {
"=", TokenType::ASSIGN }, {
">", TokenType::GREATER },
48 {
"<", TokenType::LESS }, {
"!", TokenType::NOT },
51 constexpr static char QUOTE =
'\'';
54 std::string_view _input;
55 std::string_view::const_iterator _pos;
65 , _pos{ _input.begin() }
81 [[nodiscard]] TCALC_INLINE
auto pos() const noexcept {
return _pos; }
88 [[nodiscard]] TCALC_INLINE
auto spos() const noexcept
90 return std::distance(_input.begin(), _pos);
101 template<
typename Pred>
102 auto _next_with(
TokenType type,
const Pred& pred)
104 const auto* start = _pos;
105 while (_pos != _input.end() && pred(*_pos)) {
108 return Token{ type, std::string{ start, _pos } };
116 template<
typename Pred>
117 void _skip_with(
const Pred& pred)
119 while (_pos != _input.end() && pred(*_pos)) {
128 error::Result<Token> _parse_number();
135 error::Result<Token> _parse_quoted_identifier();
144 bool _is_keyword(std::string_view keyword);
153 static bool _is_identifier_char(
char c);
162 static bool _is_first_identifier_char(
char c);
171 static bool _is_skippable_char(
char c);