#ifndef TOKENS_H
#define TOKENS_H

#include <stdint.h>

enum {
  TOK_ERR, TOK_EOF, TOK_NUMBER, TOK_STRING, TOK_SEMICOLON, TOK_BIGINT,
  TOK_LPAREN, TOK_RPAREN, TOK_LBRACE, TOK_RBRACE, TOK_LBRACKET, TOK_RBRACKET,
  
  // identifier-like
  TOK_IDENTIFIER = 50,
  TOK_ASYNC, TOK_AWAIT, TOK_BREAK, TOK_CASE, TOK_CATCH, TOK_CLASS, TOK_CONST, TOK_CONTINUE,
  TOK_DEFAULT, TOK_DELETE, TOK_DO, TOK_DEBUGGER, TOK_ELSE, TOK_EXPORT, TOK_FINALLY, TOK_FOR, 
  TOK_FROM, TOK_FUNC, TOK_IF, TOK_IMPORT, TOK_IN, TOK_INSTANCEOF, TOK_LET, TOK_NEW, TOK_OF, 
  TOK_RETURN, TOK_SUPER, TOK_SWITCH, TOK_THIS, TOK_THROW, TOK_TRY, TOK_VAR, TOK_VOID, TOK_WHILE, TOK_WITH,
  TOK_YIELD, TOK_UNDEF, TOK_NULL, TOK_TRUE, TOK_FALSE, TOK_AS, TOK_STATIC, TOK_TYPEOF, TOK_USING,
  TOK_WINDOW, TOK_GLOBAL_THIS,
  TOK_IDENT_LIKE_END,
  
  // operators
  TOK_DOT = 100, TOK_CALL, TOK_BRACKET, TOK_POSTINC, TOK_POSTDEC, TOK_NOT, TOK_TILDA,
  TOK_UPLUS, TOK_UMINUS, TOK_EXP, TOK_MUL, TOK_DIV, TOK_REM,
  TOK_OPTIONAL_CHAIN, TOK_REST,
  TOK_PLUS, TOK_MINUS, TOK_SHL, TOK_SHR, TOK_ZSHR, TOK_LT, TOK_LE, TOK_GT,
  TOK_GE, TOK_EQ, TOK_NE, TOK_SEQ, TOK_SNE, TOK_AND, TOK_XOR, TOK_OR, TOK_LAND, TOK_LOR, TOK_NULLISH,
  TOK_COLON, TOK_Q, TOK_ASSIGN, TOK_PLUS_ASSIGN, TOK_MINUS_ASSIGN,
  TOK_MUL_ASSIGN, TOK_DIV_ASSIGN, TOK_REM_ASSIGN, TOK_SHL_ASSIGN,
  TOK_SHR_ASSIGN, TOK_ZSHR_ASSIGN, TOK_AND_ASSIGN, TOK_XOR_ASSIGN,
  TOK_OR_ASSIGN, TOK_EXP_ASSIGN, TOK_LOR_ASSIGN, TOK_LAND_ASSIGN, TOK_NULLISH_ASSIGN,
  TOK_COMMA, TOK_TEMPLATE, TOK_ARROW, TOK_HASH,
  TOK_MAX
};

static const uint8_t prec_table[TOK_MAX] = {
  [TOK_LOR]        = 4,
  [TOK_LAND]       = 5,
  [TOK_NULLISH]    = 5,
  [TOK_OR]         = 6,
  [TOK_XOR]        = 7,
  [TOK_AND]        = 8,
  [TOK_EQ]         = 9,  [TOK_NE]  = 9,  [TOK_SEQ] = 9,  [TOK_SNE] = 9,
  [TOK_LT]         = 10, [TOK_LE]  = 10, [TOK_GT]  = 10, [TOK_GE]  = 10,
  [TOK_INSTANCEOF] = 10, [TOK_IN]  = 10,
  [TOK_SHL]        = 11, [TOK_SHR] = 11, [TOK_ZSHR] = 11,
  [TOK_PLUS]       = 12, [TOK_MINUS] = 12,
  [TOK_MUL]        = 13, [TOK_DIV] = 13, [TOK_REM] = 13,
  [TOK_EXP]        = 14,
};

#endif
