fix POr et PAnd, continuation d'expression

This commit is contained in:
Nicolas PENELOUX 2023-10-18 18:31:18 +02:00
parent d1cdc273bd
commit 648076bb3e
2 changed files with 73 additions and 18 deletions

View file

@ -94,6 +94,7 @@ rule token = parse
| '}' { RBRACE } | '}' { RBRACE }
| '_' { WILDCARD } | '_' { WILDCARD }
| ':' { COLON } | ':' { COLON }
| ';' { SEMICOLON}
| "->" { ARROW } | "->" { ARROW }
| '<' { INFERIOR } | '<' { INFERIOR }
| '>' { SUPERIOR } | '>' { SUPERIOR }
@ -102,6 +103,7 @@ rule token = parse
| '*' { STAR } | '*' { STAR }
| ',' { COMMA } | ',' { COMMA }
| '.' { DOT } | '.' { DOT }
| '\\' {BACKSLASH }
(** Strings *) (** Strings *)
| '"' { read_string (Buffer.create 16) lexbuf } | '"' { read_string (Buffer.create 16) lexbuf }

View file

@ -7,7 +7,7 @@
%token EOF LET TYPE WILDCARD STAR ARROW COLON EXTERN FUN COMMA AND EQUAL LPAREN %token EOF LET TYPE WILDCARD STAR ARROW COLON EXTERN FUN COMMA AND EQUAL LPAREN
%token RPAREN LBRACK RBRACK LBRACE RBRACE INFERIOR SUPERIOR BINOP DO ELSE FOR %token RPAREN LBRACK RBRACK LBRACE RBRACE INFERIOR SUPERIOR BINOP DO ELSE FOR
%token FROM IF MATCH PIPE REF THEN TO UNTIL WHILE AND_KW DOT %token FROM IF MATCH PIPE REF THEN TO UNTIL WHILE AND_KW DOT SEMICOLON BACKSLASH
%token<Mint.t> INT %token<Mint.t> INT
%token<string> ID TID CID STRING %token<string> ID TID CID STRING
@ -94,7 +94,22 @@ fundef:
/* à revoir éventuellement : PTaggedValue (et PRecord) est réécrite 4 fois, mais /* à revoir éventuellement : PTaggedValue (et PRecord) est réécrite 4 fois, mais
* peut être qu'en utilisant des option, on pourrait diminuer le nombre de répétition. * peut être qu'en utilisant des option, on pourrait diminuer le nombre de répétition.
* TODO : y'a environ 50 warnings ici, surtout au niveau du POr et PAnd */ * TODO : y'a environ 50 warnings ici, surtout au niveau du POr et PAnd */
pattern:
branches:
| b=separated_nonempty_list(PIPE,located(branch)){
b
}
| PIPE b = separated_nonempty_list(PIPE,located(branch)){
b
}
branch:
| p = located(pattern) ARROW e=located(expression){
Branch(p,e)
}
simple_pattern:
/* Parenthésage */ /* Parenthésage */
| LPAREN p=pattern RPAREN { | LPAREN p=pattern RPAREN {
p p
@ -108,7 +123,7 @@ pattern:
PWildcard PWildcard
} }
/* Annotation de type */ /* Annotation de type */
| p=located(pattern) COLON ty=located(ty) { | p=located(simple_pattern) COLON ty=located(ty) {
PTypeAnnotation(p,ty) PTypeAnnotation(p,ty)
} }
/* Entier / Caractère / String */ /* Entier / Caractère / String */
@ -140,16 +155,23 @@ pattern:
PRecord(l, liste_ty) PRecord(l, liste_ty)
} }
/* Disjonction */ /* Disjonction */
/*
| p1=located(pattern) PIPE p_list=separated_nonempty_list(PIPE, located(pattern)) { pattern:
| p1=pattern_and{
p1
}
| p1=located(pattern_and) PIPE p_list=separated_nonempty_list(PIPE, located(pattern_and)) {
POr(p1 :: p_list) POr(p1 :: p_list)
} }
/* Conjonction */ /* Conjonction */
/* pattern_and:
| p1=located(pattern) AND p_list=separated_nonempty_list(AND, located(pattern)) { | p1=simple_pattern{
p1
}
| p1=located(simple_pattern) AND p_list=separated_nonempty_list(AND, located(simple_pattern)) {
PAnd(p1 :: p_list) PAnd(p1 :: p_list)
} }
*/
pattern_list: pattern_list:
/* N-uplets */ /* N-uplets */
| LPAREN p=separated_nonempty_list(COMMA, pattern) RPAREN { | LPAREN p=separated_nonempty_list(COMMA, pattern) RPAREN {
@ -214,7 +236,7 @@ type_scheme:
/* De manière générale, il faudrait au mieux revoir le code, pour le factoriser et le rendre plus propre */ /* De manière générale, il faudrait au mieux revoir le code, pour le factoriser et le rendre plus propre */
/* (il y a même moyen que ça le soit obligatoire pour pas avoir des conflits éventuel) */ /* (il y a même moyen que ça le soit obligatoire pour pas avoir des conflits éventuel) */
/* Exemple : TAgged et Record, trop de cas différent alors qu'on pourrait en faire en 2 fois au moins voir 1 */ /* Exemple : TAgged et Record, trop de cas différent alors qu'on pourrait en faire en 2 fois au moins voir 1 */
expression: simple_expression:
/* Simple litteral */ /* Simple litteral */
| l=located(literal) { | l=located(literal) {
Literal l Literal l
@ -230,7 +252,15 @@ expression:
Variable(i,t_list) Variable(i,t_list)
} }
/* Tagged Value*/ /* Tuple n = 0 and n > 1 */
| LPAREN RPAREN {
Tuple([])
}
| LPAREN e=located(expression) COMMA e_list = separated_nonempty_list(COMMA,located(expression)) RPAREN {
Tuple(e::e_list)
}
/* Tagged Value*/
/* K */ /* K */
| const = located(constructor){ | const = located(constructor){
Tagged(const,None,[]) Tagged(const,None,[])
@ -252,14 +282,6 @@ expression:
Tagged(const,t_list,e_list) Tagged(const,t_list,e_list)
} }
/* Tuple n = 0 and n > 1 */
| LPAREN RPAREN {
Tuple([])
}
| LPAREN e=located(expression) COMMA e_list = separated_nonempty_list(COMMA,located(expression)) RPAREN {
Tuple(e::e_list)
}
/* Record */ /* Record */
| LBRACE l=separated_nonempty_list(COMMA, separated_pair(located(label), EQUAL, located(expression))) RBRACE { | LBRACE l=separated_nonempty_list(COMMA, separated_pair(located(label), EQUAL, located(expression))) RBRACE {
Record(l, None) Record(l, None)
@ -271,6 +293,15 @@ expression:
Record(l, t_list) Record(l, t_list)
} }
expression:
| e=simple_expression{
e
}
/* Field */ /* Field */
/* e.l */ /* e.l */
@ -285,6 +316,28 @@ expression:
| e = located(expression) DOT l=located(label) INFERIOR t_list = option(separated_nonempty_list(COMMA,located(ty))) SUPERIOR { | e = located(expression) DOT l=located(label) INFERIOR t_list = option(separated_nonempty_list(COMMA,located(ty))) SUPERIOR {
Field(e,l,t_list) Field(e,l,t_list)
} }
/* Sequence */
/* Pas sûr, voir s'il ne fuat pas une troisième couche d'expression */
| e = located(simple_expression) SEMICOLON e_list = separated_nonempty_list(SEMICOLON,located(simple_expression)){
Sequence(e::e_list)
}
/* Definition locale */
| vd= vdefinition SEMICOLON e=located(expression){
Define(vd,e)
}
/* Fonction anonyme */
| BACKSLASH p=located(pattern) ARROW e=located(expression){
Fun(FunctionDefinition(p,e))
}
/* Application */
| e1=located(expression) e2=located(expression){
Apply(e1,e2)
}
/******************************** BASIC TYPES *********************************/ /******************************** BASIC TYPES *********************************/