#ifndef TOKEN_CC #define TOKEN_CC #include #include "common.cc" #include "source.cc" #define TOKEN_KINDS_NOLEX \ X(Invalid_Char) \ X(Invalid_Literal) \ X(Identifier) #define TOKEN_KINDS_SLEX \ X(Hash, '#') \ X(LBrace, '{') \ X(RBrace, '}') \ X(LParen, '(') \ X(RParen, ')') \ X(LBracket, '[') \ X(RBracket, ']') #define TOKEN_KIND(name) Token_Kind_##name enum Token_Kind : u8 { #define X(name) TOKEN_KIND(name), TOKEN_KINDS_NOLEX #undef X #define X(name, _) TOKEN_KIND(name), TOKEN_KINDS_SLEX #undef X }; struct Token { Token_Kind kind; String text; Span span; Token() : kind(Token_Kind_Invalid_Char), text(), span() {} Token(Token_Kind kind, String text, Span span) : kind(kind), text(text), span(span) {} }; bool token_write(const Token* token, FILE* stream) { assert_neq(token, nullptr); assert_neq(stream, nullptr); i32 rc = fprintf(stream, "Token { kind: %d, text: ", token->kind); if (unlikely(rc < 0)) return false; bool status = string_write(&token->text, stream); if (unlikely(!status)) return false; rc = fprintf(stream, ", span: "); if (unlikely(rc < 0)) return false; status = span_write(&token->span, stream); if (unlikely(!status)) return false; rc = fprintf(stream, " }"); if (unlikely(rc < 0)) return false; return true; } #endif