summaryrefslogtreecommitdiff
path: root/frontend/parser.mly
diff options
context:
space:
mode:
authorAlex Auvolat <alex.auvolat@ansys.com>2014-07-03 17:52:37 +0200
committerAlex Auvolat <alex.auvolat@ansys.com>2014-07-03 17:52:37 +0200
commitf808eeaf3016f828d71b0f87afb89bb79a869035 (patch)
treea3baddb1e45087512318be680161c09f7949ced2 /frontend/parser.mly
parent79bf56c809e727ed763e698386163706be2db0a7 (diff)
downloadscade-analyzer-f808eeaf3016f828d71b0f87afb89bb79a869035.tar.gz
scade-analyzer-f808eeaf3016f828d71b0f87afb89bb79a869035.zip
Changes to parser ; EDD optimisations ; test cases.
Diffstat (limited to 'frontend/parser.mly')
-rw-r--r--frontend/parser.mly61
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 *)