Guest User

Untitled

a guest
Dec 31st, 2012
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.31 KB | None | 0 0
  1. (* ast.mli *)
  2.  
  3. open Format
  4. open Lexing
  5. open Lexer
  6. open Parser
  7. open Ast
  8.  
  9. let rec printexpr expr = match expr with
  10.   |Int(i) -> Printf.printf "%d" i
  11.   |Var(c) -> Printf.printf "%s" c
  12.   |BinOp(exp1,c,exp2) -> printexpr exp1; Printf.printf "%s" c; printexpr exp2
  13.   |UniOp(c,exp1) -> Printf.printf "%s" c; printexpr exp1
  14.   |Call(c, e::q) -> begin Printf.printf "%s(" c;
  15.         while ((e::q) != []) do
  16.           printexpr e;
  17.           printexpr (Call(",", q));
  18.         done;
  19.         Printf.printf ")"
  20.       end
  21.   |Call(_,[]) -> Printf.printf ")"
  22.  
  23. let rec printstat stat = match stat with
  24.   |Assign(c,expr) -> Printf.printf "%s" c; printexpr expr
  25.   |Expr(expr) -> printexpr expr
  26.   |If(expr, sl1, sl2) -> Printf.printf "if ("; printexpr expr; Printf.printf ") \n {";
  27.     for i = 0 to (List.length sl1) - 1 do
  28.       printstat (List.nth sl1 i)
  29.     done;
  30.     if (sl2 <> []) then
  31.       Printf.printf "}\n else \n {\n";
  32.     for i = 0 to (List.length sl2) - 1 do
  33.       printstat (List.nth sl2 i)
  34.     done;
  35.     Printf.printf "} \n\n"
  36.   |While(expr, sl) -> Printf.printf "while ("; printexpr expr; Printf.printf ") \n {";
  37.     for i = 0 to (List.length sl) - 1 do
  38.       printstat (List.nth sl i)
  39.     done;
  40.     Printf.printf "}"
  41.   |Return(expr) -> printexpr expr
  42.  
  43. let rec printbody sl = match sl with
  44.   |[] -> ()
  45.   |s::[] -> printstat s
  46.   |s::q -> printstat s; Printf.printf "; \n"; printbody q
  47.  
  48. let rec printfparams l = match l with
  49.   |[] -> ()
  50.   |e::[] -> Printf.printf "%s)" e
  51.   |e::q -> Printf.printf "%s," e; printfparams q
  52.  
  53. let rec printvars l = match l with
  54.   |[] -> ()
  55.   |e::[] -> Printf.printf "%s; \n" e
  56.   |e::q -> Printf.printf "%s," e; printvars q
  57.  
  58. let printfunc fct =
  59.   Printf.printf "%s(" fct.fname;
  60.   printfparams fct.fparams;
  61.   Printf.printf "\n { vars ";
  62.   printvars fct.fvars;
  63.   printbody fct.fbody;
  64.   Printf.printf " }"
  65.  
  66. let printmain ent =
  67.   Printf.printf "main () \n { vars";
  68.   printvars ent.mainvars;
  69.   printbody ent.mainbody;
  70.   Printf.printf " }"
  71.  
  72. let prettyprint ast =
  73.   for i = 0 to (List.length ast.func) - 1 do
  74.     printfunc (List.nth ast.func i)
  75.   done;
  76.   printmain ast.main
  77.  
  78. let main () =
  79.   begin
  80.     let cin = open_in "ex01.bl" in
  81.     let ast =
  82.       Parser.prg Lexer.token (Lexing.from_channel cin)
  83.     in
  84.     prettyprint ast;
  85.     exit 0;
  86.   end
  87.  
  88. let _ = main ()
Advertisement
Add Comment
Please, Sign In to add comment