From ea28092e576e0f8ba2bcf019c24c62aa8abc55a4 Mon Sep 17 00:00:00 2001 From: Yann Regis-Gianas Date: Fri, 1 Dec 2017 09:50:23 +0100 Subject: [PATCH 1/6] Update part 3 syllabus. --- README.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index eebc21b..8900d4a 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,15 @@ reasoning by induction on the structure of types. Finally, we introduce subtyping, row polymorphism, and illustrate the problems induced by side effects (references) and the need for the value restriction. -The third part of the course describes more advanced features of type -systems: exceptions and effect handlers, including their typechecking and -static analyses: type inference, data flow and control flow analyses. -Finally, it introduces dependent types and refinement types. +The third part of the course introduces "rich" type systems designed +to guarantee extra properties in addition to safety: principality, +information hiding, modularity, extensionality, purity, control of +effects, algorithmic invariants, complexity, resource usage, or full +functional correctness. The expressivity of these systems sometimes +endangers the tractability, or even the feasibility, of type checking +and type inference: a common thread between these lectures discusses +the tradeoffs made on the design of these systems to balance +expressivity and tractability. The last part focuses on the use of dependent types for programming: effectful programming with monads and algebraic effects; tagless @@ -131,13 +136,14 @@ We also show the limits of dependently-typed functional programming. * See exercises in [course notes](http://gallium.inria.fr/~remy/mpri/cours.pdf) -### Advanced Aspects of Type Systems +### Rich types, tractable typing -* Exceptions and effect handlers. (Compiled away via CPS.) -* Typechecking exceptions and handlers. -* Type inference. (ML. Bidirectional. Elaboration.) -* Data/control flow analysis. -* Functional correctness. Intro to dependent/refinement types. +* Type inference +* Subtyping +* Effects and resources +* Modules +* Dependent types +* Functional correctness ### Dependently-typed Functional Programming From 0ee19236b0d172d98b4ab23f69326a3c25944f4d Mon Sep 17 00:00:00 2001 From: Yann Regis-Gianas Date: Wed, 13 Dec 2017 10:26:29 +0100 Subject: [PATCH 2/6] Slides cours YRG-1. --- README.md | 4 +++- slides/yrg-00-introduction.pdf | Bin 0 -> 97679 bytes slides/yrg-01-type-inference.pdf | Bin 0 -> 116583 bytes 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 slides/yrg-00-introduction.pdf create mode 100644 slides/yrg-01-type-inference.pdf diff --git a/README.md b/README.md index 8900d4a..a131adb 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,9 @@ We also show the limits of dependently-typed functional programming. ### Rich types, tractable typing -* Type inference +* (08/12/2017) + [Introduction](slides/yrg-00-introduction.pdf), + [ML and Type inference](slides/yrg-01-type-inference.pdf) * Subtyping * Effects and resources * Modules diff --git a/slides/yrg-00-introduction.pdf b/slides/yrg-00-introduction.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d232d8e0742ad48c2b7a881a5ebe122a9e6cbe4e GIT binary patch literal 97679 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 VoJ`GNxHuTuSz*Y?MCHX`{s&J7u)_cV literal 0 HcmV?d00001 diff --git a/slides/yrg-01-type-inference.pdf b/slides/yrg-01-type-inference.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c3a22ea507246461844c1d5afb1e676435f406dd GIT binary patch literal 116583 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 literal 0 HcmV?d00001 From 19ff31e4c92e30e9c58250004c401c52d2df60cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pottier?= Date: Wed, 13 Dec 2017 14:04:28 +0100 Subject: [PATCH 3/6] Publish the project. --- projet/src/.merlin | 9 + projet/src/CPS.ml | 7 + projet/src/CPS.mli | 4 + projet/src/Cook.ml | 54 +++++ projet/src/Cook.mli | 15 ++ projet/src/Defun.ml | 7 + projet/src/Defun.mli | 4 + projet/src/Error.ml | 40 ++++ projet/src/Error.mli | 30 +++ projet/src/Finish.ml | 323 ++++++++++++++++++++++++++ projet/src/Finish.mli | 5 + projet/src/Lambda.ml | 48 ++++ projet/src/Lexer.mll | 97 ++++++++ projet/src/Main.ml | 101 ++++++++ projet/src/Makefile | 28 +++ projet/src/Parser.mly | 155 +++++++++++++ projet/src/RawLambda.ml | 55 +++++ projet/src/Tail.ml | 132 +++++++++++ projet/src/Top.ml | 94 ++++++++ projet/src/_tags | 8 + projet/src/alphalib/Atom.ml | 215 ++++++++++++++++++ projet/src/alphalib/Atom.mli | 71 ++++++ projet/src/kremlin/C.ml | 126 ++++++++++ projet/src/kremlin/Common.ml | 19 ++ projet/src/kremlin/Constant.ml | 66 ++++++ projet/src/kremlin/Options.ml | 7 + projet/src/kremlin/PrintC.ml | 354 +++++++++++++++++++++++++++++ projet/src/kremlin/PrintCommon.ml | 96 ++++++++ projet/src/kremlin/Utils.ml | 73 ++++++ projet/src/prologue.h | 83 +++++++ projet/src/test/.gitignore | 1 + projet/src/test/.merlin | 1 + projet/src/test/Makefile | 21 ++ projet/src/test/_tags | 3 + projet/src/test/auxiliary.ml | 138 +++++++++++ projet/src/test/test.ml | 288 +++++++++++++++++++++++ projet/src/tests/.gitignore | 4 + projet/src/tests/bool.exp | 20 ++ projet/src/tests/bool.lambda | 88 +++++++ projet/src/tests/church.exp | 1 + projet/src/tests/church.lambda | 16 ++ projet/src/tests/hello.exp | 1 + projet/src/tests/hello.lambda | 1 + projet/src/tests/loop/loop.lambda | 10 + projet/src/tests/printprint.exp | 2 + projet/src/tests/printprint.lambda | 2 + projet/sujet.pdf | Bin 0 -> 112447 bytes 47 files changed, 2923 insertions(+) create mode 100644 projet/src/.merlin create mode 100644 projet/src/CPS.ml create mode 100644 projet/src/CPS.mli create mode 100644 projet/src/Cook.ml create mode 100644 projet/src/Cook.mli create mode 100644 projet/src/Defun.ml create mode 100644 projet/src/Defun.mli create mode 100644 projet/src/Error.ml create mode 100644 projet/src/Error.mli create mode 100644 projet/src/Finish.ml create mode 100644 projet/src/Finish.mli create mode 100644 projet/src/Lambda.ml create mode 100644 projet/src/Lexer.mll create mode 100644 projet/src/Main.ml create mode 100644 projet/src/Makefile create mode 100644 projet/src/Parser.mly create mode 100644 projet/src/RawLambda.ml create mode 100644 projet/src/Tail.ml create mode 100644 projet/src/Top.ml create mode 100644 projet/src/_tags create mode 100644 projet/src/alphalib/Atom.ml create mode 100644 projet/src/alphalib/Atom.mli create mode 100644 projet/src/kremlin/C.ml create mode 100644 projet/src/kremlin/Common.ml create mode 100644 projet/src/kremlin/Constant.ml create mode 100644 projet/src/kremlin/Options.ml create mode 100644 projet/src/kremlin/PrintC.ml create mode 100644 projet/src/kremlin/PrintCommon.ml create mode 100644 projet/src/kremlin/Utils.ml create mode 100644 projet/src/prologue.h create mode 100644 projet/src/test/.gitignore create mode 100644 projet/src/test/.merlin create mode 100644 projet/src/test/Makefile create mode 100644 projet/src/test/_tags create mode 100644 projet/src/test/auxiliary.ml create mode 100644 projet/src/test/test.ml create mode 100644 projet/src/tests/.gitignore create mode 100644 projet/src/tests/bool.exp create mode 100644 projet/src/tests/bool.lambda create mode 100755 projet/src/tests/church.exp create mode 100644 projet/src/tests/church.lambda create mode 100755 projet/src/tests/hello.exp create mode 100644 projet/src/tests/hello.lambda create mode 100644 projet/src/tests/loop/loop.lambda create mode 100755 projet/src/tests/printprint.exp create mode 100644 projet/src/tests/printprint.lambda create mode 100644 projet/sujet.pdf diff --git a/projet/src/.merlin b/projet/src/.merlin new file mode 100644 index 0000000..7de32a3 --- /dev/null +++ b/projet/src/.merlin @@ -0,0 +1,9 @@ +S kremlin +S alphalib +B _build +B _build/kremlin +B _build/alphalib +PKG unix +PKG process +PKG pprint +PKG ppx_deriving.std diff --git a/projet/src/CPS.ml b/projet/src/CPS.ml new file mode 100644 index 0000000..9b3d87d --- /dev/null +++ b/projet/src/CPS.ml @@ -0,0 +1,7 @@ +(* The source calculus. *) +module S = Lambda +(* The target calculus. *) +module T = Tail + +let cps_term (t : S.term) : T.term = + assert false diff --git a/projet/src/CPS.mli b/projet/src/CPS.mli new file mode 100644 index 0000000..2497ddd --- /dev/null +++ b/projet/src/CPS.mli @@ -0,0 +1,4 @@ +(* Through a CPS transformation, the surface language [Lambda] is translated + down to the intermediate language [Tail]. *) + +val cps_term: Lambda.term -> Tail.term diff --git a/projet/src/Cook.ml b/projet/src/Cook.ml new file mode 100644 index 0000000..89657ed --- /dev/null +++ b/projet/src/Cook.ml @@ -0,0 +1,54 @@ +open Error + +(* The source calculus. *) +module S = RawLambda +(* The target calculus. *) +module T = Lambda + +(* Environments map strings to atoms. *) +module Env = + Map.Make(String) + +(* [bind env x] creates a fresh atom [a] and extends the environment [env] + with a mapping of [x] to [a]. *) +let bind env x = + let a = Atom.fresh x in + Env.add x a env, a + +let rec cook_term env { S.place; S.value } = + match value with + | S.Var x -> + begin try + T.Var (Env.find x env) + with Not_found -> + error place "Unbound variable: %s" x + end + | S.Lam (x, t) -> + let env, x = bind env x in + T.Lam (T.NoSelf, x, cook_term env t) + | S.App (t1, t2) -> + T.App (cook_term env t1, cook_term env t2) + | S.Lit i -> + T.Lit i + | S.BinOp (t1, op, t2) -> + T.BinOp (cook_term env t1, op, cook_term env t2) + | S.Print t -> + T.Print (cook_term env t) + | S.Let (S.NonRecursive, x, t1, t2) -> + let t1 = cook_term env t1 in + let env, x = bind env x in + let t2 = cook_term env t2 in + T.Let (x, t1, t2) + | S.Let (S.Recursive, f, { S.value = S.Lam (x, t1); _ }, t2) -> + let env, f = bind env f in + let x, t1 = + let env, x = bind env x in + x, cook_term env t1 + in + let t2 = cook_term env t2 in + T.Let (f, T.Lam (T.Self f, x, t1), t2) + | S.Let (S.Recursive, _, { S.place; _ }, _) -> + error place "the right-hand side of 'let rec' must be a lambda-abstraction" + +let cook_term t = + cook_term Env.empty t diff --git a/projet/src/Cook.mli b/projet/src/Cook.mli new file mode 100644 index 0000000..617e408 --- /dev/null +++ b/projet/src/Cook.mli @@ -0,0 +1,15 @@ +(* This module translates [RawLambda] into [Lambda]. *) + +(* This involves ensuring that every name is properly bound (otherwise, an + error is reported) and switching from a representation of names as strings + to a representation of names as atoms. *) + +(* This also involves checking that the right-hand side of every [let] + construct is a function (otherwise, an error is reported) and switching + from a representation where [let] constructs can carry a [rec] annotation + to a representation where functions can carry such an annotation. *) + +(* This also involves dropping places (that is, source code locations), since + they are no longer used after this phase. *) + +val cook_term: RawLambda.term -> Lambda.term diff --git a/projet/src/Defun.ml b/projet/src/Defun.ml new file mode 100644 index 0000000..7264dac --- /dev/null +++ b/projet/src/Defun.ml @@ -0,0 +1,7 @@ +(* The source calculus. *) +module S = Tail +(* The target calculus. *) +module T = Top + +let defun_term (t : S.term) : T.program = + assert false diff --git a/projet/src/Defun.mli b/projet/src/Defun.mli new file mode 100644 index 0000000..0c02815 --- /dev/null +++ b/projet/src/Defun.mli @@ -0,0 +1,4 @@ +(* Through defunctionalization, the intermediate language [Tail] is translated + down to the next intermediate language, [Top]. *) + +val defun_term: Tail.term -> Top.program diff --git a/projet/src/Error.ml b/projet/src/Error.ml new file mode 100644 index 0000000..e4f1d8b --- /dev/null +++ b/projet/src/Error.ml @@ -0,0 +1,40 @@ +open Lexing + +type place = + position * position + +let place lexbuf : place = + lexbuf.lex_start_p, lexbuf.lex_curr_p + +let line p : int = + p.pos_lnum + +let column p : int = + p.pos_cnum - p.pos_bol + +let show place : string = + let startp, endp = place in + Printf.sprintf "File \"%s\", line %d, characters %d-%d" + startp.pos_fname + (line startp) + (column startp) + (endp.pos_cnum - startp.pos_bol) (* intentionally [startp.pos_bol] *) + +let display continuation header place format = + Printf.fprintf stderr "%s:\n" (show place); + Printf.kfprintf + continuation + stderr + (header ^^ format ^^ "\n%!") + +let error place format = + display + (fun _ -> exit 1) + "Error: " + place format + +let set_filename lexbuf filename = + lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = filename } + +let pp_place formatter _place = + Format.fprintf formatter "<>" diff --git a/projet/src/Error.mli b/projet/src/Error.mli new file mode 100644 index 0000000..b8ba5f9 --- /dev/null +++ b/projet/src/Error.mli @@ -0,0 +1,30 @@ +open Lexing + +(* A place is a pair of a start position and an end position. *) + +type place = + position * position + +(* [set_filename lexbuf filename] updates [lexbuf] to record the + fact that the current file name is [filename]. This file name + is later used in error messages. *) + +val set_filename: lexbuf -> string -> unit + +(* [place lexbuf] produces a pair of the current token's start and + end positions. This function is useful when reporting an error + during lexing. *) + +val place: lexbuf -> place + +(* [error place format ...] displays an error message and exits. + The error message is located at [place]. The error message + is composed based on [format] and the extra arguments [...]. *) + +val error: place -> ('a, out_channel, unit, 'b) format4 -> 'a + +(* [pp_place formatter place] prints a place. It is used by + [@@deriving show] for data structures that contain places. + As of now, it prints nothing. *) + +val pp_place: Format.formatter -> place -> unit diff --git a/projet/src/Finish.ml b/projet/src/Finish.ml new file mode 100644 index 0000000..08779b3 --- /dev/null +++ b/projet/src/Finish.ml @@ -0,0 +1,323 @@ +(* The source calculus. *) +module S = Top +(* The target calculus. *) +module T = C + +(* -------------------------------------------------------------------------- *) + +(* [interval i j f] constructs the list [[f i; f (i + 1); ...; f (j - 1)]]. *) + +let rec interval i j (f : int -> 'a) : 'a list = + if i < j then + f i :: interval (i + 1) j f + else + [] + +(* -------------------------------------------------------------------------- *) + +(* [index xs] constructs a list of pairs, where each element of [xs] is paired + with its index. Indices are 0-based. *) + +let index (xs : 'a list) : (int * 'a) list = + let n = List.length xs in + let indices = interval 0 n (fun i -> i) in + List.combine indices xs + +(* -------------------------------------------------------------------------- *) + +(* The number of fields of a block, not counting its tag. *) + +let block_num_fields b = + match b with + | S.Con (_, vs) -> + List.length vs + +(* -------------------------------------------------------------------------- *) + +(* A simple-minded way of ensuring that every atom is printed as a + distinct string is to concatenate the atom's hint and identity, + with an underscore in between. This is guaranteed to rule out + collisions. *) + +let var (x : S.variable) : T.ident = + Printf.sprintf "%s_%d" (Atom.hint x) (Atom.identity x) + +let evar (x : S.variable) : T.expr = + T.Name (var x) + +(* -------------------------------------------------------------------------- *) + +(* Predefined C types and functions. *) + +(* A universal type: every value is translated to a C value of type [univ]. + This is a union type (i.e., an untagged sum) of integers and pointers to + memory blocks. *) + +let univ : T.type_spec = + T.Named "univ" + +(* The type of integers. *) + +let int : T.type_spec = + T.Named "int" + +(* The type [char] appears in the type of [main]. *) + +let char : T.type_spec = + T.Named "char" + +let answer : T.type_spec = + int + (* Our functions never actually return, since they are tail recursive. + We use [int] as their return type, since this is the return type of + [main]. *) + +let exit : T.expr = + T.Name "exit" + +let printf : T.expr = + T.Name "printf" + +(* -------------------------------------------------------------------------- *) + +(* [declare x init] constructs a local variable declaration for a variable [x] + of type [univ]. [x] is optionally initialized according to [init]. *) + +let declare (x : S.variable) (init : T.init option) : T.declaration = + univ, None, [ T.Ident (var x), init ] + +(* -------------------------------------------------------------------------- *) + +(* Macro invocations. *) + +let macro m es : T.expr = + (* We disguise a macro invocation as a procedure call. *) + T.Call (T.Name m, es) + +(* -------------------------------------------------------------------------- *) + +(* Integer literals; conversions between [univ] and [int]. *) + +let iconst i : T.expr = + T.Constant (Constant.Int64, string_of_int i) + +let to_int v : T.expr = + macro "TO_INT" [ v ] + (* This is an unsafe conversion, of course. *) + +let from_int v : T.expr = + macro "FROM_INT" [ v ] + +(* -------------------------------------------------------------------------- *) + +(* The translation of values. *) + +let finish_op = function + | S.OpAdd -> + T.K.Add + | S.OpSub -> + T.K.Sub + | S.OpMul -> + T.K.Mult + | S.OpDiv -> + T.K.Div + +let rec finish_value (v : S.value) : T.expr = + match v with + | S.VVar x -> + evar x + | S.VLit i -> + from_int (iconst i) + | S.VBinOp (v1, op, v2) -> + from_int ( + T.Op2 ( + finish_op op, + to_int (finish_value v1), + to_int (finish_value v2) + ) + ) + +let finish_values vs = + List.map finish_value vs + +(* -------------------------------------------------------------------------- *) + +(* A macro for allocating a memory block. *) + +let alloc b : T.expr = + T.Call (T.Name "ALLOC", [ iconst (block_num_fields b) ]) + +(* -------------------------------------------------------------------------- *) + +(* Macros for reading and initializing the tag of a memory block. *) + +let read_tag (v : S.value) : T.expr = + macro "GET_TAG" [ finish_value v ] + +let set_tag (x : S.variable) (tag : S.tag) : T.stmt = + T.Expr (macro "SET_TAG" [ evar x; iconst tag ]) + +(* -------------------------------------------------------------------------- *) + +(* Macros for reading and setting a field in a memory block. *) + +let read_field (v : S.value) (i : int) : T.expr = + (* [i] is a 0-based field index. *) + macro "GET_FIELD" [ finish_value v; iconst i ] + +let read_field (v : S.value) (i, x) (t : T.stmt list) : T.stmt list = + (* [x] is a variable, which is declared and initialized with + the content of the [i]th field of the block [v]. *) + T.DeclStmt (declare x (Some (T.InitExpr (read_field v i)))) :: + t + +let read_fields (v : S.value) xs (t : T.stmt list) : T.stmt list = + (* [xs] are variables, which are declared and initialized with + the contents of the fields of the block [v]. *) + List.fold_right (read_field v) (index xs) t + +let set_field x i (v : S.value) : T.stmt = + T.Expr (macro "SET_FIELD" [ evar x; iconst i; finish_value v ]) + +(* -------------------------------------------------------------------------- *) + +(* A sequence of instructions for initializing a memory block. *) + +let init_block (x : S.variable) (b : S.block) : T.stmt list = + match b with + | S.Con (tag, vs) -> + T.Comment "Initializing a memory block:" :: + set_tag x tag :: + List.mapi (set_field x) vs + +(* -------------------------------------------------------------------------- *) + +(* Function calls, as expressions and as statements. *) + +let ecall f args : T.expr = + T.Call (f, args) + +let scall f args : T.stmt = + T.Expr (ecall f args) + +(* -------------------------------------------------------------------------- *) + +(* The translation of terms. *) + +let rec finish_term (t : S.term) : C.stmt = + match t with + | S.Exit -> + T.Compound [ + scall exit [ iconst 0 ] + ] + | S.TailCall (f, vs) -> + T.Return (Some (ecall (evar f) (finish_values vs))) + | S.Print (v, t) -> + T.Compound [ + scall printf [ T.Literal "%d\\n"; to_int (finish_value v) ]; + finish_term t + ] + | S.LetVal (x, v1, t2) -> + T.Compound [ + T.DeclStmt (declare x (Some (T.InitExpr (finish_value v1)))); + finish_term t2 + ] + | S.LetBlo (x, b1, t2) -> + T.Compound ( + T.DeclStmt (declare x (Some (T.InitExpr (alloc b1)))) :: + init_block x b1 @ + [ finish_term t2 ] + ) + | S.Swi (v, bs) -> + T.Switch ( + read_tag v, + finish_branches v bs, + default + ) + +and default : T.stmt = + (* This default [switch] branch should never be taken. *) + T.Compound [ + scall printf [ T.Literal "Oops! A nonexistent case has been taken.\\n" ]; + scall exit [ iconst 42 ]; + ] + +and finish_branches v bs = + List.map (finish_branch v) bs + +and finish_branch v (S.Branch (tag, xs, t)) : T.expr * T.stmt = + iconst tag, + T.Compound (read_fields v xs [finish_term t]) + +(* -------------------------------------------------------------------------- *) + +(* Function declarations. *) + +(* We distinguish the function [main], whose type is imposed by the C standard, + and ordinary functions, whose parameters have type [univ]. *) + +(* A parameter of an ordinary function has type [univ]. *) + +let param (x : S.variable) : T.param = + univ, T.Ident (var x) + +(* A declaration of an ordinary function. *) + +let declare_ordinary_function f xs : T.declaration = + answer, None, [ T.Function (None, T.Ident (var f), List.map param xs), None ] + +(* The declaration of the main function. *) + +let declare_main_function : T.declaration = + let params = [ + int, T.Ident "argc"; + char, T.Pointer (T.Pointer (T.Ident "argv")) + ] in + int, None, [ T.Function (None, T.Ident "main", params), None ] + +(* -------------------------------------------------------------------------- *) + +(* A function definition. *) + +type decl_or_fun = + T.declaration_or_function + +let define (decl : T.declaration) (t : S.term) : decl_or_fun = + T.Function ( + [], (* no comments *) + false, (* not inlined *) + decl, + T.Compound [finish_term t] + ) + +let define_ordinary_function (S.Fun (f, xs, t)) : decl_or_fun = + define (declare_ordinary_function f xs) t + +let define_main_function (t : S.term) : decl_or_fun = + define declare_main_function t + +(* -------------------------------------------------------------------------- *) + +(* Because all functions are mutually recursive, their definitions must be + preceded with their prototypes. *) + +let prototype (f : decl_or_fun) : decl_or_fun = + match f with + | T.Function (_, _, declaration, _) -> + T.Decl ([], declaration) + | T.Decl _ -> + assert false + +let prototypes (fs : decl_or_fun list) : decl_or_fun list = + List.map prototype fs @ + fs + +(* -------------------------------------------------------------------------- *) + +(* The translation of a complete program. *) + +let finish_program (S.Prog (decls, main) : S.program) : T.program = + prototypes ( + define_main_function main :: + List.map define_ordinary_function decls + ) diff --git a/projet/src/Finish.mli b/projet/src/Finish.mli new file mode 100644 index 0000000..6785984 --- /dev/null +++ b/projet/src/Finish.mli @@ -0,0 +1,5 @@ +(* This function implements a translation of the intermediate language [Top] + down to [C]. This transformation is mostly a matter of choosing appropriate + C constructs to reflect the concepts of the language [Top]. *) + +val finish_program: Top.program -> C.program diff --git a/projet/src/Lambda.ml b/projet/src/Lambda.ml new file mode 100644 index 0000000..fdb9ecb --- /dev/null +++ b/projet/src/Lambda.ml @@ -0,0 +1,48 @@ +(* This language is the untyped lambda-calculus, extended with recursive + lambda-abstractions, nonrecursive [let] bindings, integer literals and + integer arithmetic operations, and the primitive operation [print]. *) + +(* This language is really the same language as [RawLambda], with the + following internal differences: + + 1. Instead of recursive [let] bindings, the language has recursive + lambda-abstractions. A [let rec] definition whose right-hand side is not + a lambda-abstraction is rejected during the translation of [RawLambda] + to [Lambda]. + + 2. Variables are represented by atoms (instead of strings). A term with an + unbound variable is rejected during the translation of [RawLambda] to + [Lambda]. + + 3. Terms are no longer annotated with places. *) + +(* Variables are atoms. *) + +type variable = + Atom.atom + + (* Every lambda-abstraction is marked recursive or nonrecursive. Whereas a + nonrecursive lambda-abstraction [fun x -> t] binds one variable [x], a + recursive lambda-abstraction [fix f. fun x -> t] binds two variables [f] + and [x]. The variable [f] is a self-reference. *) + +and self = + | Self of variable + | NoSelf + +and binop = RawLambda.binop = + | OpAdd + | OpSub + | OpMul + | OpDiv + +and term = + | Var of variable + | Lam of self * variable * term + | App of term * term + | Lit of int + | BinOp of term * binop * term + | Print of term + | Let of variable * term * term + +[@@deriving show { with_path = false }] diff --git a/projet/src/Lexer.mll b/projet/src/Lexer.mll new file mode 100644 index 0000000..ba016f0 --- /dev/null +++ b/projet/src/Lexer.mll @@ -0,0 +1,97 @@ +{ + +open Lexing +open Error +open Parser +open RawLambda + +} + +(* -------------------------------------------------------------------------- *) + +(* Regular expressions. *) + +let newline = + ('\010' | '\013' | "\013\010") + +let whitespace = + [ ' ' '\t' ] + +let lowercase = + ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] + +let uppercase = + ['A'-'Z' '\192'-'\214' '\216'-'\222'] + +let identchar = + ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '0'-'9'] + +let digit = + ['0'-'9'] + +(* -------------------------------------------------------------------------- *) + +(* The lexer. *) + +rule entry = parse +| "fun" + { FUN } +| "in" + { IN } +| "let" + { LET } +| "print" + { PRINT } +| "rec" + { REC } +| "->" + { ARROW } +| "=" + { EQ } +| "(" + { LPAREN } +| ")" + { RPAREN } +| "+" + { ADDOP OpAdd } +| "-" + { ADDOP OpSub } +| "*" + { MULOP OpMul } +| "/" + { MULOP OpDiv } +| (lowercase identchar *) as x + { IDENT x } +| digit+ as i + { try + INTLITERAL (int_of_string i) + with Failure _ -> + error (place lexbuf) "invalid integer literal." } +| "(*" + { ocamlcomment (place lexbuf) lexbuf; entry lexbuf } +| newline + { new_line lexbuf; entry lexbuf } +| whitespace+ + { entry lexbuf } +| eof + { EOF } +| _ as c + { error (place lexbuf) "unexpected character: '%c'." c } + +(* ------------------------------------------------------------------------ *) + + (* Skip OCaml-style comments. Comments can be nested. This sub-lexer is + parameterized with the place of the opening comment, so if an unterminated + comment is detected, we can show where it was opened. *) + +and ocamlcomment p = parse +| "*)" + { () } +| "(*" + { ocamlcomment (place lexbuf) lexbuf; ocamlcomment p lexbuf } +| newline + { new_line lexbuf; ocamlcomment p lexbuf } +| eof + { error p "unterminated comment." } +| _ + { ocamlcomment p lexbuf } diff --git a/projet/src/Main.ml b/projet/src/Main.ml new file mode 100644 index 0000000..9c8eed4 --- /dev/null +++ b/projet/src/Main.ml @@ -0,0 +1,101 @@ +(* -------------------------------------------------------------------------- *) + +(* Parse the command line. *) + +let debug = + ref false + +let filenames = + ref [] + +let record filename = + filenames := filename :: !filenames + +let options = + Arg.align [ + "--debug", Arg.Set debug, " Enable debugging output"; + ] + +let usage = + Printf.sprintf "Usage: %s " Sys.argv.(0) + +let () = + Arg.parse options record usage + +let debug = + !debug + +let filenames = + List.rev !filenames + +(* -------------------------------------------------------------------------- *) + +(* Printing a syntax tree in an intermediate language (for debugging). *) + +let print_delimiter () = + Printf.eprintf "----------------------------------------"; + Printf.eprintf "----------------------------------------\n" + +let dump (phase : string) (show : 'term -> string) (t : 'term) = + if debug then begin + print_delimiter(); + Printf.eprintf "%s:\n\n%s\n\n%!" phase (show t) + end; + t + +(* -------------------------------------------------------------------------- *) + +(* Reading and parsing a file. *) + +let read filename : RawLambda.term = + try + let contents = Utils.file_get_contents filename in + let lexbuf = Lexing.from_string contents in + Error.set_filename lexbuf filename; + try + Parser.entry Lexer.entry lexbuf + with + | Parser.Error -> + Error.error (Error.place lexbuf) "Syntax error." + with + | Sys_error msg -> + prerr_endline msg; + exit 1 + +(* -------------------------------------------------------------------------- *) + +(* Printing the final C program on the standard output channel. *) + +let output (p : C.program) : unit = + Printf.printf "#include\n"; + Printf.printf "#include\n"; + Printf.printf "#include \"prologue.h\"\n\n"; + let print_program = PrintCommon.print_program PrintC.p_decl_or_function in + let buf = Buffer.create 1024 in + PrintCommon.printf_of_pprint_pretty print_program buf p; + print_endline (Buffer.contents buf) + +(* -------------------------------------------------------------------------- *) + +(* The complete processing pipeline. Beautiful, isn't it? *) + +let process filename = + filename + |> read + |> dump "RawLambda" RawLambda.show_term + |> Cook.cook_term + |> dump "Lambda" Lambda.show_term + |> CPS.cps_term + |> dump "Tail" Tail.show_term + |> Defun.defun_term + |> dump "Top" Top.show_program + |> Finish.finish_program + |> dump "C" C.show_program + |> output + +(* -------------------------------------------------------------------------- *) + +(* The main program. *) + +let () = + List.iter process filenames diff --git a/projet/src/Makefile b/projet/src/Makefile new file mode 100644 index 0000000..73f39e1 --- /dev/null +++ b/projet/src/Makefile @@ -0,0 +1,28 @@ +SHELL := bash +TARGET := Main.native +JOUJOU := joujou +DIRS := kremlin,alphalib +OCAMLBUILD :=\ + ocamlbuild \ + -classic-display \ + -j 4 \ + -use-ocamlfind \ + -use-menhir \ + -menhir "menhir -lg 1 -la 1 --explain" \ + -Is $(DIRS) \ + +.PHONY: all test clean + +all: + @ $(OCAMLBUILD) -quiet $(TARGET) + @ ln -sf $(TARGET) $(JOUJOU) + +test: all + @ make -C test test + +clean: + rm -f *~ + rm -f tests/*.c tests/*.out + $(OCAMLBUILD) -clean + rm -f $(TARGET) $(JOUJOU) + $(MAKE) -C test clean diff --git a/projet/src/Parser.mly b/projet/src/Parser.mly new file mode 100644 index 0000000..4f032b2 --- /dev/null +++ b/projet/src/Parser.mly @@ -0,0 +1,155 @@ +%token IDENT +%token INTLITERAL +%token FUN IN LET PRINT REC +%token ARROW EQ LPAREN RPAREN +%token MULOP ADDOP +%token EOF + +%start entry + +%{ + +open RawLambda + +%} + +%% + +(* -------------------------------------------------------------------------- *) + +(* A toplevel phrase is just a term. *) + +entry: + t = any_term EOF + { t } + +(* -------------------------------------------------------------------------- *) + +(* The syntax of terms is stratified as follows: + + atomic_term -- unambiguously delimited terms + application_term -- n-ary applications of atomic terms + multiplicative_term -- built using multiplication & division + additive_term -- built using addition & subtraction + any_term -- everything + + A [match/with/end] construct is terminated with an [end] keyword, as in Coq, + so it is an atomic term. *) + +atomic_term_: +| LPAREN t = any_term RPAREN + { t.value } +| x = IDENT + { Var x } +| i = INTLITERAL + { Lit i } + +application_term_: +| t = atomic_term_ + { t } +| t1 = placed(application_term_) t2 = placed(atomic_term_) + { App (t1, t2) } +| PRINT t2 = placed(atomic_term_) + { Print t2 } + +%inline multiplicative_term_: + t = left_associative_level(application_term_, MULOP, mkbinop) + { t } + +%inline additive_term_: + t = left_associative_level(multiplicative_term_, ADDOP, mkbinop) + { t } + +any_term_: +| t = additive_term_ + { t } +| FUN x = IDENT ARROW t = any_term + { Lam (x, t) } +| LET mode = recursive x = IDENT EQ t1 = any_term IN t2 = any_term + { Let (mode, x, t1, t2) } + +%inline any_term: + t = placed(any_term_) + { t } + +(* -------------------------------------------------------------------------- *) + +(* An infix-left-associative-operator level in a hierarchy of arithmetic + expressions. *) + +(* [basis] is the next lower level in the hierarchy. + [op] is the category of binary operators. + [action] is a ternary sequencing construct. *) + +left_associative_level(basis, op, action): +| t = basis +| t = action( + left_associative_level(basis, op, action), + op, + basis + ) + { t } + +(* -------------------------------------------------------------------------- *) + +(* A ternary sequence whose semantic action builds a [BinOp] node. *) + +%inline mkbinop(term1, op, term2): + t1 = placed(term1) op = op t2 = placed(term2) + { BinOp (t1, op, t2) } + +(* -------------------------------------------------------------------------- *) + +(* A [let] construct carries an optional [rec] annotation. *) + +recursive: +| REC { Recursive } +| { NonRecursive } + +(* -------------------------------------------------------------------------- *) + +(* A term is annotated with its start and end positions, for use in error + messages. *) + +%inline placed(X): + x = X + { { place = ($startpos, $endpos); value = x } } + +(* -------------------------------------------------------------------------- *) + +(* In a right-flexible list, the last delimiter is optional, i.e., [delim] can + be viewed as a terminator or a separator, as desired. *) + +(* There are several ways of expressing this. One could say it is either a + separated list or a terminated list; this works if one uses right recursive + lists. Or, one could say that it is a separated list followed with an + optional delimiter; this works if one uses a left-recursive list. The + following formulation is direct and seems most natural. It should lead to + the smallest possible automaton. *) + +right_flexible_list(delim, X): +| (* nothing *) + { [] } +| x = X + { [x] } +| x = X delim xs = right_flexible_list(delim, X) + { x :: xs } + +(* In a left-flexible list, the first delimiter is optional, i.e., [delim] can + be viewed as an opening or as a separator, as desired. *) + +(* Again, there are several ways of expressing this, and again, I suppose the + following formulation is simplest. It is the mirror image of the above + definition, so it is naturally left-recursive, this time. *) + +reverse_left_flexible_list(delim, X): +| (* nothing *) + { [] } +| x = X + { [x] } +| xs = reverse_left_flexible_list(delim, X) delim x = X + { x :: xs } + +%inline left_flexible_list(delim, X): + xs = reverse_left_flexible_list(delim, X) + { List.rev xs } diff --git a/projet/src/RawLambda.ml b/projet/src/RawLambda.ml new file mode 100644 index 0000000..51f33e1 --- /dev/null +++ b/projet/src/RawLambda.ml @@ -0,0 +1,55 @@ +(* Variables are strings. *) + +type variable = + string + +(* Every [let] binding is marked recursive or nonrecursive. *) + +and recursive = + | Recursive + | NonRecursive + +(* The four standard integer arithmetic operations are supported. *) + +and binop = + | OpAdd + | OpSub + | OpMul + | OpDiv + +(* This language is the untyped lambda-calculus, extended with possibly + recursive [let] bindings, integer literals (that is, constants), integer + arithmetic operations, and the primitive operation [print], which prints an + integer value and returns it. *) + +and term_ = + | Var of variable + | Lam of variable * term + | App of term * term + | Lit of int + | BinOp of term * binop * term + | Print of term + | Let of recursive * variable * term * term + +(* Every abstract syntax tree node of type [term] is annotated with a place, + that is, a position in the source code. This allows us to produce a good + error message when a problem is detected. *) + +and term = + term_ placed + +(* A value of type ['a placed] can be thought of as a value of type ['a] + decorated with a place. *) + +and 'a placed = { + place: Error.place; + value: 'a + } + +(* The following annotation requests the automatic generation of a [show_] + function for each of the types defined above. For instance, the function + [show_term], of type [term -> string], converts a term to a string. These + functions can be useful during debugging. Running with [--debug] causes + every intermediate abstract syntax tree to be displayed in this way. *) + +[@@deriving show { with_path = false }] diff --git a/projet/src/Tail.ml b/projet/src/Tail.ml new file mode 100644 index 0000000..44b8b6d --- /dev/null +++ b/projet/src/Tail.ml @@ -0,0 +1,132 @@ +(* This intermediate language describes the result of the CPS transformation. + It is a lambda-calculus where the ordering of computations is explicit and + where every function call is a tail call. + + The following syntactic categories are distinguished: + + 1. "Values" include variables, integer literals, and applications of the + primitive integer operations to values. Instead of "values", they could + also be referred to as "pure expressions". They are expressions whose + evaluation terminates and has no side effect, not even memory + allocation. + + 2. "Blocks" include lambda-abstractions. Even though lambda-abstractions + are traditionally considered values, here, they are viewed as + expressions whose evaluation has a side effect, namely, the allocation + of a memory block. + + 3. "Terms" are expressions with side effects. Terms always appear in tail + position: an examination of the syntax of terms shows that a term can be + viewed as a sequence of [LetVal], [LetBlo] and [Print] instructions, + terminated with either [Exit] or [TailCall]. This implies, in + particular, that every call is a tail call. + + In contrast with the surface language, where every lambda-abstraction has + arity 1, in this calculus, lambda-abstractions of arbitrary arity are + supported. A lambda-abstraction [Lam] carries a list of formal arguments + and a function call [TailCall] carries a list of actual arguments. Partial + applications or over-applications are not supported: it is the programmer's + responsibility to ensure that every function call provides exactly as many + arguments as expected by the called function. *) + +type variable = + Atom.atom + +and self = Lambda.self = + | Self of variable + | NoSelf + +and binop = Lambda.binop = + | OpAdd + | OpSub + | OpMul + | OpDiv + +and value = + | VVar of variable + | VLit of int + | VBinOp of value * binop * value + +and block = + | Lam of self * variable list * term + +(* Terms include the following constructs: + + - The primitive operation [Exit] stops the program. + + - The tail call [TailCall (v, vs)] transfers control to the function [v] + with actual arguments [vs]. (The value [v] should be a function and its + arity should be the length of [vs].) + + - The term [Print (v, t)] prints the value [v], then executes the term [t]. + (The value [v] should be a primitive integer value.) + + - The term [LetVal (x, v, t)] binds the variable [x] to the value [v], then + executes the term [t]. + + - The term [LetBlo (x, b, t)] allocates the memory block [b] and binds the + variable [x] to its address, then executes the term [t]. *) + +and term = + | Exit + | TailCall of value * value list + | Print of value * term + | LetVal of variable * value * term + | LetBlo of variable * block * term + +[@@deriving show { with_path = false }] + +(* -------------------------------------------------------------------------- *) + +(* Constructor functions. *) + +let vvar x = + VVar x + +let vvars xs = + List.map vvar xs + +(* -------------------------------------------------------------------------- *) + +(* Computing the free variables of a value, block, or term. *) + +open Atom.Set + +let rec fv_value (v : value) = + match v with + | VVar x -> + singleton x + | VLit _ -> + empty + | VBinOp (v1, _, v2) -> + union (fv_value v1) (fv_value v2) + +and fv_values (vs : value list) = + union_many fv_value vs + +and fv_lambda (xs : variable list) (t : term) = + diff (fv_term t) (of_list xs) + +and fv_block (b : block) = + match b with + | Lam (NoSelf, xs, t) -> + fv_lambda xs t + | Lam (Self f, xs, t) -> + remove f (fv_lambda xs t) + +and fv_term (t : term) = + match t with + | Exit -> + empty + | TailCall (v, vs) -> + fv_values (v :: vs) + | Print (v1, t2) -> + union (fv_value v1) (fv_term t2) + | LetVal (x, v1, t2) -> + union + (fv_value v1) + (remove x (fv_term t2)) + | LetBlo (x, b1, t2) -> + union + (fv_block b1) + (remove x (fv_term t2)) diff --git a/projet/src/Top.ml b/projet/src/Top.ml new file mode 100644 index 0000000..edbb0fb --- /dev/null +++ b/projet/src/Top.ml @@ -0,0 +1,94 @@ +(* This intermediate language describes the result of defunctionalization. + It retains the key features of the previous calculus, [Tail], in that + the ordering of computations is explicit and every function call is a + tail call. Furthermore, lambda-abstractions disappear. A memory block + [Con] now contains an integer tag followed with a number of fields, + which hold values. A [switch] construct appears, which allows testing + the tag of a memory block. A number of (closed, mutually recursive) + functions can be defined at the top level. *) + +type tag = + int + +and variable = + Atom.atom + +and binop = Tail.binop = + | OpAdd + | OpSub + | OpMul + | OpDiv + +and value = Tail.value = + | VVar of variable + | VLit of int + | VBinOp of value * binop * value + +(* A block contains an integer tag, followed with a number of fields. *) + +and block = + | Con of tag * value list + +(* The construct [Swi (v, branches)] reads the integer tag stored in the + memory block at address [v] and performs a case analysis on this tag, + transferring control to the appropriate branch. (The value [v] should be a + pointer to a memory block.) *) + +and term = + | Exit + | TailCall of variable * value list + | Print of value * term + | LetVal of variable * value * term + | LetBlo of variable * block * term + | Swi of value * branch list + +(* A branch [tag xs -> t] is labeled with an integer tag [tag], and is + executed if the memory block carries this tag. The variables [xs] are + then bounds to the fields of the memory block. (The length of the list + [xs] should be the number of fields of the memory block.) *) + +and branch = + | Branch of tag * variable list * term + +(* A toplevel function declaration mentions the function's name, formal + parameters, and body. *) + +and function_declaration = + | Fun of variable * variable list * term + +(* A complete program consits of a set of toplevel function declarations + and a term (the "main program"). The functions are considered mutually + recursive: every function may refer to every function. *) + +and program = + | Prog of function_declaration list * term + +[@@deriving show { with_path = false }] + +(* -------------------------------------------------------------------------- *) + +(* Constructor functions. *) + +let vvar = + Tail.vvar + +let vvars = + Tail.vvars + +(* [let x_1 = v_1 in ... let x_n = v_n in t] *) + +let rec sequential_let (xs : variable list) (vs : value list) (t : term) = + match xs, vs with + | [], [] -> + t + | x :: xs, v :: vs -> + LetVal (x, v, sequential_let xs vs t) + | _ -> + assert false + +(* [let x_1 = v_1 and ... x_n = v_n in t] *) + +let parallel_let (xs : variable list) (vs : value list) (t : term) = + assert (List.length xs = List.length vs); + assert (Atom.Set.disjoint (Atom.Set.of_list xs) (Tail.fv_values vs)); + sequential_let xs vs t diff --git a/projet/src/_tags b/projet/src/_tags new file mode 100644 index 0000000..bf1bddf --- /dev/null +++ b/projet/src/_tags @@ -0,0 +1,8 @@ +true: \ + debug, \ + strict_sequence, \ + warn(A-3-4-30-44-42-45-50), \ + package(unix), \ + package(process), \ + package(pprint), \ + package(ppx_deriving.std) diff --git a/projet/src/alphalib/Atom.ml b/projet/src/alphalib/Atom.ml new file mode 100644 index 0000000..6502410 --- /dev/null +++ b/projet/src/alphalib/Atom.ml @@ -0,0 +1,215 @@ +(* -------------------------------------------------------------------------- *) + +(* We impose maximal sharing on strings so as to reduce the total amount of + space that they occupy. This is done using a weak hash set. *) + +module StringStorage = + Weak.Make(struct + type t = string + let equal (s1 : string) (s2 : string) = (s1 = s2) + let hash = Hashtbl.hash + end) + +let share : string -> string = + StringStorage.merge (StringStorage.create 128) + +(* -------------------------------------------------------------------------- *) + +(* Removing any trailing digits in a string. *) + +let is_digit c = + Char.code '0' <= Char.code c && Char.code c <= Char.code '9' + +let remove_trailing_digits (s : string) : string = + let n = ref (String.length s) in + while !n > 0 && is_digit s.[!n-1] do n := !n-1 done; + (* We assume that there is at least one non-digit character in the string. *) + assert (!n > 0); + String.sub s 0 !n + +(* -------------------------------------------------------------------------- *) + +(* An atom is implemented as a pair of an integer identity and a string that + serves as a printing hint. *) + +(* We maintain the invariant that a hint is nonempty and does not end in a + digit. This allows us to later produce unique identifiers, without risk of + collisions, by concatenating a hint and a unique number. *) + +(* To preserve space, hints are maximally shared. This is not essential for + correctness, though. *) + +type atom = { identity: int; hint: string } + +and t = atom + [@@deriving show { with_path = false }] + +let identity a = + a.identity + +let hint a = + a.hint + +(* -------------------------------------------------------------------------- *) + +(* A global integer counter holds the next available identity. *) + +let counter = + ref 0 + +let allocate () = + let number = !counter in + counter := number + 1; + assert (number >= 0); + number + +(* [fresh hint] produces a fresh atom. *) + +(* The argument [hint] must not be a string of digits. *) + +let fresh hint = + let identity = allocate() + and hint = share (remove_trailing_digits hint) in + { identity; hint } + +(* [copy a] returns a fresh atom modeled after the atom [a]. *) + +let copy a = + fresh a.hint + +(* -------------------------------------------------------------------------- *) + +(* Comparison of atoms. *) + +let equal a b = + a.identity = b.identity + +let compare a b = + (* Identities are always positive numbers (see [allocate] above) + so I believe overflow is impossible here. *) + a.identity - b.identity + +let hash a = + Hashtbl.hash a.identity + +(* -------------------------------------------------------------------------- *) + +(* A scratch buffer for printing. *) + +let scratch = + Buffer.create 1024 + +(* [print_separated_sequence] prints a sequence of elements into the [scratch] + buffer. The sequence is given by the higher-order iterator [iter], applied + to the collection [xs]. The separator is the string [sep]. Each element is + transformed to a string by the function [show]. *) + +let print_separated_sequence show sep iter xs : unit = + let first = ref true in + iter (fun x -> + if !first then begin + Buffer.add_string scratch (show x); + first := false + end + else begin + Buffer.add_string scratch sep; + Buffer.add_string scratch (show x) + end + ) xs + +(* -------------------------------------------------------------------------- *) + +(* Sets and maps. *) + +module Order = struct + type t = atom + let compare = compare +end + +module Set = struct + + include Set.Make(Order) + + (* A disjointness test. *) + + let disjoint xs ys = + is_empty (inter xs ys) + + (* Iterated union. *) + + let union_many (f : 'a -> t) (xs : 'a list) : t = + List.fold_left (fun accu x -> + union accu (f x) + ) empty xs + + (* Disjoint union. *) + + exception NonDisjointUnion of atom + + let disjoint_union xs ys = + match choose (inter xs ys) with + | exception Not_found -> + (* The intersection of [xs] and [ys] is empty. Return their union. *) + union xs ys + | x -> + (* The intersection contains [x]. Raise an exception. *) + raise (NonDisjointUnion x) + + let handle_NonDisjointUnion f x = + try + f x; true + with NonDisjointUnion a -> + Printf.eprintf "NonDisjointUnion: %s\n%!" (show a); + false + + (* Sets of atoms form a monoid under union. *) + + class ['z] union_monoid = object + method zero: 'z = empty + method plus: 'z -> 'z -> 'z = union + end + + (* Sets of atoms form a monoid under disjoint union. *) + + class ['z] disjoint_union_monoid = object + method zero: 'z = empty + method plus: 'z -> 'z -> 'z = disjoint_union + end + + (* These printing functions should be used for debugging purposes only. *) + + let print_to_scratch xs = + Buffer.clear scratch; + Buffer.add_string scratch "{"; + print_separated_sequence show ", " iter xs; + Buffer.add_string scratch "}" + + let show xs = + print_to_scratch xs; + let result = Buffer.contents scratch in + Buffer.reset scratch; + result + + let print oc xs = + print_to_scratch xs; + Buffer.output_buffer oc scratch; + Buffer.reset scratch + +end + +module Map = struct + + include Map.Make(Order) + + (* This is O(nlog n), whereas in principle O(n) is possible. + The abstraction barrier in OCaml's [Set] module hinders us. *) + let domain m = + fold (fun a _ accu -> Set.add a accu) m Set.empty + + let codomain f m = + fold (fun _ v accu -> Set.union (f v) accu) m Set.empty + +end + +type renaming = + atom Map.t diff --git a/projet/src/alphalib/Atom.mli b/projet/src/alphalib/Atom.mli new file mode 100644 index 0000000..6ec6206 --- /dev/null +++ b/projet/src/alphalib/Atom.mli @@ -0,0 +1,71 @@ +(* TEMPORARY document *) + +(* An atom is a pair of a unique integer identity and a (not necessarily + unique) string. *) + +type atom + +and t = atom + [@@deriving show] + +val identity: atom -> int +val hint: atom -> string + +(* Producing fresh atoms. *) + +val fresh: string -> atom +val copy: atom -> atom + +(* Comparison of atoms. *) + +val equal: atom -> atom -> bool +val compare: atom -> atom -> int +val hash: atom -> int + +(* Sets. *) + +module Set : sig + include Set.S with type elt = atom + + val disjoint: t -> t -> bool + + val union_many: ('a -> t) -> 'a list -> t + + (* Disjoint union. *) + + exception NonDisjointUnion of atom + val disjoint_union: t -> t -> t + + val handle_NonDisjointUnion: ('a -> unit) -> 'a -> bool + + (* Sets of atoms form monoids under union and disjoint union. *) + + class ['z] union_monoid : object + constraint 'z = t + method zero: 'z + method plus: 'z -> 'z -> 'z + end + + class ['z] disjoint_union_monoid : object + constraint 'z = t + method zero: 'z + method plus: 'z -> 'z -> 'z + end + + val show: t -> string + val print: out_channel -> t -> unit +end + +(* Maps. *) + +module Map : sig + + include Map.S with type key = atom + + val domain: 'a t -> Set.t + val codomain: ('a -> Set.t) -> 'a t -> Set.t + +end + +type renaming = + atom Map.t diff --git a/projet/src/kremlin/C.ml b/projet/src/kremlin/C.ml new file mode 100644 index 0000000..db29569 --- /dev/null +++ b/projet/src/kremlin/C.ml @@ -0,0 +1,126 @@ + + +module K = Constant +open Common + +(* This pretty-printer based on: http:/ /en.cppreference.com/w/c/language/declarations + * Many cases are omitted from this bare-bones C grammar; hopefully, to be extended. *) +type type_spec = + | Int of Constant.width + | Void + | Named of ident + | Struct of ident option * declaration list option + (** Note: the option allows for zero-sized structs (GCC's C, C++) but as + * of 2017/05/14 we never generate these. *) + | Union of ident option * declaration list + | Enum of ident option * ident list + (** not encoding all the invariants here *) + [@@deriving show { with_path = false }] + +and storage_spec = + | Typedef + | Extern + | Static + +and declarator_and_init = + declarator * init option + +and declarator_and_inits = + declarator_and_init list + +and declarator = + | Ident of ident + | Pointer of declarator + | Array of declarator * expr + | Function of calling_convention option * declarator * params + +and expr = + | Op1 of K.op * expr + | Op2 of K.op * expr * expr + | Index of expr * expr + | Deref of expr + | Address of expr + | Member of expr * expr + | MemberP of expr * expr + | Assign of expr * expr + (** not covering *=, +=, etc. *) + | Call of expr * expr list + | Name of ident + | Cast of type_name * expr + | Literal of string + | Constant of K.t + | Bool of bool + | Sizeof of expr + | SizeofType of type_spec + | CompoundLiteral of type_name * init list + | MemberAccess of expr * ident + | MemberAccessPointer of expr * ident + | InlineComment of string * expr * string + | Type of type_name + (** note: these two not in the C grammar *) + +(** this is a WILD approximation of the notion of "type name" in C _and_ a hack + * because there's the invariant that the ident found at the bottom of the + * [declarator] is irrelevant... *) +and type_name = + type_spec * declarator + +and params = + (* No support for old syntax, e.g. K&R, or [void f(void)]. *) + param list + +and param = + (** Also approximate. *) + type_spec * declarator + +and declaration = + type_spec * storage_spec option * declarator_and_inits + +and ident = + string + +and init = + | InitExpr of expr + | Designated of designator * init + | Initializer of init list + +and designator = + | Dot of ident + | Bracket of int + +(** Note: according to http:/ /en.cppreference.com/w/c/language/statements, + * declarations can only be part of a compound statement... we do not enforce + * this invariant via the type [stmt], but rather check it at runtime (see + * [mk_compound_if]), as the risk of messing things up, naturally. *) +type stmt = + | Compound of stmt list + | DeclStmt of declaration + | Expr of expr + | If of expr * stmt + | IfElse of expr * stmt * stmt + | While of expr * stmt + | For of declaration_or_expr * expr * expr * stmt + | Return of expr option + | Switch of expr * (expr * stmt) list * stmt + (** the last component is the default statement *) + | Break + | Comment of string + (** note: this is not in the C grammar *) + +and program = + declaration_or_function list + +and comment = + string + +and declaration_or_function = + | Decl of comment list * declaration + | Function of comment list * bool * declaration * stmt + (** [stmt] _must_ be a compound statement; boolean is inline *) + +and declaration_or_expr = [ + | `Decl of declaration + | `Expr of expr + | `Skip +] +[@@deriving show { with_path = false }] diff --git a/projet/src/kremlin/Common.ml b/projet/src/kremlin/Common.ml new file mode 100644 index 0000000..77638d7 --- /dev/null +++ b/projet/src/kremlin/Common.ml @@ -0,0 +1,19 @@ +type calling_convention = + | StdCall + | CDecl + | FastCall + [@@deriving show { with_path = false }] + +type lifetime = + | Eternal + | Stack + [@@deriving show { with_path = false }] + +type flag = + | Private + | NoExtract + | CInline + | Substitute + | GcType + | Comment of string + [@@deriving show { with_path = false }] diff --git a/projet/src/kremlin/Constant.ml b/projet/src/kremlin/Constant.ml new file mode 100644 index 0000000..5533d38 --- /dev/null +++ b/projet/src/kremlin/Constant.ml @@ -0,0 +1,66 @@ +(** Machine integers. Don't repeat the same thing everywhere. *) + +type t = width * string + [@@deriving show] + +and width = + | UInt8 | UInt16 | UInt32 | UInt64 | Int8 | Int16 | Int32 | Int64 + | Bool + | CInt (** Checked signed integers. *) + +let bytes_of_width (w: width) = + match w with + | UInt8 -> 1 + | UInt16 -> 2 + | UInt32 -> 4 + | UInt64 -> 8 + | Int8 -> 1 + | Int16 -> 2 + | Int32 -> 4 + | Int64 -> 8 + | CInt -> 4 + | _ -> invalid_arg "bytes_of_width" + +type op = + (* Arithmetic operations *) + | Add | AddW | Sub | SubW | Div | DivW | Mult | MultW | Mod + (* Bitwise operations *) + | BOr | BAnd | BXor | BShiftL | BShiftR | BNot + (* Arithmetic comparisons / boolean comparisons *) + | Eq | Neq | Lt | Lte | Gt | Gte + (* Boolean operations *) + | And | Or | Xor | Not + (* Effectful operations *) + | Assign | PreIncr | PreDecr | PostIncr | PostDecr + (* Misc *) + | Comma + [@@deriving show { with_path = false }] + +let unsigned_of_signed = function + | Int8 -> UInt8 + | Int16 -> UInt16 + | Int32 -> UInt32 + | Int64 -> UInt64 + | CInt | UInt8 | UInt16 | UInt32 | UInt64 | Bool -> raise (Invalid_argument "unsigned_of_signed") + +let is_signed = function + | Int8 | Int16 | Int32 | Int64 | CInt -> true + | UInt8 | UInt16 | UInt32 | UInt64 -> false + | Bool -> raise (Invalid_argument "is_signed") + +let is_unsigned w = not (is_signed w) + +let without_wrap = function + | AddW -> Add + | SubW -> Sub + | MultW -> Mult + | DivW -> Div + | _ -> raise (Invalid_argument "without_wrap") + +let uint8_of_int i = + assert (i < (1 lsl 8) && i >= 0); + UInt8, string_of_int i + +let uint32_of_int i = + assert (i < (1 lsl 32) && i >= 0); + UInt32, string_of_int i diff --git a/projet/src/kremlin/Options.ml b/projet/src/kremlin/Options.ml new file mode 100644 index 0000000..fd6bfbf --- /dev/null +++ b/projet/src/kremlin/Options.ml @@ -0,0 +1,7 @@ +(* By default, the C printer inserts a minimal amount of parentheses. + However, this can trigger GCC and Clang's -Wparentheses warning, + so there is an option to produce more parentheses than strictly + necessary. *) + +let parentheses = + ref false diff --git a/projet/src/kremlin/PrintC.ml b/projet/src/kremlin/PrintC.ml new file mode 100644 index 0000000..34583ee --- /dev/null +++ b/projet/src/kremlin/PrintC.ml @@ -0,0 +1,354 @@ +(** Pretty-printer that conforms with C syntax. Also defines the grammar of + * concrete C syntax, as opposed to our idealistic, well-formed C*. *) + +open PPrint +open PrintCommon +open C + +(* Pretty-printing of actual C syntax *****************************************) + +let p_storage_spec = function + | Typedef -> string "typedef" + | Extern -> string "extern" + | Static -> string "static" + +let rec p_type_spec = function + | Int w -> print_width w ^^ string "_t" + | Void -> string "void" + | Named s -> string s + | Union (name, decls) -> + group (string "union" ^/^ + (match name with Some name -> string name ^^ break1 | None -> empty)) ^^ + braces_with_nesting (separate_map hardline (fun p -> group (p_declaration p ^^ semi)) decls) + | Struct (name, decls) -> + group (string "struct" ^/^ + (match name with Some name -> string name | None -> empty)) ^^ + (match decls with + | Some decls -> + break1 ^^ braces_with_nesting (separate_map hardline (fun p -> group (p_declaration p ^^ semi)) decls) + | None -> + empty) + | Enum (name, tags) -> + group (string "enum" ^/^ + (match name with Some name -> string name ^^ break1 | None -> empty)) ^^ + braces_with_nesting (separate_map (comma ^^ break1) string tags) + + +and p_type_declarator d = + let rec p_noptr = function + | Ident n -> + string n + | Array (d, s) -> + p_noptr d ^^ lbracket ^^ p_expr s ^^ rbracket + | Function (cc, d, params) -> + let cc = match cc with Some cc -> print_cc cc ^^ break1 | None -> empty in + group (cc ^^ p_noptr d ^^ parens_with_nesting (separate_map (comma ^^ break 1) (fun (spec, decl) -> + group (p_type_spec spec ^/^ p_any decl) + ) params)) + | d -> + lparen ^^ p_any d ^^ rparen + and p_any = function + | Pointer d -> + star ^^ p_any d + | d -> + p_noptr d + in + p_any d + +and p_type_name (spec, decl) = + match decl with + | Ident "" -> + p_type_spec spec + | _ -> + p_type_spec spec ^^ space ^^ p_type_declarator decl + +(* http:/ /en.cppreference.com/w/c/language/operator_precedence *) +and prec_of_op2 op = + let open Constant in + match op with + | AddW | SubW | MultW | DivW -> failwith "[prec_of_op]: should've been desugared" + | Add -> 4, 4, 4 + | Sub -> 4, 4, 3 + | Div -> 3, 3, 2 + | Mult -> 3, 3, 3 + | Mod -> 3, 3, 2 + | BOr -> 10, 10, 10 + | BAnd -> + 8, 8, 8 + | BXor | Xor -> 9, 9, 9 + | BShiftL | BShiftR -> + 5, 5, 4 + | Eq | Neq -> 7, 7, 7 + | Lt | Lte | Gt | Gte -> 6, 6, 5 + | And -> 11, 11, 11 + | Or -> 12, 12, 12 + | Assign -> 14, 13, 14 + | Comma -> 15, 15, 14 + | PreIncr | PostIncr | PreDecr | PostDecr | Not | BNot -> raise (Invalid_argument "prec_of_op2") + +and prec_of_op1 op = + let open Constant in + match op with + | PreDecr | PreIncr | Not | BNot -> 2 + | PostDecr | PostIncr -> 1 + | _ -> raise (Invalid_argument "prec_of_op1") + +and is_prefix op = + let open Constant in + match op with + | PreDecr | PreIncr | Not | BNot -> true + | PostDecr | PostIncr -> false + | _ -> raise (Invalid_argument "is_prefix") + +(* The precedence level [curr] is the maximum precedence the current node should + * have. If it doesn't, then it should be parenthesized. Lower numbers bind + * tighter. *) +and paren_if curr mine doc = + if curr < mine then + group (lparen ^^ doc ^^ rparen) + else + doc + +(* [e] is an operand of [op]; is this likely to trigger GCC's -Wparentheses? If + * so, downgrade the current precedence to 0 to force parenthses. *) +and defeat_Wparentheses op e prec = + let open Constant in + if not !Options.parentheses then + prec + else match op, e with + | (BShiftL | BShiftR | BXor | BOr | BAnd), Op2 ((Add | Sub | BOr | BXor), _, _) -> + 0 + | _ -> + prec + +and p_expr' curr = function + | Op1 (op, e1) -> + let mine = prec_of_op1 op in + let e1 = p_expr' mine e1 in + paren_if curr mine (if is_prefix op then print_op op ^^ e1 else e1 ^^ print_op op) + | Op2 (op, e1, e2) -> + let mine, left, right = prec_of_op2 op in + let left = defeat_Wparentheses op e1 left in + let right = defeat_Wparentheses op e2 right in + let e1 = p_expr' left e1 in + let e2 = p_expr' right e2 in + paren_if curr mine (e1 ^/^ print_op op ^^ jump e2) + | Index (e1, e2) -> + let mine, left, right = 1, 1, 15 in + let e1 = p_expr' left e1 in + let e2 = p_expr' right e2 in + paren_if curr mine (e1 ^^ lbracket ^^ e2 ^^ rbracket) + | Assign (e1, e2) -> + let mine, left, right = 14, 13, 14 in + let e1 = p_expr' left e1 in + let e2 = p_expr' right e2 in + paren_if curr mine (group (e1 ^/^ equals) ^^ jump e2) + | Call (e, es) -> + let mine, left, arg = 1, 1, 14 in + let e = p_expr' left e in + let es = nest 2 (separate_map (comma ^^ break 1) (fun e -> group (p_expr' arg e)) es) in + paren_if curr mine (e ^^ lparen ^^ es ^^ rparen) + | Literal s -> + dquote ^^ string s ^^ dquote + | Constant (w, s) -> + string s ^^ if K.is_unsigned w then string "U" else empty + | Name s -> + string s + | Cast (t, e) -> + let mine, right = 2, 2 in + let e = group (p_expr' right e) in + let t = p_type_name t in + paren_if curr mine (lparen ^^ t ^^ rparen ^^ e) + | Type t -> + p_type_name t + | Sizeof e -> + let mine, right = 2, 2 in + let e = p_expr' right e in + paren_if curr mine (string "sizeof" ^^ space ^^ e) + | SizeofType t -> + string "sizeof" ^^ group (lparen ^^ p_type_spec t ^^ rparen) + | Address e -> + let mine, right = 2, 2 in + let e = p_expr' right e in + paren_if curr mine (ampersand ^^ e) + | Deref e -> + let mine, right = 2, 2 in + let e = p_expr' right e in + paren_if curr mine (star ^^ e) + | Member _ | MemberP _ -> + failwith "[p_expr']: not implemented" + | Bool b -> + string (string_of_bool b) + | CompoundLiteral (t, init) -> + (* NOTE: always parenthesize compound literal no matter what, because GCC + * parses an application of a function to a compound literal as an n-ary + * application. *) + parens_with_nesting ( + lparen ^^ p_type_name t ^^ rparen ^^ + braces_with_nesting (separate_map (comma ^^ break1) p_init init) + ) + | MemberAccess (expr, member) -> + p_expr' 1 expr ^^ dot ^^ string member + | MemberAccessPointer (expr, member) -> + p_expr' 1 expr ^^ string "->" ^^ string member + | InlineComment (s, e, s') -> + surround 2 1 (p_comment s) (p_expr' curr e) (p_comment s') + +and p_comment s = + (* TODO: escape *) + string "/* " ^^ nest 2 (flow space (words s)) ^^ string " */" + + +and p_expr e = p_expr' 15 e + +and p_init (i: init) = + match i with + | Designated (designator, i) -> + group (p_designator designator ^^ space ^^ equals ^^ space ^^ p_init i) + | InitExpr e -> + p_expr' 14 e + | Initializer inits -> + let inits = + if List.length inits > 4 then + flow (comma ^^ break1) (List.map p_init inits) + else + separate_map (comma ^^ break1) p_init inits + in + braces_with_nesting inits + +and p_designator = function + | Dot ident -> + dot ^^ string ident + | Bracket i -> + lbracket ^^ int i ^^ rbracket + +and p_decl_and_init (decl, init) = + group (p_type_declarator decl ^^ match init with + | Some init -> + space ^^ equals ^^ jump (p_init init) + | None -> + empty) + +and p_declaration (spec, stor, decl_and_inits) = + let stor = match stor with Some stor -> p_storage_spec stor ^^ space | None -> empty in + stor ^^ group (p_type_spec spec) ^/^ + separate_map (comma ^^ break 1) p_decl_and_init decl_and_inits + +(* This is abusing the definition of a compound statement to ensure it is printed with braces. *) +let nest_if f stmt = + match stmt with + | Compound _ -> + hardline ^^ f stmt + | _ -> + nest 2 (hardline ^^ f stmt) + +(* A note on the classic dangling else problem. Remember that this is how things + * are parsed (note the indentation): + * + * if (foo) + * if (bar) + * ... + * else + * ... + * + * And remember that this needs braces: + * + * if (foo) { + * if (bar) + * ... + * } else + * ... + * + * [protect_solo_if] adds braces to the latter case. However, GCC, unless + * -Wnoparentheses is given, will produce a warning for the former case. + * [protect_ite_if_needed] adds braces to the former case, when the user has + * requested the extra, unnecessary parentheses needed to silence -Wparentheses. + * *) +let protect_solo_if s = + match s with + | If _ -> Compound [ s ] + | _ -> s + +let protect_ite_if_needed s = + match s with + | IfElse _ when !Options.parentheses -> Compound [ s ] + | _ -> s + +let p_or p x = + match x with + | Some x -> p x + | None -> empty + +let rec p_stmt (s: stmt) = + (* [p_stmt] is responsible for appending [semi] and calling [group]! *) + match s with + | Compound stmts -> + lbrace ^^ nest 2 (hardline ^^ separate_map hardline p_stmt stmts) ^^ + hardline ^^ rbrace + | Expr expr -> + group (p_expr expr ^^ semi) + | Comment s -> + group (string "/*" ^/^ separate break1 (words s) ^/^ string "*/") + | For (decl, e2, e3, stmt) -> + let init = match decl with + | `Decl decl -> p_declaration decl + | `Expr expr -> p_expr expr + | `Skip -> empty + in + group (string "for" ^/^ lparen ^^ nest 2 ( + init ^^ semi ^^ break1 ^^ + p_expr e2 ^^ semi ^^ break1 ^^ + p_expr e3 + ) ^^ rparen) ^^ nest_if p_stmt stmt + | If (e, stmt) -> + group (string "if" ^/^ lparen ^^ p_expr e ^^ rparen) ^^ + nest_if p_stmt (protect_ite_if_needed stmt) + | IfElse (e, s1, s2) -> + group (string "if" ^/^ lparen ^^ p_expr e ^^ rparen) ^^ + nest_if p_stmt (protect_solo_if s1) ^^ hardline ^^ + string "else" ^^ + (match s2 with + | If _ | IfElse _ -> + space ^^ p_stmt s2 + | _ -> + nest_if p_stmt s2) + | While (e, s) -> + group (string "while" ^/^ lparen ^^ p_expr e ^^ rparen) ^^ + nest_if p_stmt s + | Return None -> + group (string "return" ^^ semi) + | Return (Some e) -> + group (string "return" ^^ jump (p_expr e ^^ semi)) + | DeclStmt d -> + group (p_declaration d ^^ semi) + | Switch (e, branches, default) -> + group (string "switch" ^/^ lparen ^^ p_expr e ^^ rparen) ^/^ + braces_with_nesting ( + separate_map hardline (fun (e, s) -> + group (string "case" ^/^ p_expr e ^^ colon) ^^ nest 2 ( + hardline ^^ p_stmt s + ) + ) branches ^^ hardline ^^ + string "default:" ^^ nest 2 ( + hardline ^^ p_stmt default + ) + ) + | Break -> + string "break" ^^ semi + +let p_comments cs = + separate_map hardline (fun c -> string ("/*\n" ^ c ^ "\n*/")) cs ^^ + if List.length cs > 0 then hardline else empty + +let p_decl_or_function (df: declaration_or_function) = + match df with + | Decl (comments, d) -> + p_comments comments ^^ + group (p_declaration d ^^ semi) + | Function (comments, inline, d, stmt) -> + p_comments comments ^^ + let inline = if inline then string "inline" ^^ space else empty in + inline ^^ group (p_declaration d) ^/^ p_stmt stmt + +let print_files = + PrintCommon.print_files p_decl_or_function diff --git a/projet/src/kremlin/PrintCommon.ml b/projet/src/kremlin/PrintCommon.ml new file mode 100644 index 0000000..84e2b40 --- /dev/null +++ b/projet/src/kremlin/PrintCommon.ml @@ -0,0 +1,96 @@ +open PPrint +open Constant +open Common + +let break1 = break 1 + +let jump ?(indent=2) body = + jump indent 1 body + +let parens_with_nesting contents = + surround 2 0 lparen contents rparen + +let braces_with_nesting contents = + surround 2 1 lbrace contents rbrace + +let int i = string (string_of_int i) + +let print_width = function + | UInt8 -> string "uint8" + | UInt16 -> string "uint16" + | UInt32 -> string "uint32" + | UInt64 -> string "uint64" + | CInt -> string "krml_checked_int" + | Int8 -> string "int8" + | Int16 -> string "int16" + | Int32 -> string "int32" + | Int64 -> string "int64" + | Bool -> string "bool" + +let print_constant = function + | w, s -> string s ^^ print_width w + +let print_op = function + | Add -> string "+" + | AddW -> string "+w" + | Sub -> string "-" + | SubW -> string "-" + | Div -> string "/" + | DivW -> string "/w" + | Mult -> string "*" + | MultW -> string "*w" + | Mod -> string "%" + | BOr -> string "|" + | BAnd -> string "&" + | BXor -> string "^" + | BNot -> string "~" + | BShiftL -> string "<<" + | BShiftR -> string ">>" + | Eq -> string "==" + | Neq -> string "!=" + | Lt -> string "<" + | Lte -> string "<=" + | Gt -> string ">" + | Gte -> string ">=" + | And -> string "&&" + | Or -> string "||" + | Xor -> string "^" + | Not -> string "!" + | PostIncr | PreIncr -> string "++" + | PostDecr | PreDecr -> string "--" + | Assign -> string "=" + | Comma -> string "," + +let print_cc = function + | CDecl -> string "__cdecl" + | StdCall -> string "__stdcall" + | FastCall -> string "__fastcall" + +let print_lident (idents, ident) = + separate_map dot string (idents @ [ ident ]) + +let print_program p decls = + separate_map (hardline ^^ hardline) p decls + +let print_files print_decl files = + separate_map hardline (fun (f, p) -> + string (String.uppercase f) ^^ colon ^^ jump (print_program print_decl p) + ) files + +let printf_of_pprint f = + fun buf t -> + PPrint.ToBuffer.compact buf (f t) + +let printf_of_pprint_pretty f = + fun buf t -> + PPrint.ToBuffer.pretty 0.95 Utils.twidth buf (f t) + +let pdoc buf d = + PPrint.ToBuffer.compact buf d + +let english_join s = + match List.rev s with + | [] -> empty + | [ x ] -> x + | last :: first -> + group (separate (comma ^^ break1) (List.rev first) ^/^ string "and" ^/^ last) diff --git a/projet/src/kremlin/Utils.ml b/projet/src/kremlin/Utils.ml new file mode 100644 index 0000000..1ac1256 --- /dev/null +++ b/projet/src/kremlin/Utils.ml @@ -0,0 +1,73 @@ +let try_finally f h = let result = + try + f () + with e -> + h (); + raise e + in + h (); + result + +let with_open_in file_path f = + let c = open_in_bin file_path in + try_finally (fun () -> + f c + ) (fun () -> + close_in c + ) + +let with_open_out file_path f = + let c = open_out file_path in + try_finally (fun () -> + f c + ) (fun () -> + close_out c + ) + + +let cp dst src = with_open_out dst (fun oc -> + with_open_in src (fun ic -> + let buf = Bytes.create 2048 in + while + let l = input ic buf 0 2048 in + if l > 0 then begin + output oc buf 0 l; + true + end else + false + do () done + )) + + +let read ic = + let buf = Buffer.create 4096 in + let s = String.create 2048 in + while begin + let l = input ic s 0 (String.length s) in + if l > 0 then begin + Buffer.add_string buf (String.sub s 0 l); + true + end else begin + false + end + end do () done; + Buffer.contents buf + +let file_get_contents f = + with_open_in f read + +(** Sniff the size of the terminal for optimal use of the width. *) +let theight, twidth = + let height, width = ref 0, ref 0 in + match + Scanf.sscanf (List.hd (Process.read_stdout "stty" [|"size"|])) "%d %d" (fun h w -> + height := h; + width := w); + !height, !width + with + | exception _ -> + 24, 80 + | 0, 0 -> + 24, 80 + | h, w -> + h, w diff --git a/projet/src/prologue.h b/projet/src/prologue.h new file mode 100644 index 0000000..239161f --- /dev/null +++ b/projet/src/prologue.h @@ -0,0 +1,83 @@ +/* A forward declaration of [block] -- see below. */ + +struct block; + +/* -------------------------------------------------------------------------- */ + +/* The type [univ] is the universal type of the values that we manipulate. + A value is either an integer or a pointer to a heap-allocated memory + block. A C union is used to represent this disjunction. There is no tag + to distinguish between the two alternatives! The source program had + better be well-typed. */ + +typedef union { + + /* Either this is an integer... */ + int literal; + + /* ... or this is a pointer to a block. */ + struct block* pointer; + +} univ; + +/* -------------------------------------------------------------------------- */ + +/* The struct [block] describes the uniform layout of a heap-allocated + memory block. A block begins with an integer tag and continues with a + sequence of fields of type [univ]. */ + +struct block { + + /* Every memory block begins with an integer tag. */ + int tag; + + /* Then, we have a sequence of fields, whose number depends on the tag. + This idiom is known in C99 as a flexible array member. */ + univ data[]; + +}; + +/* -------------------------------------------------------------------------- */ + +/* Basic operations on memory blocks. */ + +/* The macro [ALLOC(n)] allocates a block of [n] fields, and is used in a + context where an expression of type [univ] is expected. We use a C + "compound literal" containing a "designated initializer" to indicate + that we wish to choose the "pointer" side of the union. We implicitly + assume that the compiler inserts no padding between the "tag" and "data" + parts of a memory block, so [(n + 1) * sizeof(univ)] is enough space to + hold a block of [n] fields. */ + +#define ALLOC(n) \ + (univ) { .pointer = malloc((n + 1) * sizeof(univ)) } + +/* In the following macros, [u] has type [univ], so [u.pointer] has type + [struct block] and is (or should be) the address of a memory block. + [i] is a field number; the numbering of fields is 0-based. */ + +#define GET_TAG(u) \ + (u.pointer->tag) + +#define SET_TAG(u,t) \ + (u.pointer->tag = t) + +#define GET_FIELD(u,i) \ + (u.pointer->data[i]) + +#define SET_FIELD(u,i,v) \ + (u.pointer->data[i]=v) + +/* -------------------------------------------------------------------------- */ + +/* Basic operations on integers. */ + +/* The macro [FROM_INT(i)] converts the integer [i] to the type [univ]. */ + +#define FROM_INT(i) \ + (univ) { .literal = i } + +/* The macro [TO_INT(u)] converts [u] to the type [int]. */ + +#define TO_INT(u) \ + u.literal diff --git a/projet/src/test/.gitignore b/projet/src/test/.gitignore new file mode 100644 index 0000000..55b60e0 --- /dev/null +++ b/projet/src/test/.gitignore @@ -0,0 +1 @@ +test.native diff --git a/projet/src/test/.merlin b/projet/src/test/.merlin new file mode 100644 index 0000000..1a1fd25 --- /dev/null +++ b/projet/src/test/.merlin @@ -0,0 +1 @@ +B _build diff --git a/projet/src/test/Makefile b/projet/src/test/Makefile new file mode 100644 index 0000000..d66fadf --- /dev/null +++ b/projet/src/test/Makefile @@ -0,0 +1,21 @@ +OCAMLBUILD := ocamlbuild -use-ocamlfind -classic-display +TARGET := test.native +TESTS := ../tests + +.PHONY: all test expected clean + +all: + @ $(OCAMLBUILD) $(TARGET) + +test: all + @ $(MAKE) -C .. + @ ./$(TARGET) --verbosity 1 + +expected: all + @ $(MAKE) -C .. + @ ./$(TARGET) --verbosity 1 --create-expected + +clean: + @ rm -f *~ *.native *.byte + @ $(OCAMLBUILD) -clean + @ rm -f $(TESTS)/*.c $(TESTS)/*.exe $(TESTS)/*.out $(TESTS)/*.err $(TESTS)/*~ diff --git a/projet/src/test/_tags b/projet/src/test/_tags new file mode 100644 index 0000000..749aa28 --- /dev/null +++ b/projet/src/test/_tags @@ -0,0 +1,3 @@ +true: \ + warn(A-44), \ + package(unix) diff --git a/projet/src/test/auxiliary.ml b/projet/src/test/auxiliary.ml new file mode 100644 index 0000000..a7bd0c4 --- /dev/null +++ b/projet/src/test/auxiliary.ml @@ -0,0 +1,138 @@ +type filename = string +type command = string + +let has_suffix suffix name = + Filename.check_suffix name suffix + +let fail format = + Printf.kprintf failwith format + +let try_finally f h = + let result = try f() with e -> h(); raise e in + h(); result + +let with_process_code_result command (f : in_channel -> 'a) : int * 'a = + let ic = Unix.open_process_in command in + set_binary_mode_in ic false; + match f ic with + | exception e -> + ignore (Unix.close_process_in ic); raise e + | result -> + match Unix.close_process_in ic with + | Unix.WEXITED code -> + code, result + | Unix.WSIGNALED _ + | Unix.WSTOPPED _ -> + 99 (* arbitrary *), result + +let with_process_result command (f : in_channel -> 'a) : 'a = + let code, result = with_process_code_result command f in + if code = 0 then + result + else + fail "Command %S failed with exit code %d." command code + +let with_open_in filename (f : in_channel -> 'a) : 'a = + let ic = open_in filename in + try_finally + (fun () -> f ic) + (fun () -> close_in_noerr ic) + +let with_open_out filename (f : out_channel -> 'a) : 'a = + let oc = open_out filename in + try_finally + (fun () -> f oc) + (fun () -> close_out_noerr oc) + +let chunk_size = + 16384 + +let exhaust (ic : in_channel) : string = + let buffer = Buffer.create chunk_size in + let chunk = Bytes.create chunk_size in + let rec loop () = + let length = input ic chunk 0 chunk_size in + if length = 0 then + Buffer.contents buffer + else begin + Buffer.add_subbytes buffer chunk 0 length; + loop() + end + in + loop() + +let read_whole_file filename = + with_open_in filename exhaust + +let absolute_directory (path : string) : string = + try + let pwd = Sys.getcwd() in + Sys.chdir path; + let result = Sys.getcwd() in + Sys.chdir pwd; + result + with Sys_error _ -> + Printf.fprintf stderr "Error: the directory %s does not seem to exist.\n" path; + exit 1 + +let get_number_of_cores () = + try match Sys.os_type with + | "Win32" -> + int_of_string (Sys.getenv "NUMBER_OF_PROCESSORS") + | _ -> + with_process_result "getconf _NPROCESSORS_ONLN" (fun ic -> + let ib = Scanf.Scanning.from_channel ic in + Scanf.bscanf ib "%d" (fun n -> n) + ) + with + | Not_found + | Sys_error _ + | Failure _ + | Scanf.Scan_failure _ + | End_of_file + | Unix.Unix_error _ -> + 1 + +let silent command : command = + command ^ " >/dev/null 2>/dev/null" + +(* [groups eq xs] segments the list [xs] into a list of groups, where several + consecutive elements belong in the same group if they are equivalent in the + sense of the function [eq]. *) + +(* The auxiliary function [groups1] deals with the case where we have an open + group [group] of which [x] is a member. The auxiliary function [group0] + deals with the case where we have no open group. [groups] is the list of + closed groups found so far, and [ys] is the list of elements that remain to + be examined. *) + +let rec groups1 eq groups x group ys = + match ys with + | [] -> + group :: groups + | y :: ys -> + if eq x y then + groups1 eq groups x (y :: group) ys + else + groups0 eq (List.rev group :: groups) (y :: ys) + +and groups0 eq groups ys = + match ys with + | [] -> + groups + | y :: ys -> + groups1 eq groups y [y] ys + +let groups eq (xs : 'a list) : 'a list list = + List.rev (groups0 eq [] xs) + +(* [sep ss] separates the nonempty strings in the list [ss] with a space, + and concatenates everything, producing a single string. *) + +let sep (ss : string list) : string = + let ss = List.filter (fun s -> String.length s > 0) ss in + match ss with + | [] -> + "" + | s :: ss -> + List.fold_left (fun s1 s2 -> s1 ^ " " ^ s2) s ss diff --git a/projet/src/test/test.ml b/projet/src/test/test.ml new file mode 100644 index 0000000..fe98195 --- /dev/null +++ b/projet/src/test/test.ml @@ -0,0 +1,288 @@ +open Sys +open Array +open List +open Filename +open Printf +open Auxiliary + +(* -------------------------------------------------------------------------- *) + +(* Settings. *) + +let create_expected = + ref false + +let verbosity = + ref 0 + +let usage = + sprintf "Usage: %s\n" argv.(0) + +let spec = Arg.align [ + "--create-expected", Arg.Set create_expected, + " recreate the expected-output files"; + "--verbosity", Arg.Int ((:=) verbosity), + " set the verbosity level (0-2)"; +] + +let () = + Arg.parse spec (fun _ -> ()) usage + +let create_expected = + !create_expected + +let verbosity = + !verbosity + +(* -------------------------------------------------------------------------- *) + +(* Logging. *) + +(* 0 is minimal verbosity; + 1 shows some progress messages; + 2 is maximal verbosity. *) + +let log level format = + kprintf (fun s -> + if level <= verbosity then + print_string s + ) format + +(* Extend [fail] to display an information message along the way. + The message is immediately emitted by the worker, depending on + the verbosity level, whereas the failure message is sent back + to the master. *) + +let fail id format = + log 1 "[FAIL] %s\n%!" id; + fail format + +(* When issuing an external command, log it along the way. *) + +let command cmd = + log 2 "%s\n%!" cmd; + command cmd + +(* -------------------------------------------------------------------------- *) + +(* Paths. *) + +let root = + absolute_directory ".." + +let src = + root + +let good = + root ^ "/tests" + +let good_slash filename = + good ^ "/" ^ filename + +let joujou = + src ^ "/joujou" + +let gcc = + sprintf "gcc -O2 -I %s" src + +(* -------------------------------------------------------------------------- *) + +(* Test files. *) + +let thisfile = + "this input file" + +let lambda basename = + basename ^ ".lambda" + +(* -------------------------------------------------------------------------- *) + +(* Test inputs and outputs. *) + +(* A test input is a basename, without the .lambda extension. *) + +type input = + | PositiveTest of filename + +type inputs = input list + +let print_input = function + | PositiveTest basename -> + basename + +type outcome = + | OK + | Fail of string (* message *) + +let print_outcome = function + | OK -> + "" + | Fail msg -> + msg + +type output = + input * outcome + +type outputs = output list + +let print_output (input, outcome) = + printf "\n[FAIL] %s\n%s" + (print_input input) + (print_outcome outcome) + +(* -------------------------------------------------------------------------- *) + +(* Auxiliary functions. *) + +let check_expected directory id result expected = + let cmd = sep ["cd"; directory; "&&"; "cp"; "-f"; result; expected] in + let copy() = + if command cmd <> 0 then + fail id "Failed to create %s.\n" expected + in + (* If we are supposed to create the [expected] file, do so. *) + if create_expected then + copy() + (* Otherwise, check that the file [expected] exists. If it does not exist, + create it by renaming [result] to [expected], then fail and invite the + user to review the newly created file. *) + else if not (file_exists (directory ^ "/" ^ expected)) then begin + copy(); + let cmd = sep ["more"; directory ^ "/" ^ expected] in + fail id "The file %s did not exist.\n\ + I have just created it. Please review it.\n %s\n" + expected cmd + end + +(* -------------------------------------------------------------------------- *) + +(* Running a positive test. *) + +(* + Conventions: + The file %.c stores the output of joujou. + The file %.exe is the compiled program produced by gcc. + The file %.out stores the output of the compiled program. + The file %.exp stores the expected output. + The file %.err stores error output (at several stages). + *) + +let process_positive_test (base : string) : unit = + + (* Display an information message. *) + log 2 "Testing %s...\n%!" base; + + (* A suggested command. *) + let more filename = + sep ["more"; good_slash filename] + in + + (* Run joujou. *) + let source = lambda base in + let c = base ^ ".c" in + let errors = base ^ ".err" in + let cmd = sep ( + "cd" :: good :: "&&" :: + joujou :: source :: sprintf ">%s" c :: sprintf "2>%s" errors :: [] + ) in + if command cmd <> 0 then + fail base "joujou fails on this source file.\n\ + To see the source file:\n %s\n\ + To see the error messages:\n %s\n" + (more source) (more errors); + + (* Run the C compiler. *) + let binary = base ^ ".exe" in + let errors = base ^ ".err" in + let cmd = sep ( + "cd" :: good :: "&&" :: + gcc :: c :: "-o" :: binary :: sprintf "2>%s" errors :: [] + ) in + if command cmd <> 0 then + fail base "The C compiler rejects the C file.\n\ + To see the C file:\n %s\n\ + To see the compiler's error messages:\n %s\n" + (more c) (more errors); + + (* Run the compiled program. *) + let out = base ^ ".out" in + let cmd = sep ( + "cd" :: good :: "&&" :: + sprintf "./%s" binary :: sprintf ">%s" out :: "2>&1" :: [] + ) in + if command cmd <> 0 then + fail base "The compiled program fails.\n\ + To see its output:\n %s\n" (more out); + + (* Check that the file [exp] exists. *) + let exp = base ^ ".exp" in + check_expected good base out exp; + + (* Check that the output coincides with what was expected. *) + let cmd = sep ("cd" :: good :: "&&" :: "diff" :: exp :: out :: []) in + if command (silent cmd) <> 0 then + fail base "joujou accepts this input file, but produces incorrect output.\n\ + To see the difference:\n (%s)\n" + cmd; + + (* Succeed. *) + log 1 "[OK] %s\n%!" base + +(* -------------------------------------------------------------------------- *) + +(* Running a test. *) + +let process input : output = + try + begin match input with + | PositiveTest basenames -> + process_positive_test basenames + end; + input, OK + with Failure msg -> + input, Fail msg + +(* -------------------------------------------------------------------------- *) + +(* [run] runs a bunch of tests in sequence. *) + +let run (inputs : inputs) : outputs = + flush stdout; flush stderr; + let outputs = map process inputs in + outputs + +(* -------------------------------------------------------------------------- *) + +(* Main. *) + +(* Menhir can accept several .mly files at once. By convention, if several + files have the same name up to a numeric suffix, then they belong in a + single group and should be fed together to Menhir. *) + +let inputs directory : filename list = + readdir directory + |> to_list + |> filter (has_suffix ".lambda") + |> map chop_extension + |> sort compare + +let positive : inputs = + inputs good + |> map (fun basename -> PositiveTest basename) + +let inputs = + positive + +let outputs : outputs = + printf "Preparing to run %d tests...\n%!" (length inputs); + run inputs + +let successful, failed = + partition (fun (_, o) -> o = OK) outputs + +let () = + printf "%d out of %d tests are successful.\n" + (length successful) (length inputs); + failed |> iter (fun (input, outcome) -> + printf "\n[FAIL] %s\n%s" (print_input input) (print_outcome outcome) + ) diff --git a/projet/src/tests/.gitignore b/projet/src/tests/.gitignore new file mode 100644 index 0000000..9038d29 --- /dev/null +++ b/projet/src/tests/.gitignore @@ -0,0 +1,4 @@ +*.err +*.out +*.exe +*.c diff --git a/projet/src/tests/bool.exp b/projet/src/tests/bool.exp new file mode 100644 index 0000000..829400e --- /dev/null +++ b/projet/src/tests/bool.exp @@ -0,0 +1,20 @@ +1 +0 +1 +0 +0 +24 +120 +8 +13 +5 +0 +1 +7 +1 +1 +2 +6 +24 +120 +42 diff --git a/projet/src/tests/bool.lambda b/projet/src/tests/bool.lambda new file mode 100644 index 0000000..6eaf5da --- /dev/null +++ b/projet/src/tests/bool.lambda @@ -0,0 +1,88 @@ +(* Thunks. *) +let force = fun x -> x 0 in +(* Church Booleans. *) +let false = fun x -> fun y -> y in +let true = fun x -> fun y -> x in +let k = true in +let cond = fun p -> fun x -> fun y -> p x y in +let forcecond = fun p -> fun x -> fun y -> force (p x y) in +let bool2int = fun b -> cond b 1 0 in +let _ = print (bool2int true) in +let _ = print (bool2int false) in +(* Church pairs. *) +let pair = fun x -> fun y -> fun p -> cond p x y in +let fst = fun p -> p true in +let snd = fun p -> p false in +(* Church naturals. *) +let zero = fun f -> fun x -> x in +let one = fun f -> fun x -> f x in +let plus = fun m -> fun n -> fun f -> fun x -> m f (n f x) in +let two = plus one one in +let three = plus one two in +let four = plus two two in +let five = plus four one in +let six = plus four two in +let succ = plus one in +let mult = fun m -> fun n -> fun f -> m (n f) in +let exp = fun m -> fun n -> n m in +let is_zero = fun n -> n (k false) true in +let convert = fun n -> n (fun x -> x + 1) 0 in +let _ = print (bool2int (is_zero zero)) in +let _ = print (bool2int (is_zero one)) in +let _ = print (bool2int (is_zero two)) in +(* Factorial, based on Church naturals. *) +let loop = fun p -> + let n = succ (fst p) in + pair n (mult n (snd p)) +in +let fact = fun n -> + snd (n loop (pair zero one)) +in +let _ = print (convert (fact four)) in +let _ = print (convert (fact five)) in +(* Fibonacci, based on Church naturals. *) +let loop = fun p -> + let fib1 = fst p in + pair (plus fib1 (snd p)) fib1 +in +let fib = fun n -> + snd (n loop (pair one one)) +in +let _ = print (convert (fib five)) in +let _ = print (convert (fib six)) in +(* Predecessor. *) +let loop = fun p -> + let pred = fst p in + pair (succ pred) pred +in +let pred = fun n -> + snd (n loop (pair zero zero)) +in +let _ = print (convert (pred six)) in +(* Comparison, yielding a Church Boolean. *) +let geq = fun m -> fun n -> + m pred n (k false) true +in +let _ = print (bool2int (geq four six)) in +let _ = print (bool2int (geq six one)) in +(* Iteration. *) +let iter = fun f -> fun n -> + n f (f one) +in +(* Ackermann's function. *) +let ack = fun n -> n iter succ n in +let _ = print (convert (ack two)) in +(* A fixpoint. *) +let fix = fun f -> (fun y -> f (fun z -> y y z)) (fun y -> f (fun z -> y y z)) in +(* Another version of fact. *) +let fact = fun n -> + fix (fun fact -> fun n -> forcecond (is_zero n) (fun _ -> one) (fun _ -> mult n (fact (pred n)))) n +in +let _ = print (convert (fact zero)) in +let _ = print (convert (fact one)) in +let _ = print (convert (fact two)) in +let _ = print (convert (fact three)) in +let _ = print (convert (fact four)) in +let _ = print (convert (fact five)) in + +print 42 diff --git a/projet/src/tests/church.exp b/projet/src/tests/church.exp new file mode 100755 index 0000000..d81cc07 --- /dev/null +++ b/projet/src/tests/church.exp @@ -0,0 +1 @@ +42 diff --git a/projet/src/tests/church.lambda b/projet/src/tests/church.lambda new file mode 100644 index 0000000..0cbd2e6 --- /dev/null +++ b/projet/src/tests/church.lambda @@ -0,0 +1,16 @@ +let i = fun x -> x in +let k = fun x -> fun y -> x in +let zero = fun f -> i in +let one = fun f -> fun x -> f x in +let plus = fun m -> fun n -> fun f -> fun x -> m f (n f x) in +let succ = plus one in +let mult = fun m -> fun n -> fun f -> m (n f) in +let exp = fun m -> fun n -> n m in +let two = succ one in +let three = succ two in +let six = mult two three in +let seven = succ six in +let twenty_one = mult three seven in +let forty_two = mult two twenty_one in +let convert = fun n -> n (fun x -> x + 1) 0 in +print (convert forty_two) diff --git a/projet/src/tests/hello.exp b/projet/src/tests/hello.exp new file mode 100755 index 0000000..d81cc07 --- /dev/null +++ b/projet/src/tests/hello.exp @@ -0,0 +1 @@ +42 diff --git a/projet/src/tests/hello.lambda b/projet/src/tests/hello.lambda new file mode 100644 index 0000000..86f387e --- /dev/null +++ b/projet/src/tests/hello.lambda @@ -0,0 +1 @@ +print (21 + 21) diff --git a/projet/src/tests/loop/loop.lambda b/projet/src/tests/loop/loop.lambda new file mode 100644 index 0000000..0629593 --- /dev/null +++ b/projet/src/tests/loop/loop.lambda @@ -0,0 +1,10 @@ +(* This program is supposed to never terminate. + This can actually work if the C compiler is + smart enough to recognize and optimize tail + calls. It works for me with clang but not with + gcc, for some reason. *) +let rec loop = fun x -> + let _ = print x in + loop (x + 1) +in +loop 0 diff --git a/projet/src/tests/printprint.exp b/projet/src/tests/printprint.exp new file mode 100755 index 0000000..daaac9e --- /dev/null +++ b/projet/src/tests/printprint.exp @@ -0,0 +1,2 @@ +42 +42 diff --git a/projet/src/tests/printprint.lambda b/projet/src/tests/printprint.lambda new file mode 100644 index 0000000..f0501dd --- /dev/null +++ b/projet/src/tests/printprint.lambda @@ -0,0 +1,2 @@ +(* Because [print] returns its argument, this program should print 42 twice. *) +print (print 42) diff --git a/projet/sujet.pdf b/projet/sujet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7f0a6d1ad0dcab0c9af9792d6320bc21e946fa8 GIT binary patch literal 112447 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 literal 0 HcmV?d00001 From 4de6bf8544761fb03cc804e17858959fe73bb9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pottier?= Date: Wed, 13 Dec 2017 14:08:29 +0100 Subject: [PATCH 4/6] README update. --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a131adb..f2a0187 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,11 @@ effectful programming with monads and algebraic effects; tagless interpreters; programming with total functions; generic programming. We also show the limits of dependently-typed functional programming. +## Project + +The [programming project](project/) is now available! +The deadline is **Friday, February 16, 2018**. + ## Approximate syllabus ### Functional Programming: Under the Hood @@ -159,7 +164,7 @@ We also show the limits of dependently-typed functional programming. Two written exams (a partial exam on Friday Dec 1 and a final exam) and one programming project or several programming exercises are used to evaluate -the students that follow the full course. Only the partial exam will count +the students that follow the full course. Only the partial exam will count to grade students who split the course. Only course notes and hand written notes are allowed for the exams. From 36df95f02f5985c797f119cbf324e263374b4399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pottier?= Date: Wed, 13 Dec 2017 14:09:19 +0100 Subject: [PATCH 5/6] Makefile. --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index e22c835..98639b2 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,9 @@ +.PHONY: html clean + +html: README.html + +clean: + rm -f README.html *~ README.html: README.md pandoc -s -f markdown -t html -o $@ $< From 00ebc635448519fddbe390bb62018d547b67cdc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pottier?= Date: Wed, 13 Dec 2017 14:10:41 +0100 Subject: [PATCH 6/6] Rename projet to project. --- {projet => project}/src/.merlin | 0 {projet => project}/src/CPS.ml | 0 {projet => project}/src/CPS.mli | 0 {projet => project}/src/Cook.ml | 0 {projet => project}/src/Cook.mli | 0 {projet => project}/src/Defun.ml | 0 {projet => project}/src/Defun.mli | 0 {projet => project}/src/Error.ml | 0 {projet => project}/src/Error.mli | 0 {projet => project}/src/Finish.ml | 0 {projet => project}/src/Finish.mli | 0 {projet => project}/src/Lambda.ml | 0 {projet => project}/src/Lexer.mll | 0 {projet => project}/src/Main.ml | 0 {projet => project}/src/Makefile | 0 {projet => project}/src/Parser.mly | 0 {projet => project}/src/RawLambda.ml | 0 {projet => project}/src/Tail.ml | 0 {projet => project}/src/Top.ml | 0 {projet => project}/src/_tags | 0 {projet => project}/src/alphalib/Atom.ml | 0 {projet => project}/src/alphalib/Atom.mli | 0 {projet => project}/src/kremlin/C.ml | 0 {projet => project}/src/kremlin/Common.ml | 0 {projet => project}/src/kremlin/Constant.ml | 0 {projet => project}/src/kremlin/Options.ml | 0 {projet => project}/src/kremlin/PrintC.ml | 0 {projet => project}/src/kremlin/PrintCommon.ml | 0 {projet => project}/src/kremlin/Utils.ml | 0 {projet => project}/src/prologue.h | 0 {projet => project}/src/test/.gitignore | 0 {projet => project}/src/test/.merlin | 0 {projet => project}/src/test/Makefile | 0 {projet => project}/src/test/_tags | 0 {projet => project}/src/test/auxiliary.ml | 0 {projet => project}/src/test/test.ml | 0 {projet => project}/src/tests/.gitignore | 0 {projet => project}/src/tests/bool.exp | 0 {projet => project}/src/tests/bool.lambda | 0 {projet => project}/src/tests/church.exp | 0 {projet => project}/src/tests/church.lambda | 0 {projet => project}/src/tests/hello.exp | 0 {projet => project}/src/tests/hello.lambda | 0 {projet => project}/src/tests/loop/loop.lambda | 0 {projet => project}/src/tests/printprint.exp | 0 {projet => project}/src/tests/printprint.lambda | 0 {projet => project}/sujet.pdf | Bin 47 files changed, 0 insertions(+), 0 deletions(-) rename {projet => project}/src/.merlin (100%) rename {projet => project}/src/CPS.ml (100%) rename {projet => project}/src/CPS.mli (100%) rename {projet => project}/src/Cook.ml (100%) rename {projet => project}/src/Cook.mli (100%) rename {projet => project}/src/Defun.ml (100%) rename {projet => project}/src/Defun.mli (100%) rename {projet => project}/src/Error.ml (100%) rename {projet => project}/src/Error.mli (100%) rename {projet => project}/src/Finish.ml (100%) rename {projet => project}/src/Finish.mli (100%) rename {projet => project}/src/Lambda.ml (100%) rename {projet => project}/src/Lexer.mll (100%) rename {projet => project}/src/Main.ml (100%) rename {projet => project}/src/Makefile (100%) rename {projet => project}/src/Parser.mly (100%) rename {projet => project}/src/RawLambda.ml (100%) rename {projet => project}/src/Tail.ml (100%) rename {projet => project}/src/Top.ml (100%) rename {projet => project}/src/_tags (100%) rename {projet => project}/src/alphalib/Atom.ml (100%) rename {projet => project}/src/alphalib/Atom.mli (100%) rename {projet => project}/src/kremlin/C.ml (100%) rename {projet => project}/src/kremlin/Common.ml (100%) rename {projet => project}/src/kremlin/Constant.ml (100%) rename {projet => project}/src/kremlin/Options.ml (100%) rename {projet => project}/src/kremlin/PrintC.ml (100%) rename {projet => project}/src/kremlin/PrintCommon.ml (100%) rename {projet => project}/src/kremlin/Utils.ml (100%) rename {projet => project}/src/prologue.h (100%) rename {projet => project}/src/test/.gitignore (100%) rename {projet => project}/src/test/.merlin (100%) rename {projet => project}/src/test/Makefile (100%) rename {projet => project}/src/test/_tags (100%) rename {projet => project}/src/test/auxiliary.ml (100%) rename {projet => project}/src/test/test.ml (100%) rename {projet => project}/src/tests/.gitignore (100%) rename {projet => project}/src/tests/bool.exp (100%) rename {projet => project}/src/tests/bool.lambda (100%) rename {projet => project}/src/tests/church.exp (100%) rename {projet => project}/src/tests/church.lambda (100%) rename {projet => project}/src/tests/hello.exp (100%) rename {projet => project}/src/tests/hello.lambda (100%) rename {projet => project}/src/tests/loop/loop.lambda (100%) rename {projet => project}/src/tests/printprint.exp (100%) rename {projet => project}/src/tests/printprint.lambda (100%) rename {projet => project}/sujet.pdf (100%) diff --git a/projet/src/.merlin b/project/src/.merlin similarity index 100% rename from projet/src/.merlin rename to project/src/.merlin diff --git a/projet/src/CPS.ml b/project/src/CPS.ml similarity index 100% rename from projet/src/CPS.ml rename to project/src/CPS.ml diff --git a/projet/src/CPS.mli b/project/src/CPS.mli similarity index 100% rename from projet/src/CPS.mli rename to project/src/CPS.mli diff --git a/projet/src/Cook.ml b/project/src/Cook.ml similarity index 100% rename from projet/src/Cook.ml rename to project/src/Cook.ml diff --git a/projet/src/Cook.mli b/project/src/Cook.mli similarity index 100% rename from projet/src/Cook.mli rename to project/src/Cook.mli diff --git a/projet/src/Defun.ml b/project/src/Defun.ml similarity index 100% rename from projet/src/Defun.ml rename to project/src/Defun.ml diff --git a/projet/src/Defun.mli b/project/src/Defun.mli similarity index 100% rename from projet/src/Defun.mli rename to project/src/Defun.mli diff --git a/projet/src/Error.ml b/project/src/Error.ml similarity index 100% rename from projet/src/Error.ml rename to project/src/Error.ml diff --git a/projet/src/Error.mli b/project/src/Error.mli similarity index 100% rename from projet/src/Error.mli rename to project/src/Error.mli diff --git a/projet/src/Finish.ml b/project/src/Finish.ml similarity index 100% rename from projet/src/Finish.ml rename to project/src/Finish.ml diff --git a/projet/src/Finish.mli b/project/src/Finish.mli similarity index 100% rename from projet/src/Finish.mli rename to project/src/Finish.mli diff --git a/projet/src/Lambda.ml b/project/src/Lambda.ml similarity index 100% rename from projet/src/Lambda.ml rename to project/src/Lambda.ml diff --git a/projet/src/Lexer.mll b/project/src/Lexer.mll similarity index 100% rename from projet/src/Lexer.mll rename to project/src/Lexer.mll diff --git a/projet/src/Main.ml b/project/src/Main.ml similarity index 100% rename from projet/src/Main.ml rename to project/src/Main.ml diff --git a/projet/src/Makefile b/project/src/Makefile similarity index 100% rename from projet/src/Makefile rename to project/src/Makefile diff --git a/projet/src/Parser.mly b/project/src/Parser.mly similarity index 100% rename from projet/src/Parser.mly rename to project/src/Parser.mly diff --git a/projet/src/RawLambda.ml b/project/src/RawLambda.ml similarity index 100% rename from projet/src/RawLambda.ml rename to project/src/RawLambda.ml diff --git a/projet/src/Tail.ml b/project/src/Tail.ml similarity index 100% rename from projet/src/Tail.ml rename to project/src/Tail.ml diff --git a/projet/src/Top.ml b/project/src/Top.ml similarity index 100% rename from projet/src/Top.ml rename to project/src/Top.ml diff --git a/projet/src/_tags b/project/src/_tags similarity index 100% rename from projet/src/_tags rename to project/src/_tags diff --git a/projet/src/alphalib/Atom.ml b/project/src/alphalib/Atom.ml similarity index 100% rename from projet/src/alphalib/Atom.ml rename to project/src/alphalib/Atom.ml diff --git a/projet/src/alphalib/Atom.mli b/project/src/alphalib/Atom.mli similarity index 100% rename from projet/src/alphalib/Atom.mli rename to project/src/alphalib/Atom.mli diff --git a/projet/src/kremlin/C.ml b/project/src/kremlin/C.ml similarity index 100% rename from projet/src/kremlin/C.ml rename to project/src/kremlin/C.ml diff --git a/projet/src/kremlin/Common.ml b/project/src/kremlin/Common.ml similarity index 100% rename from projet/src/kremlin/Common.ml rename to project/src/kremlin/Common.ml diff --git a/projet/src/kremlin/Constant.ml b/project/src/kremlin/Constant.ml similarity index 100% rename from projet/src/kremlin/Constant.ml rename to project/src/kremlin/Constant.ml diff --git a/projet/src/kremlin/Options.ml b/project/src/kremlin/Options.ml similarity index 100% rename from projet/src/kremlin/Options.ml rename to project/src/kremlin/Options.ml diff --git a/projet/src/kremlin/PrintC.ml b/project/src/kremlin/PrintC.ml similarity index 100% rename from projet/src/kremlin/PrintC.ml rename to project/src/kremlin/PrintC.ml diff --git a/projet/src/kremlin/PrintCommon.ml b/project/src/kremlin/PrintCommon.ml similarity index 100% rename from projet/src/kremlin/PrintCommon.ml rename to project/src/kremlin/PrintCommon.ml diff --git a/projet/src/kremlin/Utils.ml b/project/src/kremlin/Utils.ml similarity index 100% rename from projet/src/kremlin/Utils.ml rename to project/src/kremlin/Utils.ml diff --git a/projet/src/prologue.h b/project/src/prologue.h similarity index 100% rename from projet/src/prologue.h rename to project/src/prologue.h diff --git a/projet/src/test/.gitignore b/project/src/test/.gitignore similarity index 100% rename from projet/src/test/.gitignore rename to project/src/test/.gitignore diff --git a/projet/src/test/.merlin b/project/src/test/.merlin similarity index 100% rename from projet/src/test/.merlin rename to project/src/test/.merlin diff --git a/projet/src/test/Makefile b/project/src/test/Makefile similarity index 100% rename from projet/src/test/Makefile rename to project/src/test/Makefile diff --git a/projet/src/test/_tags b/project/src/test/_tags similarity index 100% rename from projet/src/test/_tags rename to project/src/test/_tags diff --git a/projet/src/test/auxiliary.ml b/project/src/test/auxiliary.ml similarity index 100% rename from projet/src/test/auxiliary.ml rename to project/src/test/auxiliary.ml diff --git a/projet/src/test/test.ml b/project/src/test/test.ml similarity index 100% rename from projet/src/test/test.ml rename to project/src/test/test.ml diff --git a/projet/src/tests/.gitignore b/project/src/tests/.gitignore similarity index 100% rename from projet/src/tests/.gitignore rename to project/src/tests/.gitignore diff --git a/projet/src/tests/bool.exp b/project/src/tests/bool.exp similarity index 100% rename from projet/src/tests/bool.exp rename to project/src/tests/bool.exp diff --git a/projet/src/tests/bool.lambda b/project/src/tests/bool.lambda similarity index 100% rename from projet/src/tests/bool.lambda rename to project/src/tests/bool.lambda diff --git a/projet/src/tests/church.exp b/project/src/tests/church.exp similarity index 100% rename from projet/src/tests/church.exp rename to project/src/tests/church.exp diff --git a/projet/src/tests/church.lambda b/project/src/tests/church.lambda similarity index 100% rename from projet/src/tests/church.lambda rename to project/src/tests/church.lambda diff --git a/projet/src/tests/hello.exp b/project/src/tests/hello.exp similarity index 100% rename from projet/src/tests/hello.exp rename to project/src/tests/hello.exp diff --git a/projet/src/tests/hello.lambda b/project/src/tests/hello.lambda similarity index 100% rename from projet/src/tests/hello.lambda rename to project/src/tests/hello.lambda diff --git a/projet/src/tests/loop/loop.lambda b/project/src/tests/loop/loop.lambda similarity index 100% rename from projet/src/tests/loop/loop.lambda rename to project/src/tests/loop/loop.lambda diff --git a/projet/src/tests/printprint.exp b/project/src/tests/printprint.exp similarity index 100% rename from projet/src/tests/printprint.exp rename to project/src/tests/printprint.exp diff --git a/projet/src/tests/printprint.lambda b/project/src/tests/printprint.lambda similarity index 100% rename from projet/src/tests/printprint.lambda rename to project/src/tests/printprint.lambda diff --git a/projet/sujet.pdf b/project/sujet.pdf similarity index 100% rename from projet/sujet.pdf rename to project/sujet.pdf