summaryrefslogtreecommitdiffhomepage
path: root/parser.y
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-11-03 16:49:31 +0100
committerJo-Philipp Wich <jo@mein.io>2020-11-03 16:49:54 +0100
commit01deebeae5f615aff8fd8a3bb35280e60e2082ad (patch)
tree8c488925d73247ee4264969105987f1e3b703b74 /parser.y
parente8e7692f169ae00434f3e0959f104d95284d2891 (diff)
syntax: implement ES6-like spread operator
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'parser.y')
-rw-r--r--parser.y18
1 files changed, 14 insertions, 4 deletions
diff --git a/parser.y b/parser.y
index 289fdfa..aea7ab3 100644
--- a/parser.y
+++ b/parser.y
@@ -310,7 +310,7 @@ unary_exp(A) ::= postfix_exp(B). { A = B; }
postfix_exp(A) ::= unary_exp(B) T_INC(C). { A = wrap_op(C, B); ut_get_op(s, A)->is_postfix = 1; }
postfix_exp(A) ::= unary_exp(B) T_DEC(C). { A = wrap_op(C, B); ut_get_op(s, A)->is_postfix = 1; }
postfix_exp(A) ::= unary_exp(B) T_LPAREN(C) T_RPAREN. { A = wrap_op(C, B); }
-postfix_exp(A) ::= unary_exp(B) T_LPAREN(C) arg_exp(D) T_RPAREN.
+postfix_exp(A) ::= unary_exp(B) T_LPAREN(C) arg_exps(D) T_RPAREN.
{ A = wrap_op(C, B, D); }
postfix_exp(A) ::= postfix_exp(B) T_DOT(C) T_LABEL(D). { A = wrap_op(C, B, D); }
postfix_exp(A) ::= postfix_exp(B) T_LBRACK(C) assign_exp(D) T_RBRACK.
@@ -338,7 +338,13 @@ primary_exp(A) ::= T_FUNC T_LPAREN args(B) T_RPAREN cpd_stmt(C).
{ A = new_op(T_FUNC, NULL, 0, B, C); }
array(A) ::= T_LBRACK(B) T_RBRACK. { A = B; }
-array(A) ::= T_LBRACK(B) exp(C) T_RBRACK. { A = wrap_op(B, C); }
+array(A) ::= T_LBRACK(B) items(C) T_RBRACK. { A = wrap_op(B, C); }
+
+items(A) ::= items(B) T_COMMA item(C). { A = append_op(B, C); }
+items(A) ::= item(B). { A = B; }
+
+item(A) ::= T_ELLIP assign_exp(B). { A = B; ut_get_op(s, A)->is_ellip = 1; }
+item(A) ::= assign_exp(B). { A = B; }
object(A) ::= empty_object(B). { A = B; }
object(A) ::= T_LBRACE(B) tuples(C) T_RBRACE. { A = wrap_op(B, C); }
@@ -350,6 +356,10 @@ tuples(A) ::= tuple(B). { A = B; }
tuple(A) ::= T_LABEL(B) T_COLON exp(C). { A = append_op(B, C); }
tuple(A) ::= T_STRING(B) T_COLON exp(C). { A = append_op(B, C); }
+tuple(A) ::= T_ELLIP(B) assign_exp(C). { A = append_op(B, C); }
+
+arg_exps(A) ::= arg_exps(B) T_COMMA arg_exp(C). { A = append_op(B, C); ut_get_op(s, A)->is_list = 1; }
+arg_exps(A) ::= arg_exp(B). { A = B; ut_get_op(s, A)->is_list = 1; }
-arg_exp(A) ::= arg_exp(B) T_COMMA assign_exp(C). { A = append_op(B, C); ut_get_op(s, A)->is_list = 1; }
-arg_exp(A) ::= assign_exp(B). { A = B; ut_get_op(s, A)->is_list = 1; }
+arg_exp(A) ::= T_ELLIP assign_exp(B). { A = B; ut_get_op(s, A)->is_ellip = 1; }
+arg_exp(A) ::= assign_exp(B). { A = B; }