Merge branch 'anri' of gaufre.informatique.univ-paris-diderot.fr:Anri/compilation-m1-2023 into anri

This commit is contained in:
Nicolas PENELOUX 2023-10-24 12:42:19 +02:00
commit cd04e3c0fc
2 changed files with 38 additions and 52 deletions

View file

@ -19,29 +19,26 @@
error msg (lex_join lexbuf.lex_start_p lexbuf.lex_curr_p) error msg (lex_join lexbuf.lex_start_p lexbuf.lex_curr_p)
(*Fonction qui va convertir une string de caractère ascii en vrai caractère. (* Fonction qui convertie une chaîne de caractère ascii en vrai caractère.
On en a besoin pour certains test *) * Notamment les escapes : "\n" ou "\000" *)
(*) let recup_char charac lexbuf =
let recup_char charac lexbuf = let taille = String.length charac in
let taille = String.length charac in match charac with
match charac with | "\\n" -> Some '\n'
| "\\n" -> '\n' | "\\r" -> Some '\r'
| "\\r" -> '\r' | "\\t" -> Some '\t'
| "\\t" -> '\t' | "\\\'" -> Some '\''
| "\\\'" -> '\'' | "\\\\" -> Some '\\'
| "\\\\" -> '\\' | _ -> (
| _ -> let s2 = String.get charac 1 in
(let s2 = String.get charac 1 in if s2 = '0' || s2 = '1' || s2 = '2' then (
if s2 = '0' || s2 = '1' || s2 = '2' then let s = String.sub charac 1 (taille - 1) in
(let s=String.sub charac 1 (taille - 1) in let i = int_of_string s in
let i = int_of_string s in Some (Char.chr i))
Char.chr i) else None )
else error lexbuf )
*)
} }
let newline = ('\010' | '\013' | "\013\010") let newline = ('\010' | '\013' | "\013\010")
let blank = [' ' '\009' '\012'] let blank = [' ' '\009' '\012']
@ -141,9 +138,9 @@ rule token = parse
| ">?" { SUP_OP } | ">?" { SUP_OP }
(** Identificateurs *) (** Identificateurs *)
| ident as s { ID s } | ident as s { ID s }
| type_variable as s { TID s } | type_variable as s { TID s }
| constr_id as s { CID s } | constr_id as s { CID s }
(* Integers *) (* Integers *)
| int as i { INT (Mint.of_string i) } | int as i { INT (Mint.of_string i) }
@ -152,17 +149,16 @@ rule token = parse
| '"' { read_string (Buffer.create 16) lexbuf } | '"' { read_string (Buffer.create 16) lexbuf }
(* Characters *) (* Characters *)
| "'" (letter as c) "'" { CHAR c } | "'" (letter as c) "'" { CHAR c }
(*| "'" (atom as c) "'" {CHAR (recup_char c lexbuf )} (* On retire le \ du début | "'" (atom as a) "'" { match recup_char a lexbuf with
* TODO: fix *) | Some c -> CHAR c
(*) | None -> error lexbuf None "" }
let code = int_of_string (String.sub c 1 ((String.length c) - 2))
in CHAR (Char.chr (code)) } *) *)
(** Lexing error *) (** Lexing error *)
(* erreur qui advient pour le test 22-char-literal, le code renvoie bizarrement que "Error (during lexing) "*) (* erreur qui advient pour le test 22-char-literal,
* le code renvoie bizarrement que "Error (during lexing)" *)
| "'" ascii_trop_grand "'" { error lexbuf None "" } | "'" ascii_trop_grand "'" { error lexbuf None "" }
| _ as _c { error lexbuf None (* (Some _c) *) "unexpected character." } | _ as _c { error lexbuf None (* (Some _c) *) "unexpected character." }
(* TODO: Gérer les imbrications de commentaires *) (* TODO: Gérer les imbrications de commentaires *)
and commentary = parse and commentary = parse

View file

@ -1,7 +1,6 @@
%{ (* -*- tuareg -*- *) %{ (* -*- tuareg -*- *)
open HopixAST open HopixAST
(* open Position *)
%} %}
@ -16,29 +15,23 @@
%token<char> CHAR %token<char> CHAR
%start<HopixAST.t> program %start<HopixAST.t> program
/* TODO: Résoudre tout les shift/reduce conflits */ /* TODO: Résoudre tout les shift/reduce conflits */
%left FUN %left FUN
%left STRING %left STRING
%left INT %left INT
%right WHILE REF DO %right WHILE REF DO
%left LET MATCH IF FOR %left LET MATCH IF FOR
%right ARROW %right ARROW
%right SEMICOLON %right SEMICOLON
%left ASSIGN %left ASSIGN
%left LPAREN %left LPAREN
%left BACKSLASH %left BACKSLASH
%left EXCLA COLON
/* Priorités binop */
%left EXCLA COLON
/* priorités binop */
%left D_OR %left D_OR
%left D_AND %left D_AND
%left EQUAL_OP INF_EQUAL_OP INF_OP SUP_EQUAL_OP SUP_OP %left EQUAL_OP INF_EQUAL_OP INF_OP SUP_EQUAL_OP SUP_OP
@ -124,7 +117,7 @@ vdefinition:
/* Valeur simple */ /* Valeur simple */
| LET i=located(identifier) ts=option(vdef_type_scheme) | LET i=located(identifier) ts=option(vdef_type_scheme)
EQUAL e=located(expression) %prec let1 { EQUAL e=located(expression) %prec let1 {
SimpleValue(i, ts, e) SimpleValue(i, ts, e)
} }
/* Fonction(s) /* Fonction(s)
* Exemple : * Exemple :
@ -338,16 +331,13 @@ expression:
} }
/* Sequence - Séquencement * /* Sequence - Séquencement *
* Pas sûr, voir s'il ne faut pas une troisième couche d'expression */ * Pas sûr, voir s'il ne faut pas une troisième couche d'expression */
| e=located(simple_expression) | e=located(simple_expression)
SEMICOLON e_list=separated_nonempty_list(SEMICOLON, located(simple_expression)) { SEMICOLON e_list=separated_nonempty_list(SEMICOLON, located(simple_expression)) {
Sequence(e :: e_list) Sequence(e :: e_list)
} }
/* /* | e1=located(expression) SEMICOLON e2=located(expression) {
|e1=located(expression) SEMICOLON e2=located(expression){ Sequence([e1; e2])
Sequence([e1;e2]) } */
}*/
/* Definition locale */ /* Definition locale */
| vd=vdefinition SEMICOLON e=located(expression) { | vd=vdefinition SEMICOLON e=located(expression) {
Define(vd, e) Define(vd, e)