~ubuntu-branches/ubuntu/quantal/llvm-3.1/quantal

« back to all changes in this revision

Viewing changes to examples/OCaml-Kaleidoscope/Chapter5/toplevel.ml

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2012-03-29 19:09:51 UTC
  • Revision ID: package-import@ubuntu.com-20120329190951-aq83ivog4cg8bxun
Tags: upstream-3.1~svn153643
ImportĀ upstreamĀ versionĀ 3.1~svn153643

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
(*===----------------------------------------------------------------------===
 
2
 * Top-Level parsing and JIT Driver
 
3
 *===----------------------------------------------------------------------===*)
 
4
 
 
5
open Llvm
 
6
open Llvm_executionengine
 
7
 
 
8
(* top ::= definition | external | expression | ';' *)
 
9
let rec main_loop the_fpm the_execution_engine stream =
 
10
  match Stream.peek stream with
 
11
  | None -> ()
 
12
 
 
13
  (* ignore top-level semicolons. *)
 
14
  | Some (Token.Kwd ';') ->
 
15
      Stream.junk stream;
 
16
      main_loop the_fpm the_execution_engine stream
 
17
 
 
18
  | Some token ->
 
19
      begin
 
20
        try match token with
 
21
        | Token.Def ->
 
22
            let e = Parser.parse_definition stream in
 
23
            print_endline "parsed a function definition.";
 
24
            dump_value (Codegen.codegen_func the_fpm e);
 
25
        | Token.Extern ->
 
26
            let e = Parser.parse_extern stream in
 
27
            print_endline "parsed an extern.";
 
28
            dump_value (Codegen.codegen_proto e);
 
29
        | _ ->
 
30
            (* Evaluate a top-level expression into an anonymous function. *)
 
31
            let e = Parser.parse_toplevel stream in
 
32
            print_endline "parsed a top-level expr";
 
33
            let the_function = Codegen.codegen_func the_fpm e in
 
34
            dump_value the_function;
 
35
 
 
36
            (* JIT the function, returning a function pointer. *)
 
37
            let result = ExecutionEngine.run_function the_function [||]
 
38
              the_execution_engine in
 
39
 
 
40
            print_string "Evaluated to ";
 
41
            print_float (GenericValue.as_float Codegen.double_type result);
 
42
            print_newline ();
 
43
        with Stream.Error s | Codegen.Error s ->
 
44
          (* Skip token for error recovery. *)
 
45
          Stream.junk stream;
 
46
          print_endline s;
 
47
      end;
 
48
      print_string "ready> "; flush stdout;
 
49
      main_loop the_fpm the_execution_engine stream