{
  open Lexing
  open Parser
   
  exception Lexing_error of string
    
  let kwd_tbl = ["let",LET ;"in",IN ;"set",SET;"print",PRINT]
  let id_or_kwd s =  try List.assoc s kwd_tbl with _ -> IDENT(s) 
      
}

let letter = ['a'-'z' 'A'-'Z']
let digit = ['0'-'9']
let ident = letter (letter | digit)*
let integer = ['0'-'9']+
let space = [' ' '\t' '\n']


rule nexttoken = parse
    space+  { nexttoken lexbuf }
  | ident   { id_or_kwd (lexeme lexbuf) }
  | '+'     { PLUS }
  | '-'     { MINUS }
  | '*'     { TIMES }
  | '/'     { DIV }
  | '='     { EQ }
  | '('     { LP }
  | ')'     { RP }
  | integer { CST (int_of_string (lexeme lexbuf)) }
  | eof     { EOF }
  | _       { raise (Lexing_error (lexeme lexbuf)) }