41 lines
1.8 KiB
OCaml
41 lines
1.8 KiB
OCaml
|
open Ast
|
||
|
open Lexing
|
||
|
open Semantics
|
||
|
|
||
|
let report_error filename lexbuf msg =
|
||
|
let (b,e) = (lexeme_start_p lexbuf, lexeme_end_p lexbuf) in
|
||
|
let fc = b.pos_cnum - b.pos_bol + 1 in
|
||
|
let lc = e.pos_cnum - b.pos_bol + 1 in
|
||
|
Printf.eprintf "File \"%s\", line %d, characters %d-%d: %s\n" filename b.pos_lnum fc lc msg
|
||
|
|
||
|
(* main : string -> valueType *)
|
||
|
(* Analyse le contenu d'un fichier passé en paramètre *)
|
||
|
(* Dans le cas où l'analyse syntaxique s'est bien passée, lance l'analyse sémantique avec un environement d'évaluation initial vide *)
|
||
|
let main fichier =
|
||
|
let input = open_in fichier in
|
||
|
let filebuf = Lexing.from_channel input in
|
||
|
try
|
||
|
let ast = Parser.main Lexer.token filebuf in
|
||
|
let env = [] in
|
||
|
value_of_expr ast env
|
||
|
with
|
||
|
| Lexer.Error s ->
|
||
|
report_error fichier filebuf ("lexical error (" ^ s ^ ").");
|
||
|
exit 2
|
||
|
| Parser.Error ->
|
||
|
report_error fichier filebuf "syntax error.";
|
||
|
exit 2
|
||
|
|
||
|
let%test _ = ( (main "../../exemples/exemple-00.mml") = (IntegerValue 3))
|
||
|
let%test _ = ( (main "../../exemples/exemple-01.mml") = (IntegerValue (-8)))
|
||
|
let%test _ = ( (main "../../exemples/exemple-02.mml") = (IntegerValue 4))
|
||
|
let%test _ = ( (main "../../exemples/exemple-03.mml") = (IntegerValue 5))
|
||
|
let%test _ = ( (main "../../exemples/exemple-04.mml") = (IntegerValue 1))
|
||
|
let%test _ = ( (main "../../exemples/exemple-05.mml") = (IntegerValue 2))
|
||
|
let%test _ = ( (main "../../exemples/exemple-06.mml") = (IntegerValue 120))
|
||
|
let%test _ = ( (main "../../exemples/exemple-07.mml") = (IntegerValue 10))
|
||
|
let%test _ = ( (main "../../exemples/exemple-08.mml") = (IntegerValue 5))
|
||
|
let%test _ = ( (main "../../exemples/exemple-09.mml") = (FrozenValue (FunctionNode ("x",AccessNode "x"),[])))
|
||
|
let%test _ = ( (main "../../exemples/exemple-11.mml") = (IntegerValue 120))
|
||
|
let%test _ = ( (main "../../exemples/exemple-12.mml") = (IntegerValue 120))
|