-alpha: take one input separated by &

This commit is contained in:
augustin64 2024-04-16 14:24:06 +02:00
parent 39ff2dbffc
commit 0b241c72c4
8 changed files with 19 additions and 14 deletions

View File

@ -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
View File

@ -1,5 +1,6 @@
(executable (executable
(name main)) (name main)
(libraries str))
(ocamllex lexer) (ocamllex lexer)
(menhir (menhir

22
main.ml
View File

@ -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 () =

View File

@ -0,0 +1 @@
fun (x:A) => fun (y:A) => y & fun (u:A) => fun (v:A) => v

View File

@ -1 +0,0 @@
fun (x:A) => x y z

View File

@ -1 +0,0 @@
fun (y:A) => y y z

View File

@ -1 +0,0 @@
fun (a:A) => a y z

View File

@ -0,0 +1 @@
fun (x:A) => x & fun (y:A) => x