Skip to content
Snippets Groups Projects
Commit f13adb30 authored by Augustin Jaujay's avatar Augustin Jaujay
Browse files

Question 10 pointeur

parent cbf51388
Branches
Tags
No related merge requests found
open BasicExpr
open FunExpr
open Utils
(* The main function *)
......@@ -10,7 +10,7 @@ let parse_eval file =
begin
try
let expr_prog = Parser.expression Lexer.token lexbuf in
let pfx_prog = 0, ToPfx.generate expr_prog in
let pfx_prog = 0, ToPfx.generate (ref []) expr_prog in
print_endline (BasicPfx.Ast.string_of_program pfx_prog);
BasicPfx.Eval.eval_program pfx_prog []
with
......
open Ast
open BasicPfx.Ast
let increment env = List.map (fun (name, v) -> (name, v+1)) env
let increment env = env := (List.map (fun (name, v) -> (name, v+1)) !env)
let add_var var env = env := (var, 0)::(!env)
let rec generate env = function
| Const x -> [Push x]
| Const x -> increment env; [Push x]
| Binop(Badd,a,b) -> (generate env b) @ (generate env a) @ [Add]
| Binop(Bsub,a,b) -> (generate env b) @ (generate env a) @ [Sub]
| Binop(Bmul,a,b) -> (generate env b) @ (generate env a) @ [Mul]
| Binop(Bdiv,a,b) -> (generate env b) @ (generate env a) @ [Div]
| Binop(Bmod,a,b) -> (generate env b) @ (generate env a) @ [Rem]
| App(Fun(v, t), arg) -> (generate env arg) @ generate ((v, 1)::env) t
| Uminus x -> (generate env x) @ [Push 0] @ [Sub]
| Var x -> [Push (List.assoc x env); Get]
| App(Fun(v, t), arg) -> (add_var v env); (generate env arg) @ [InstructionSeq (generate env t); Exec]
| Uminus x -> increment env; (generate env x) @ [Push 0] @ [Sub]
| Var x -> increment env; [Push ((List.assoc x !env) - 1); Get]
| _ -> []
(* Il faut incrémenter env à chaque Push
Pistes: disjonction de cas pour les Binop où quand on reconnait
......
(* Function that generate a Pfx program from an Expr program *)
val generate : Ast.expression -> BasicPfx.Ast.command list
val generate : (string * int) list ref -> Ast.expression -> BasicPfx.Ast.command list
......@@ -5,7 +5,7 @@ type program = int * command list
(* Add here all useful functions and types related to the AST: for instance string_of_ functions *)
let string_of_command = function
let rec string_of_command = function
| Push x -> "Push " ^ string_of_int x
| Pop -> "Pop"
| Swap -> "Swap"
......@@ -16,7 +16,7 @@ let string_of_command = function
| Rem -> "Rem"
| Exec -> "Exec"
| Get -> "Get"
| InstructionSeq _ -> "Instruction sequence"
| InstructionSeq s -> "[" ^ String.concat " " (List.map string_of_command s) ^ "]"
let string_of_commands cmds = String.concat " " (List.map string_of_command cmds)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment