Ajout du let in.
This commit is contained in:
parent
101555a3d3
commit
559245f1c5
@ -39,4 +39,5 @@ let rec affiche_expr e =
|
|||||||
print_string ")"
|
print_string ")"
|
||||||
end
|
end
|
||||||
| PrInt(e1) -> print_string "PrInt(";affiche_expr e1;print_string ")"
|
| PrInt(e1) -> print_string "PrInt(";affiche_expr e1;print_string ")"
|
||||||
|
| Var(x) -> print_string "Var(";print_string x;print_string ")"
|
||||||
|
| LetIn(x,e0,e1) -> print_string "LetIn(";print_string x;print_string ",";affiche_expr e0;print_string ",";affiche_expr e1;print_string ")"
|
||||||
|
|||||||
@ -14,15 +14,21 @@ type expr =
|
|||||||
| Bor of expr*expr
|
| Bor of expr*expr
|
||||||
| ITE of expr*expr*expr
|
| ITE of expr*expr*expr
|
||||||
| PrInt of expr
|
| PrInt of expr
|
||||||
|
| Var of string
|
||||||
|
| LetIn of string*expr*expr
|
||||||
|
|
||||||
type valeur = VInt of int | VBool of bool
|
type valeur = VInt of int | VBool of bool
|
||||||
|
|
||||||
type env = unit
|
type env = (string*valeur) list
|
||||||
|
|
||||||
let empty_env = ()
|
let empty_env = []
|
||||||
|
|
||||||
exception InvalidTypeException
|
exception InvalidTypeException
|
||||||
|
exception UnknownVariableException
|
||||||
|
|
||||||
|
let rec readVar env v0 e = match env with
|
||||||
|
| [] -> raise e
|
||||||
|
| (v,x)::t -> if (v0 = v) then x else readVar t v0 e
|
||||||
|
|
||||||
let rec intIntOp op e1 e2 env = match (eval e1 env, eval e2 env) with
|
let rec intIntOp op e1 e2 env = match (eval e1 env, eval e2 env) with
|
||||||
| VInt k1,VInt k2 -> VInt(op k1 k2)
|
| VInt k1,VInt k2 -> VInt(op k1 k2)
|
||||||
@ -57,4 +63,5 @@ and eval e env = match e with
|
|||||||
| PrInt e1 -> (match (eval e1 env) with
|
| PrInt e1 -> (match (eval e1 env) with
|
||||||
| VInt k -> VInt k
|
| VInt k -> VInt k
|
||||||
| _ -> raise InvalidTypeException)
|
| _ -> raise InvalidTypeException)
|
||||||
|
| Var(v) -> readVar env v UnknownVariableException
|
||||||
|
| LetIn(v,e0,e1) -> eval e1 ((v,eval e0 env)::env)
|
||||||
|
|||||||
@ -28,5 +28,8 @@ rule token = parse (* la "fonction" aussi s'appelle token .. *)
|
|||||||
| "if" { IF }
|
| "if" { IF }
|
||||||
| "then" { THEN }
|
| "then" { THEN }
|
||||||
| "else" { ELSE }
|
| "else" { ELSE }
|
||||||
| "prInt" { PRINT }
|
| "prInt" { PRINT }
|
||||||
|
| "let" { LET }
|
||||||
|
| "in" { IN }
|
||||||
|
| ['a'-'z']+ as v { VAR (v) }
|
||||||
| eof { raise Eof } (* fin du fichier *)
|
| eof { raise Eof } (* fin du fichier *)
|
||||||
|
|||||||
@ -49,6 +49,8 @@ let rec affiche_printexpr e env = begin
|
|||||||
(* le traitement d'une expression en entrée *)
|
(* le traitement d'une expression en entrée *)
|
||||||
let execute e =
|
let execute e =
|
||||||
begin
|
begin
|
||||||
|
affiche_expr e;
|
||||||
|
print_newline();
|
||||||
affiche_printexpr e Expr.empty_env;
|
affiche_printexpr e Expr.empty_env;
|
||||||
print_newline();
|
print_newline();
|
||||||
let v = Expr.eval e Expr.empty_env in
|
let v = Expr.eval e Expr.empty_env in
|
||||||
|
|||||||
@ -8,8 +8,10 @@ open Expr (* rappel: dans expr.ml:
|
|||||||
/* description des lexèmes, ceux-ci sont décrits (par vous) dans lexer.mll */
|
/* description des lexèmes, ceux-ci sont décrits (par vous) dans lexer.mll */
|
||||||
|
|
||||||
%token <int> INT /* le lexème INT a un attribut entier */
|
%token <int> INT /* le lexème INT a un attribut entier */
|
||||||
|
%token <string> VAR
|
||||||
%token TRUE FALSE
|
%token TRUE FALSE
|
||||||
%token IF THEN ELSE
|
%token IF THEN ELSE
|
||||||
|
%token LET IN
|
||||||
%token PRINT
|
%token PRINT
|
||||||
%token BAND BOR
|
%token BAND BOR
|
||||||
%token EQ GT LT GTE LTE
|
%token EQ GT LT GTE LTE
|
||||||
@ -17,6 +19,7 @@ open Expr (* rappel: dans expr.ml:
|
|||||||
%token LPAREN RPAREN
|
%token LPAREN RPAREN
|
||||||
%token EOL /* retour à la ligne */
|
%token EOL /* retour à la ligne */
|
||||||
|
|
||||||
|
%nonassoc LET IN
|
||||||
%nonassoc IF THEN ELSE
|
%nonassoc IF THEN ELSE
|
||||||
%left BAND BOR
|
%left BAND BOR
|
||||||
%left EQ
|
%left EQ
|
||||||
@ -44,6 +47,7 @@ expression EOL { $1 } /* on veut reconnaître une expression */
|
|||||||
|
|
||||||
expression: /* règles de grammaire pour les expressions */
|
expression: /* règles de grammaire pour les expressions */
|
||||||
| INT { Const $1 }
|
| INT { Const $1 }
|
||||||
|
| VAR { Var $1 }
|
||||||
| TRUE { BConst true }
|
| TRUE { BConst true }
|
||||||
| FALSE { BConst false }
|
| FALSE { BConst false }
|
||||||
| LPAREN expression RPAREN { $2 } /* on récupère le deuxième élément */
|
| LPAREN expression RPAREN { $2 } /* on récupère le deuxième élément */
|
||||||
@ -59,6 +63,7 @@ expression EOL { $1 } /* on veut reconnaître une expression */
|
|||||||
| expression BOR expression { Bor($1,$3) }
|
| expression BOR expression { Bor($1,$3) }
|
||||||
| PRINT expression { PrInt($2) }
|
| PRINT expression { PrInt($2) }
|
||||||
| IF expression THEN expression ELSE expression { ITE($2,$4,$6)}
|
| IF expression THEN expression ELSE expression { ITE($2,$4,$6)}
|
||||||
|
| LET VAR EQ expression IN expression { LetIn($2,$4,$6) }
|
||||||
| MINUS expression %prec UMINUS { Min(Const 0, $2) }
|
| MINUS expression %prec UMINUS { Min(Const 0, $2) }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
1
Rendu0/tests/letin.ml
Normal file
1
Rendu0/tests/letin.ml
Normal file
@ -0,0 +1 @@
|
|||||||
|
let x=3 in (let y=x+2 in x+y)
|
||||||
1
Rendu0/tests/print.ml
Normal file
1
Rendu0/tests/print.ml
Normal file
@ -0,0 +1 @@
|
|||||||
|
4+5+(prInt 42+1)
|
||||||
Loading…
x
Reference in New Issue
Block a user