diff options
Diffstat (limited to 'frontend/parser.mly')
-rw-r--r-- | frontend/parser.mly | 61 |
1 files changed, 19 insertions, 42 deletions
diff --git a/frontend/parser.mly b/frontend/parser.mly index 84dcd15..e8a6ecf 100644 --- a/frontend/parser.mly +++ b/frontend/parser.mly @@ -117,27 +117,16 @@ automaton: state: | i=boption(INITIAL) STATE n=IDENT unless=trans(UNLESS) - v=option(var_decl) - b=body + vb=scbody until=trans(UNTIL) { if unless <> [] then failwith "UNLESS transitions not supported."; + let v, b = vb in { initial = i; st_name = n; - st_locals = (match v with Some v -> v | None -> []); + st_locals = v; body = b; until = until; } } -| i=boption(INITIAL) STATE n=IDENT - unless=trans(UNLESS) - b=ext(eqn) SEMICOLON - until=trans(UNTIL) -{ if unless <> [] then failwith "UNLESS transitions not supported."; - { initial = i; - st_name = n; - st_locals = []; - body = [b]; - until = until; -} } trans(TT): | TT t=nonempty_list(terminated(transition, SEMICOLON)) { t } @@ -151,11 +140,12 @@ activate: | ACTIVATE a=activate_if RETURNS r=separated_list(COMMA, IDENT) { (a, r) } activate_if: | IF c=ext(expr) THEN t=activate_if ELSE e=activate_if { AST_activate_if(c, t, e) } -| lv=option(var_decl) b=body -{ AST_activate_body { +| kb=scbody +{ let loc, body = kb in + AST_activate_body { act_id = "act"^uid(); - act_locals = (match lv with Some v -> v | None -> []); - body = b; + act_locals = loc; + body = body; } } eqn: @@ -172,13 +162,13 @@ typ: | REAL { AST_TREAL } (* Declarations *) -dbody: -| e=ext(eqn) SEMICOLON { [e] } -| l=body { l } - -body: +scbody: +| e=ext(eqn) SEMICOLON { [], [e] } | LET l=nonempty_list(terminated(ext(eqn), SEMICOLON)) TEL - { l } + { [], l} +| VAR v=nonempty_list(terminated(vari, SEMICOLON)) + LET l=nonempty_list(terminated(ext(eqn), SEMICOLON)) TEL + { List.flatten v, l } var: | p=boption(PROBE) i=IDENT { (p, i) } @@ -199,32 +189,19 @@ const_decl: value = e; } } -var_decl: -| VAR l=nonempty_list(terminated(vari, SEMICOLON)) - { List.flatten l } - node_kw: | NODE {} | FUNCTION {} node_decl: | node_kw id=IDENT LPAREN v=vars RPAREN RETURNS LPAREN rv=vars RPAREN - e = dbody -{ { n_name = id; - args = v; - ret = rv; - var = []; - body = e; -} } -| node_kw id=IDENT LPAREN v=vars RPAREN - RETURNS LPAREN rv=vars RPAREN - lv=var_decl - b=body -{ { n_name = id; + sc=scbody +{ let vars, body = sc in + { n_name = id; args = v; ret = rv; - var = lv; - body = b; + var = vars; + body = body; } } (* Utility : add extent information *) |