{ 
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 }
  | "AVG"       { AVG }
  | "MAX"       { MAX }
  | "MIN"       { MIN }
  | "SUM"       { SUM }
  | "COUNT"     { COUNT }
  | "DISTINCT"  { DISTINCT }
  | "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 }
  | "BETWEEN"   { BETWEEN }
  | "IN"        { IN }
  | "LIKE"      { LIKE }
  | "GROUP"     { GROUP }
  | "BY"        { BY }
  | "*"         { ASTERISK }
  | "."         { DOT }
  | "="         { EQUALS_OPERATOR }
  | "("         { LEFT_PAREN }
  | ")"         { RIGHT_PAREN }
  | ","         { COMMA }
  | "|"         { PIPE }
  | "'"         { QUOTE }
  | "+"         { PLUS_SIGN }
  | "-"         { MINUS_SIGN }
  | whitespace  { read_token lexbuf }
  | digit+      { INTEGER }
  | digit+"."digit+ { FLOAT }
  | '.'digit+   { FLOAT }
  | alpha alphanumeric* as ident      { IDENT ident }
  | eof         { EOF }