From aa664edcd403408b761f95129dfc466a2a7ef5c2 Mon Sep 17 00:00:00 2001 From: Nicolas PENELOUX Date: Wed, 18 Oct 2023 22:35:14 +0200 Subject: [PATCH] suite expressions --- flap/src/hopix/hopixLexer.mll | 2 + flap/src/hopix/hopixParser.mly | 78 ++++++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/flap/src/hopix/hopixLexer.mll b/flap/src/hopix/hopixLexer.mll index f5da56d..ba2a316 100644 --- a/flap/src/hopix/hopixLexer.mll +++ b/flap/src/hopix/hopixLexer.mll @@ -104,6 +104,8 @@ rule token = parse | ',' { COMMA } | '.' { DOT } | '\\' {BACKSLASH } + | ":=" { ASSIGN } + | '!' { EXCLA } (** Strings *) | '"' { read_string (Buffer.create 16) lexbuf } diff --git a/flap/src/hopix/hopixParser.mly b/flap/src/hopix/hopixParser.mly index 8555486..010c8b5 100644 --- a/flap/src/hopix/hopixParser.mly +++ b/flap/src/hopix/hopixParser.mly @@ -8,6 +8,7 @@ %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 FROM IF MATCH PIPE REF THEN TO UNTIL WHILE AND_KW DOT SEMICOLON BACKSLASH +%token ASSIGN EXCLA %token INT %token ID TID CID STRING @@ -293,15 +294,18 @@ simple_expression: Record(l, t_list) } + /* Lecture de variable */ + /* ! expr */ + | EXCLA e=located(simple_expression) { + Read(e) + } + expression: | e=simple_expression{ e } - - - /* Field */ /* e.l */ @@ -336,6 +340,74 @@ simple_expression: | e1=located(expression) e2=located(expression){ Apply(e1,e2) } + + /* TODO operation binaire mais j'ai pas très bien compris encore */ + + + /* Match (exp) {| ...| ... | ...} */ + | MATCH LPAREN e=located(expression) RPAREN + LBRACE b=branches RBRACE { + Case(e,b) + } + + /* TODO if ( exp ) then { expr } j'ai RIEN COMPRIS */ + /* + | IF LPAREN e=located(expression) RPAREN + THEN LBRACE e2=located(expression) RBRACE{ + IfThenElse(e,e2,None) + } +*/ + /* if ( expr ) then { expr } else { expr } */ + | IF LPAREN e=located(expression) RPAREN + THEN LBRACE e2=located(expression) RBRACE + ELSE LBRACE e3=located(expression) RBRACE { + IfThenElse(e,e2,e3) + } + + /* Reference ref expr */ + + | REF e=located(expression){ + Ref(e) + } + + /* Affectation */ + /* expr := expr */ + + | e1=located(expression) ASSIGN e2=located(expression){ + Assign(e1,e2) + } + + /* While */ + /* while ( expr ) { expr } */ + | WHILE LPAREN e=located(expression) RPAREN + LBRACE e2=located(expression) RBRACE { + While(e,e2) + } + + /* Do while TODO */ + /* do { expr } until ( expr ) */ + + /* boucle for */ + /* for x in (e1 to e2) { expr } */ + | FOR x=located(identifier) + FROM LPAREN e1=located(expression) RPAREN TO LPAREN e2=located(expression) RPAREN + LBRACE e3=located(expression) RBRACE + { For(x,e1,e2,e3)} + + /* Parenthésage pas sûr mais je vois pas sinon*/ + | LPAREN e=expression RPAREN { + e + } + + /* Annotation de type */ + /* (e : ty) */ + | LPAREN e=located(expression) COLON t=located(ty) RPAREN { + TypeAnnotation(e,t) + } + + + +