{ 
open Parser
}

let whitespace = [' ' '\t']+
let digit = ['0'-'9']
let alpha = ['a'-'z' 'A'-'Z' '_']
let alphanumeric = (alpha|digit)

rule read_token = parse
  | "SELECT"                      { SELECT }
  | "AS"                          { AS }
  | "DATE"                        { DATE }
  | "TIME"                        { TIME }
  | "AVG"                         { AVG }
  | "MAX"                         { MAX }
  | "MIN"                         { MIN }
  | "SUM"                         { SUM }
  | "COUNT"                       { COUNT }
  | "DISTINCT"                    { DISTINCT }
  | "SUBSTRING"                   { SUBSTRING }
  | "FROM"                        { FROM }
  | "INNER"                       { INNER }
  | "LEFT"                        { LEFT }
  | "RIGHT"                       { RIGHT }
  | "CROSS"                       { CROSS }
  | "UNION"                       { UNION }
  | "NATURAL"                     { NATURAL }
  | "JOIN"                        { JOIN }
  | "ON"                          { ON }
  | "OR"                          { OR }
  | "AND"                         { AND }
  | "WHERE"                       { WHERE }
  | "HAVING"                      { HAVING }
  | "NOT"                         { NOT }
  | "BETWEEN"                     { BETWEEN }
  | "IN"                          { IN }
  | "LIKE"                        { LIKE }
  | "GROUP"                       { GROUP }
  | "BY"                          { BY }
  | "*"                           { ASTERISK }
  | "="                           { EQUALS_OPERATOR }
  | "("                           { LEFT_PAREN }
  | ")"                           { RIGHT_PAREN }
  | ','                           { COMMA }
  | "|"                           { PIPE }
  | "'"                           { QUOTE }
  | "+"                           { PLUS_SIGN }
  | "-"                           { MINUS_SIGN }
  | ':'                           { COLON }
  | whitespace                    { read_token lexbuf }
  | digit+ as integer             { INTEGER (int_of_string integer) }
  | digit+"."digit+ as number     { FLOAT (float_of_string number) }
  | '.'digit+ as number           { FLOAT (float_of_string number) }
  | alpha alphanumeric* as ident  { IDENT ident }
  | eof                           { EOF }