// Escribe los tokens de un texto, uno por línea: línea:columna, tipo y texto.
#include <stdio.h>

#include "lexer.h"

static const char *kind_name(TokenKind kind) {
    switch (kind) {
        case TOKEN_NUMBER: return "NUMBER";
        case TOKEN_NAME: return "NAME";
        case TOKEN_LET: return "LET";
        case TOKEN_PRINT: return "PRINT";
        case TOKEN_DEF: return "DEF";
        case TOKEN_IF: return "IF";
        case TOKEN_THEN: return "THEN";
        case TOKEN_ELSE: return "ELSE";
        case TOKEN_PLUS: return "PLUS";
        case TOKEN_MINUS: return "MINUS";
        case TOKEN_STAR: return "STAR";
        case TOKEN_SLASH: return "SLASH";
        case TOKEN_LPAREN: return "LPAREN";
        case TOKEN_RPAREN: return "RPAREN";
        case TOKEN_COMMA: return "COMMA";
        case TOKEN_ASSIGN: return "ASSIGN";
        case TOKEN_LESS: return "LESS";
        case TOKEN_LESS_EQUAL: return "LESS_EQUAL";
        case TOKEN_GREATER: return "GREATER";
        case TOKEN_GREATER_EQUAL: return "GREATER_EQUAL";
        case TOKEN_EQUAL: return "EQUAL";
        case TOKEN_NOT_EQUAL: return "NOT_EQUAL";
        case TOKEN_END: return "END";
        case TOKEN_ERROR: return "ERROR";
    }
    return "?";
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "uso: %s 'texto'\n", argv[0]);
        return 1;
    }
    Lexer *lexer = lexer_new(argv[1]);
    if (lexer == NULL) {
        fprintf(stderr, "no hay memoria\n");
        return 1;
    }
    Token token;
    do {
        token = lexer_next(lexer);
        printf("%d:%-3d %-14s %s\n", token.line, token.column, kind_name(token.kind), token.text);
    } while (token.kind != TOKEN_END);
    lexer_free(lexer);
    return 0;
}
