Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (* ast.mli *)
- open Format
- open Lexing
- open Lexer
- open Parser
- open Ast
- let rec printexpr expr = match expr with
- |Int(i) -> Printf.printf "%d" i
- |Var(c) -> Printf.printf "%s" c
- |BinOp(exp1,c,exp2) -> printexpr exp1; Printf.printf "%s" c; printexpr exp2
- |UniOp(c,exp1) -> Printf.printf "%s" c; printexpr exp1
- |Call(c, e::q) -> begin Printf.printf "%s(" c;
- while ((e::q) != []) do
- printexpr e;
- printexpr (Call(",", q));
- done;
- Printf.printf ")"
- end
- |Call(_,[]) -> Printf.printf ")"
- let rec printstat stat = match stat with
- |Assign(c,expr) -> Printf.printf "%s" c; printexpr expr
- |Expr(expr) -> printexpr expr
- |If(expr, sl1, sl2) -> Printf.printf "if ("; printexpr expr; Printf.printf ") \n {";
- for i = 0 to (List.length sl1) - 1 do
- printstat (List.nth sl1 i)
- done;
- if (sl2 <> []) then
- Printf.printf "}\n else \n {\n";
- for i = 0 to (List.length sl2) - 1 do
- printstat (List.nth sl2 i)
- done;
- Printf.printf "} \n\n"
- |While(expr, sl) -> Printf.printf "while ("; printexpr expr; Printf.printf ") \n {";
- for i = 0 to (List.length sl) - 1 do
- printstat (List.nth sl i)
- done;
- Printf.printf "}"
- |Return(expr) -> printexpr expr
- let rec printbody sl = match sl with
- |[] -> ()
- |s::[] -> printstat s
- |s::q -> printstat s; Printf.printf "; \n"; printbody q
- let rec printfparams l = match l with
- |[] -> ()
- |e::[] -> Printf.printf "%s)" e
- |e::q -> Printf.printf "%s," e; printfparams q
- let rec printvars l = match l with
- |[] -> ()
- |e::[] -> Printf.printf "%s; \n" e
- |e::q -> Printf.printf "%s," e; printvars q
- let printfunc fct =
- Printf.printf "%s(" fct.fname;
- printfparams fct.fparams;
- Printf.printf "\n { vars ";
- printvars fct.fvars;
- printbody fct.fbody;
- Printf.printf " }"
- let printmain ent =
- Printf.printf "main () \n { vars";
- printvars ent.mainvars;
- printbody ent.mainbody;
- Printf.printf " }"
- let prettyprint ast =
- for i = 0 to (List.length ast.func) - 1 do
- printfunc (List.nth ast.func i)
- done;
- printmain ast.main
- let main () =
- begin
- let cin = open_in "ex01.bl" in
- let ast =
- Parser.prg Lexer.token (Lexing.from_channel cin)
- in
- prettyprint ast;
- exit 0;
- end
- let _ = main ()
Advertisement
Add Comment
Please, Sign In to add comment