open Format
open Lexing

(* A UTILISER avec la ligne suivante dans le répertoire _build (compilé en
 * bytcode !) *)
(*ocaml parser2.cmo parser.cmo lexer.cmo typing.cmo opt.cmo defunc.cmo < ../test.ml*)


(* Option de compilation, pour s'arrêter à l'issue du parser *)
let parse_only = ref false

let ifile = ref "../test/exec2/recT2.ml"

(* localise une erreur en indiquant la ligne et la colonne *)
let localisation pos =
  let l = pos.pos_lnum in
  let c = pos.pos_cnum - pos.pos_bol + 1 in
  eprintf "File \"%s\", line %d, characters %d-%d:\n" !ifile l (c-1) c

let p = 
  let f = open_in !ifile in
  let buf = Lexing.from_channel f in
  try
      (* Parsing: la fonction  Parser.prog transforme le tampon lexical en un 
       arbre de syntaxe abstraite si aucune erreur (lexicale ou syntaxique) 
       n'est détectée.
       La fonction Lexer.token est utilisée par Parser.prog pour obtenir 
       le prochain token. *)
    let p = Parser.prog Lexer.token buf in
    close_in f;
    
    (* On s'arrête ici si on ne veut faire que le parsing *)
    if !parse_only then exit 0;

    (* On type maintenant *)
    let p = Typing.typing_program p in

    (* Maintenant on produit le code *)
    let p = Defunc.defunc_prog p in

    (* On optimise *)
    let p = Opt.opt_prog p in
    
    p
  with
    | Lexer.Lexing_error c -> 
	(* Erreur lexicale. On récupère sa position absolue et 
	   on la convertit en numéro de ligne *)
	localisation (Lexing.lexeme_start_p buf);
	eprintf "Erreur dans l'analyse lexicale: %c@." c;
        []
    | Parser.Error -> 
	(* Erreur syntaxique. On récupère sa position absolue et on la 
	   convertit en numéro de ligne *)
	localisation (Lexing.lexeme_start_p buf);
	eprintf "Erreur dans l'analyse syntaxique@.";
        []
;;
