From 89b70bed372c01795300366bb2a49de2e92bf02c Mon Sep 17 00:00:00 2001 From: Mysaa Date: Tue, 25 Jan 2022 02:54:47 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'un=20nouveau=20syst=C3=A8me=20de=20te?= =?UTF-8?q?sts,=20plus=20compact,=20et=20plus=20de=20tests=20aussi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Rendu0/Makefile | 4 ++++ Rendu0/lexer.mll | 4 +++- Rendu0/parser.mly | 24 +++++++++++++++++++----- Rendu0/tests/arith0.ml | 1 - Rendu0/tests/basic.ml | 1 - Rendu0/tests/booleans.ml | 1 - Rendu0/tests/func.ml | 1 - Rendu0/tests/letin.ml | 1 - Rendu0/tests/print.ml | 1 - Rendu0/tests/tests.ml | 8 ++++++++ Rendu0/tests/tests.sh | 8 ++++++++ 11 files changed, 42 insertions(+), 12 deletions(-) delete mode 100644 Rendu0/tests/arith0.ml delete mode 100644 Rendu0/tests/basic.ml delete mode 100644 Rendu0/tests/booleans.ml delete mode 100644 Rendu0/tests/func.ml delete mode 100644 Rendu0/tests/letin.ml delete mode 100644 Rendu0/tests/print.ml create mode 100644 Rendu0/tests/tests.ml create mode 100755 Rendu0/tests/tests.sh diff --git a/Rendu0/Makefile b/Rendu0/Makefile index 933ffc5..8faef11 100644 --- a/Rendu0/Makefile +++ b/Rendu0/Makefile @@ -9,3 +9,7 @@ byte: clean: ocamlbuild -clean rm -f fouine + +test: all + tests/tests.sh +.PHONY: all clean test diff --git a/Rendu0/lexer.mll b/Rendu0/lexer.mll index f5cb32f..06c2188 100644 --- a/Rendu0/lexer.mll +++ b/Rendu0/lexer.mll @@ -33,5 +33,7 @@ rule token = parse (* la "fonction" aussi s'appelle token .. *) | "in" { IN } | "fun" { FUN } | "->" { MAPSTO } - | (['a'-'z' 'A'-'Z' '_'])(['a'-'z' 'A'-'Z' '0'-'9' '_'])* as v { VAR (v) } + | "_" { UNDERSCORE } + | ";;" { PVPV } + | (['a'-'z'])(['a'-'z' 'A'-'Z' '0'-'9' '_'])* as v { VAR (v) } | eof { raise Eof } (* fin du fichier *) diff --git a/Rendu0/parser.mly b/Rendu0/parser.mly index 4d4ad8b..e2246ae 100644 --- a/Rendu0/parser.mly +++ b/Rendu0/parser.mly @@ -13,6 +13,8 @@ open Expr (* rappel: dans expr.ml: %token IF THEN ELSE %token FUN MAPSTO %token LET IN +%token PVPV +%token UNDERSCORE %token PRINT %token BAND BOR %token EQ GT LT GTE LTE @@ -20,6 +22,7 @@ open Expr (* rappel: dans expr.ml: %token LPAREN RPAREN %token EOL /* retour à la ligne */ +%left PVPV %nonassoc LET IN %nonassoc FUN MAPSTO %nonassoc IF THEN ELSE @@ -31,7 +34,7 @@ open Expr (* rappel: dans expr.ml: %left TIMES /* associativité gauche: a*b*c, c'est (a*b)*c */ %nonassoc PRINT %nonassoc UMINUS /* un "faux token", correspondant au "-" unaire */ - /* cf. son usage plus bas : il sert à "marquer" une règle pour lui donner la précédence maximale */ +%nonassoc UNDERSCORE /* cf. son usage plus bas : il sert à "marquer" une règle pour lui donner la précédence maximale */ %start main /* "start" signale le point d'entrée: */ @@ -44,9 +47,14 @@ open Expr (* rappel: dans expr.ml: main: /* <- le point d'entrée (cf. + haut, "start") */ -expression EOL { $1 } /* on veut reconnaître une expression */ +preambule EOL { $1 } /* on veut reconnaître une expression */ +; + +preambule: + | LET VAR EQ expression PVPV preambule { LetIn($2,$4,$6) } + | LET UNDERSCORE EQ expression PVPV preambule { LetIn("_",$4,$6) } + | expression { $1 } ; - expression: /* règles de grammaire pour les expressions */ | INT { Const $1 } @@ -67,11 +75,17 @@ expression: /* règles de grammaire pour les expressions */ | PRINT expression { PrInt($2) } | IF expression THEN expression ELSE expression { ITE($2,$4,$6)} | LET VAR EQ expression IN expression { LetIn($2,$4,$6) } + | LET UNDERSCORE EQ expression IN expression { LetIn("_",$4,$6) } | FUN VAR MAPSTO expression { Fun($2,$4) } | MINUS expression %prec UMINUS { Min(Const 0, $2) } - | expression sexpr %prec APP { App($1,$2) } - ; + | applic sexpr %prec APP { App($1,$2) } +; +applic: + | applic sexpr { App($1,$2) } + | VAR { Var $1 } + | LPAREN expression RPAREN { $2 } +; sexpr: | INT { Const $1 } | VAR { Var $1 } diff --git a/Rendu0/tests/arith0.ml b/Rendu0/tests/arith0.ml deleted file mode 100644 index 22494a2..0000000 --- a/Rendu0/tests/arith0.ml +++ /dev/null @@ -1 +0,0 @@ -1+2+3+4*5*(6+7-8) diff --git a/Rendu0/tests/basic.ml b/Rendu0/tests/basic.ml deleted file mode 100644 index 26b4409..0000000 --- a/Rendu0/tests/basic.ml +++ /dev/null @@ -1 +0,0 @@ -3+2*4 diff --git a/Rendu0/tests/booleans.ml b/Rendu0/tests/booleans.ml deleted file mode 100644 index 484ab13..0000000 --- a/Rendu0/tests/booleans.ml +++ /dev/null @@ -1 +0,0 @@ -if (5+6=11) then (if 5-9=9 && 3+3=6 then 42 else 5+98) else 4*2 diff --git a/Rendu0/tests/func.ml b/Rendu0/tests/func.ml deleted file mode 100644 index ee82ba1..0000000 --- a/Rendu0/tests/func.ml +++ /dev/null @@ -1 +0,0 @@ -(fun x -> fun y -> fun x -> x+y*2) 0 19 4 diff --git a/Rendu0/tests/letin.ml b/Rendu0/tests/letin.ml deleted file mode 100644 index af9df36..0000000 --- a/Rendu0/tests/letin.ml +++ /dev/null @@ -1 +0,0 @@ -let x=3 in (let y=x+2 in x+y) diff --git a/Rendu0/tests/print.ml b/Rendu0/tests/print.ml deleted file mode 100644 index 8d709c0..0000000 --- a/Rendu0/tests/print.ml +++ /dev/null @@ -1 +0,0 @@ -4+5+(prInt 42+1) diff --git a/Rendu0/tests/tests.ml b/Rendu0/tests/tests.ml new file mode 100644 index 0000000..bc127d0 --- /dev/null +++ b/Rendu0/tests/tests.ml @@ -0,0 +1,8 @@ +1+2+3+4+5*(6+7-8)+7 +12+5*6 +if (5+6=11) then (if 5-9=9 && 3+3=6 then 33 else 53-11) else 33+54 +3+5+(prInt 33+1) +let x=4 in (let y=x+3 in x*y+14) +let x=prInt 33 in let x=25 in x+17 +let f=fun x -> x*2 in let x = 12 in f (f x -3) +(fun x -> fun y -> fun x -> x+y*2) 0 19 4 diff --git a/Rendu0/tests/tests.sh b/Rendu0/tests/tests.sh new file mode 100755 index 0000000..9b6b704 --- /dev/null +++ b/Rendu0/tests/tests.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +while IFS="" read -r p || [ -n "$p" ] +do + echo "--------------------------------"; + echo "$p" + echo "$p" | ./fouine; +done < tests/tests.ml