-alpha: take one input separated by &
This commit is contained in:
parent
39ff2dbffc
commit
0b241c72c4
3
Makefile
3
Makefile
@ -2,3 +2,6 @@ pieuvre: main.ml lam.ml affichage.ml lexer.mll parser.mly
|
|||||||
dune build
|
dune build
|
||||||
cp _build/default/main.exe pieuvre
|
cp _build/default/main.exe pieuvre
|
||||||
chmod +w pieuvre
|
chmod +w pieuvre
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf _build pieuvre
|
||||||
|
3
dune
3
dune
@ -1,5 +1,6 @@
|
|||||||
(executable
|
(executable
|
||||||
(name main))
|
(name main)
|
||||||
|
(libraries str))
|
||||||
|
|
||||||
(ocamllex lexer)
|
(ocamllex lexer)
|
||||||
(menhir
|
(menhir
|
||||||
|
22
main.ml
22
main.ml
@ -15,7 +15,7 @@ let interpret e =
|
|||||||
end
|
end
|
||||||
|
|
||||||
let nom_fichier = ref ""
|
let nom_fichier = ref ""
|
||||||
let equiv_fichier = ref ""
|
let alpha = ref false
|
||||||
|
|
||||||
let parse_channel c =
|
let parse_channel c =
|
||||||
let lexbuf = Lexing.from_channel c in
|
let lexbuf = Lexing.from_channel c in
|
||||||
@ -23,7 +23,7 @@ let parse_channel c =
|
|||||||
|
|
||||||
let recupere_entree () =
|
let recupere_entree () =
|
||||||
let optlist = [
|
let optlist = [
|
||||||
("-alphaequiv", Arg.Set_string equiv_fichier, "Vérifie l'alpha équivalence avec un autre fichier");
|
("-alpha", Arg.Set alpha, "Vérifie l'alpha équivalence de deux termes séparés par &");
|
||||||
] in
|
] in
|
||||||
|
|
||||||
let usage = "Bienvenue à bord." in (* message d'accueil, option -help *)
|
let usage = "Bienvenue à bord." in (* message d'accueil, option -help *)
|
||||||
@ -34,18 +34,20 @@ let recupere_entree () =
|
|||||||
(fun s -> nom_fichier := s) (* la fonction a declencher lorsqu'on recupere un string qui n'est pas une option : ici c'est le nom du fichier, et on stocke cette information dans la reference nom_fichier *)
|
(fun s -> nom_fichier := s) (* la fonction a declencher lorsqu'on recupere un string qui n'est pas une option : ici c'est le nom du fichier, et on stocke cette information dans la reference nom_fichier *)
|
||||||
usage; (* le message d'accueil *)
|
usage; (* le message d'accueil *)
|
||||||
|
|
||||||
let lam1 = try
|
try
|
||||||
let where_from = match !nom_fichier with
|
let where_from = match !nom_fichier with
|
||||||
| "" -> stdin
|
| "" -> stdin
|
||||||
| s -> open_in s in
|
| s -> open_in s in
|
||||||
parse_channel where_from
|
if !alpha then
|
||||||
|
let input_str = In_channel.input_all where_from in
|
||||||
|
match Str.split (Str.regexp "&") input_str with
|
||||||
|
[s1; s2] -> AlphaEquiv (
|
||||||
|
Parser.main Lexer.token (Lexing.from_string (s1^"\n")),
|
||||||
|
Parser.main Lexer.token (Lexing.from_string s2)
|
||||||
|
)
|
||||||
|
| _ -> failwith "Alpha-equivalence: nombre de delimiteurs incorrect"
|
||||||
|
else Simple (parse_channel where_from)
|
||||||
with e -> (Printf.printf "problème de saisie\n"; raise e)
|
with e -> (Printf.printf "problème de saisie\n"; raise e)
|
||||||
in if !equiv_fichier <> "" then
|
|
||||||
let lam2 = try parse_channel (open_in !equiv_fichier)
|
|
||||||
with e -> (Printf.printf "problème de saisie\n"; raise e)
|
|
||||||
in AlphaEquiv (lam1, lam2)
|
|
||||||
else Simple lam1
|
|
||||||
|
|
||||||
|
|
||||||
(* la fonction principale *)
|
(* la fonction principale *)
|
||||||
let run () =
|
let run () =
|
||||||
|
1
tests/alpha_equiv/basic.lam
Normal file
1
tests/alpha_equiv/basic.lam
Normal file
@ -0,0 +1 @@
|
|||||||
|
fun (x:A) => fun (y:A) => y & fun (u:A) => fun (v:A) => v
|
@ -1 +0,0 @@
|
|||||||
fun (x:A) => x y z
|
|
@ -1 +0,0 @@
|
|||||||
fun (y:A) => y y z
|
|
@ -1 +0,0 @@
|
|||||||
fun (a:A) => a y z
|
|
1
tests/alpha_equiv/portee.lam
Normal file
1
tests/alpha_equiv/portee.lam
Normal file
@ -0,0 +1 @@
|
|||||||
|
fun (x:A) => x & fun (y:A) => x
|
Loading…
Reference in New Issue
Block a user