///|
enum TokenKind {
  Eof
  Identifier(String)
  Number(String)
  StringLiteral(String)
  True
  False
  Null
  In
  And
  Or
  Bang
  EqualEqual
  BangEqual
  Less
  LessEqual
  Greater
  GreaterEqual
  Plus
  Minus
  Star
  Slash
  Percent
  LeftParen
  RightParen
  LeftBracket
  RightBracket
  Comma
  Dot
  QuestionDot
  QuestionLeftBracket
} derive(Eq, Debug)

///|
struct Token {
  kind : TokenKind
  span : Span
} derive(Eq, Debug)

///|
fn Token::new(kind : TokenKind, start : Int, end : Int) -> Token {
  { kind, span: Span::new(start, end) }
}