|
|
|
@ -4,8 +4,10 @@ open Signature
|
|
|
|
|
open Names
|
|
|
|
|
open Idents
|
|
|
|
|
open Types
|
|
|
|
|
open Clocks
|
|
|
|
|
open Location
|
|
|
|
|
open Minils
|
|
|
|
|
open Mls_parsetree
|
|
|
|
|
open Mls_utils
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -32,6 +34,7 @@ open Mls_utils
|
|
|
|
|
%token AROBASE
|
|
|
|
|
%token WITH
|
|
|
|
|
%token DOTDOT
|
|
|
|
|
%token BASE UNDERSCORE ON COLONCOLON
|
|
|
|
|
%token DEFAULT
|
|
|
|
|
%token LBRACKET RBRACKET
|
|
|
|
|
%token MAP FOLD MAPFOLD
|
|
|
|
@ -61,7 +64,7 @@ open Mls_utils
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%start program
|
|
|
|
|
%type <Minils.program> program
|
|
|
|
|
%type <Mls_parsetree.program> program
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
|
@ -84,7 +87,7 @@ localize(x): y=x { y, (Loc($startpos(y),$endpos(y))) }
|
|
|
|
|
|
|
|
|
|
program:
|
|
|
|
|
| o=open_modules c=const_decs t=type_decs n=node_decs EOF
|
|
|
|
|
{ mk_program o t n c }
|
|
|
|
|
{ mk_program o n t c }
|
|
|
|
|
|
|
|
|
|
open_modules: l=list(opens) {l}
|
|
|
|
|
opens: OPEN c=CONSTRUCTOR {c}
|
|
|
|
@ -104,11 +107,11 @@ type_ident: NAME { Tid(Name($1)) }
|
|
|
|
|
type_decs: t=list(type_dec) {t}
|
|
|
|
|
type_dec:
|
|
|
|
|
| TYPE n=NAME
|
|
|
|
|
{ mk_type_dec ~loc:(Loc ($startpos,$endpos)) ~type_desc:Type_abs n }
|
|
|
|
|
{ mk_type_dec Type_abs n (Loc ($startpos,$endpos)) }
|
|
|
|
|
| TYPE n=NAME EQUAL e=snlist(BAR,NAME)
|
|
|
|
|
{ mk_type_dec ~loc:(Loc ($startpos,$endpos)) ~type_desc:(Type_enum e) n }
|
|
|
|
|
{ mk_type_dec (Type_enum e) n (Loc ($startpos,$endpos)) }
|
|
|
|
|
| TYPE n=NAME EQUAL s=structure(field_type)
|
|
|
|
|
{ mk_type_dec ~loc:(Loc ($startpos,$endpos)) ~type_desc:(Type_struct s) n }
|
|
|
|
|
{ mk_type_dec (Type_struct s) n (Loc ($startpos,$endpos)) }
|
|
|
|
|
|
|
|
|
|
node_decs: ns=list(node_dec) {ns}
|
|
|
|
|
node_dec:
|
|
|
|
@ -130,15 +133,30 @@ loc_vars_t:
|
|
|
|
|
loc_vars_h: VAR h=var t=loc_vars_t {h@t}
|
|
|
|
|
loc_vars: l=loption(loc_vars_h) {l}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ck_base: | UNDERSCORE | BASE {}
|
|
|
|
|
|
|
|
|
|
ck:
|
|
|
|
|
| ck_base { Cbase }
|
|
|
|
|
| ck=ck ON c=constructor LPAREN x=NAME RPAREN { Con (ck, c, x) }
|
|
|
|
|
|
|
|
|
|
ct:
|
|
|
|
|
| LPAREN ctl=snlist(STAR,ct) RPAREN { Cprod ctl }
|
|
|
|
|
| c=ck { Ck c }
|
|
|
|
|
|
|
|
|
|
clock_annot:
|
|
|
|
|
| /*empty*/ { Cbase }
|
|
|
|
|
| COLONCOLON c=ck { c }
|
|
|
|
|
|
|
|
|
|
var:
|
|
|
|
|
| ns=snlist(COMMA, NAME) COLON t=type_ident
|
|
|
|
|
{ List.map (fun id -> mk_var_dec (ident_of_name id) t) ns }
|
|
|
|
|
| ns=snlist(COMMA, NAME) COLON t=type_ident c=clock_annot
|
|
|
|
|
{ List.map (fun n -> mk_var_dec n t c (Loc ($startpos,$endpos))) ns }
|
|
|
|
|
|
|
|
|
|
equs: LET e=slist(SEMICOL, equ) TEL { e }
|
|
|
|
|
equ: p=pat EQUAL e=exp { mk_equation ~loc:(Loc ($startpos,$endpos)) p e }
|
|
|
|
|
equ: p=pat EQUAL e=exp { mk_equation p e (Loc ($startpos,$endpos)) }
|
|
|
|
|
|
|
|
|
|
pat:
|
|
|
|
|
| n=NAME {Evarpat (ident_of_name n)}
|
|
|
|
|
| n=NAME {Evarpat n}
|
|
|
|
|
| LPAREN p=snlist(COMMA, pat) RPAREN {Etuplepat p}
|
|
|
|
|
|
|
|
|
|
longname: l=qualified(name) {l} /* qualified var (not a constructor) */
|
|
|
|
@ -147,11 +165,10 @@ constructor: /* of type longname */
|
|
|
|
|
| ln=qualified(CONSTRUCTOR) { ln }
|
|
|
|
|
| b=BOOL { Name(if b then "true" else "false") }
|
|
|
|
|
|
|
|
|
|
/* TODO donner un type !! Phase de typing. */
|
|
|
|
|
field:
|
|
|
|
|
| ln=longname { mk_static_exp ~loc:(Loc($startpos,$endpos)) (Sconstructor ln)}
|
|
|
|
|
|
|
|
|
|
/* TODO donner un type !! Phase de typing. */
|
|
|
|
|
|
|
|
|
|
const : c=_const { mk_static_exp ~loc:(Loc ($startpos,$endpos)) c }
|
|
|
|
|
_const:
|
|
|
|
|
| i=INT { Sint i }
|
|
|
|
@ -164,7 +181,7 @@ exps: LPAREN e=slist(COMMA, exp) RPAREN {e}
|
|
|
|
|
field_exp: longname EQUAL exp { ($1, $3) }
|
|
|
|
|
|
|
|
|
|
simple_exp:
|
|
|
|
|
| e=_simple_exp {mk_exp e ~loc:(Loc ($startpos,$endpos)) }
|
|
|
|
|
| e=_simple_exp {mk_exp e (Loc ($startpos,$endpos)) }
|
|
|
|
|
_simple_exp:
|
|
|
|
|
| n=NAME { Evar (ident_of_name n) }
|
|
|
|
|
| s=structure(field_exp) { Estruct s }
|
|
|
|
@ -175,7 +192,7 @@ _simple_exp:
|
|
|
|
|
|
|
|
|
|
exp:
|
|
|
|
|
| e=simple_exp { e }
|
|
|
|
|
| e=_exp { mk_exp e ~loc:(Loc ($startpos,$endpos)) }
|
|
|
|
|
| e=_exp { mk_exp e (Loc ($startpos,$endpos)) }
|
|
|
|
|
_exp:
|
|
|
|
|
| c=const { Econst c }
|
|
|
|
|
| v=const FBY e=exp { Efby(Some(v), e) }
|
|
|
|
@ -196,7 +213,7 @@ _exp:
|
|
|
|
|
| e=exp POWER p=e_param
|
|
|
|
|
{ Eapp(mk_app ~params:[p] Earray_fill, [e], None) }
|
|
|
|
|
| e=simple_exp i=indexes(exp) /* not e_params to solve conflicts */
|
|
|
|
|
{ Eapp(mk_app ~params:(List.map static_exp_of_exp i) Eselect, [e], None) }
|
|
|
|
|
{ Eapp(mk_app ~params:i Eselect, [e], None) }
|
|
|
|
|
| e=simple_exp i=indexes(exp) DEFAULT d=exp
|
|
|
|
|
{ Eapp(mk_app Eselect_dyn, [e; d]@i, None) }
|
|
|
|
|
| LPAREN e=exp WITH i=indexes(e_param) EQUAL nv=exp
|
|
|
|
@ -228,10 +245,10 @@ iterator:
|
|
|
|
|
reset: r=option(RESET,ident) { r }
|
|
|
|
|
|
|
|
|
|
/* TODO : Scoping to deal with node and fun ! */
|
|
|
|
|
funapp: ln=longname p=params(e_param) { mk_app ~params:p (Enode ln) }
|
|
|
|
|
funapp: ln=longname p=params(e_param) { mk_app p (Enode ln) }
|
|
|
|
|
|
|
|
|
|
/* inline so that precendance of POWER is respected in exp */
|
|
|
|
|
%inline e_param: e=exp { static_exp_of_exp e }
|
|
|
|
|
%inline e_param: e=exp { e }
|
|
|
|
|
n_param: n=NAME { mk_param n }
|
|
|
|
|
params(param):
|
|
|
|
|
| /*empty*/ { [] }
|
|
|
|
|