{ let ligne = ref 1 let kw = Hashtbl.create 23 let enter_kw = List.iter (fun k -> Hashtbl.add kw k ()) ["int";"bool";"unit";"if";"then";"else";"true";"false";"not";"void"; "while";"do";"program";"function";"var";"array";"return";"ref"; "of";"begin";"end"] let est_id id = not (Hashtbl.mem kw id) 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 decls_fun = Hashtbl.create 17 let decls_var = Hashtbl.create 17 let decls_par = Hashtbl.create 17 let util_fun = Hashtbl.create 17 let util_val = Hashtbl.create 17 *) } let alpha = ['A'-'Z''a'-'z'] let carid = alpha | ['0'-'9''\'''_'] let ident = alpha (carid)* let blanc = ['\t'' '] let nl = '\n' rule index = parse | blanc * {index lexbuf} | "(*" {comment lexbuf; index lexbuf} | nl {incr ligne; index lexbuf} | "program" {ident lexbuf; index lexbuf} | "var" {variable lexbuf; index lexbuf} | "function" {fonction lexbuf; index lexbuf } | ident {let id = Lexing.lexeme lexbuf in if est_id id then ajoute utils id !ligne; index lexbuf} | _ {index lexbuf} | eof {print decls "Declarations"; print utils "Utilisations"} and ident = parse blanc * {ident lexbuf} | "(*" {comment lexbuf; ident lexbuf} | nl {incr ligne; ident lexbuf} | ident {()} and variable = parse | blanc * {variable lexbuf} | "(*" {comment lexbuf; variable lexbuf} | nl {incr ligne; variable lexbuf} | ident {let id = Lexing.lexeme lexbuf in ajoute decls id !ligne; variable lexbuf} | ':' {()} | _ {variable lexbuf} and fonction = parse | blanc * {fonction lexbuf} | "(*" {comment lexbuf; fonction lexbuf} | nl {incr ligne; fonction lexbuf} | ident {let id = Lexing.lexeme lexbuf in ajoute decls id !ligne; parametres lexbuf} and parametres = parse | blanc * {parametres lexbuf} | "(*" {comment lexbuf; parametres lexbuf} | nl {incr ligne; parametres lexbuf} | ident {let id = Lexing.lexeme lexbuf in if est_id id then ajoute decls id !ligne; parametres lexbuf} | ')' {()} | _ {parametres lexbuf} and comment = parse "(*" {comment lexbuf; comment lexbuf;} | "*)" {()} | nl {incr ligne; comment lexbuf} | _ {comment lexbuf} | eof {failwith "Commentaire non ferme"} { let fichier = "essai" let file = open_in fichier let lexbuf = Lexing.from_channel file let _ = index lexbuf }