{ let keywords = ["int";"bool";"unit";"if";"then";"else";"true";"false";"not";"void"; "while";"do";"program";"function";"var";"array";"return";"ref"; "of";"begin";"end"] (* les tables de déclarations et d'utilisations seront des tables de hachage qui à un identifiant associe une liste d'entiers *) let ajoute_num num l = if List.hd l = num then l else num::l let ajoute tbl id num = if Hashtbl.mem tbl id then let l= Hashtbl.find tbl id in Hashtbl.remove tbl id; Hashtbl.add tbl id (ajoute_num num l) else Hashtbl.add tbl id [num] let rec print_numlist = function | [num] -> print_int num; print_newline() | num::l -> print_int num; print_string ", "; print_numlist l | _ -> assert false let print tbl s = print_string s; print_newline(); Hashtbl.iter (fun id l -> print_string id; print_string " : "; print_numlist l) tbl let decls = Hashtbl.create 17 let utils = Hashtbl.create 17 } let blanc = ['\t'' '] let nl = '\n' rule index = parse | blanc * {index lexbuf} | eof {print decls "Declarations"; print utils "Utilisations"} | _ {index lexbuf} { let fichier = "test.p" let file = open_in fichier let lexbuf = Lexing.from_channel file let _ = index lexbuf }