{ 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 }