Ajout du let in.

This commit is contained in:
Mysaa 2022-01-24 18:18:27 +01:00
parent 101555a3d3
commit 559245f1c5
Signed by: Mysaa
GPG Key ID: 7054D5D6A90F084F
7 changed files with 26 additions and 6 deletions

View File

@ -39,4 +39,5 @@ let rec affiche_expr e =
print_string ")"
end
| 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 ")"

View File

@ -14,15 +14,21 @@ type expr =
| Bor of expr*expr
| ITE of expr*expr*expr
| PrInt of expr
| Var of string
| LetIn of string*expr*expr
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 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
| 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
| VInt k -> VInt k
| _ -> raise InvalidTypeException)
| Var(v) -> readVar env v UnknownVariableException
| LetIn(v,e0,e1) -> eval e1 ((v,eval e0 env)::env)

View File

@ -28,5 +28,8 @@ rule token = parse (* la "fonction" aussi s'appelle token .. *)
| "if" { IF }
| "then" { THEN }
| "else" { ELSE }
| "prInt" { PRINT }
| "prInt" { PRINT }
| "let" { LET }
| "in" { IN }
| ['a'-'z']+ as v { VAR (v) }
| eof { raise Eof } (* fin du fichier *)

View File

@ -49,6 +49,8 @@ let rec affiche_printexpr e env = begin
(* le traitement d'une expression en entrée *)
let execute e =
begin
affiche_expr e;
print_newline();
affiche_printexpr e Expr.empty_env;
print_newline();
let v = Expr.eval e Expr.empty_env in

View File

@ -8,8 +8,10 @@ open Expr (* rappel: dans expr.ml:
/* 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 <string> VAR
%token TRUE FALSE
%token IF THEN ELSE
%token LET IN
%token PRINT
%token BAND BOR
%token EQ GT LT GTE LTE
@ -17,6 +19,7 @@ open Expr (* rappel: dans expr.ml:
%token LPAREN RPAREN
%token EOL /* retour à la ligne */
%nonassoc LET IN
%nonassoc IF THEN ELSE
%left BAND BOR
%left EQ
@ -44,6 +47,7 @@ expression EOL { $1 } /* on veut reconnaître une expression */
expression: /* règles de grammaire pour les expressions */
| INT { Const $1 }
| VAR { Var $1 }
| TRUE { BConst true }
| FALSE { BConst false }
| 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) }
| PRINT expression { PrInt($2) }
| 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) }
;

1
Rendu0/tests/letin.ml Normal file
View File

@ -0,0 +1 @@
let x=3 in (let y=x+2 in x+y)

1
Rendu0/tests/print.ml Normal file
View File

@ -0,0 +1 @@
4+5+(prInt 42+1)