shithub: mc

Download patch

ref: e24bcc37239283534785e2e2a31393f20ae6c9b7
parent: 9ae749374b8862dd16792eadacff1fb7dde6fa05
author: Ori Bernstein <[email protected]>
date: Tue Aug 14 14:05:35 EDT 2012

Allow implicit bounds on slices.

--- a/parse/gram.y
+++ b/parse/gram.y
@@ -133,7 +133,7 @@
 %type <node> bandexpr cmpexpr unionexpr addexpr mulexpr shiftexpr prefixexpr postfixexpr
 %type <node> funclit seqlit name block stmt label use
 %type <node> decl declbody declcore structelt seqelt tuphead
-%type <node> ifstmt forstmt whilestmt matchstmt elifs optexprln
+%type <node> ifstmt forstmt whilestmt matchstmt elifs optexprln optexpr
 %type <node> pat unionpat match
 %type <node> castexpr
 %type <ucon> unionelt
@@ -381,6 +381,14 @@
             {$$ = mkexpr($1->line, Oret, NULL);}
         ;
 
+optexpr : expr {$$ = $1;}
+        | /* empty */ {$$ = NULL;}
+        ;
+
+optexprln: exprln {$$ = $1;}
+         | Tendln {$$ = NULL;}
+         ;
+
 exprln  : expr Tendln
         ;
 
@@ -494,8 +502,8 @@
             {$$ = mkexpr($1->line, Opostdec, $1, NULL);}
         | postfixexpr Tosqbrac expr Tcsqbrac
             {$$ = mkexpr($1->line, Oidx, $1, $3, NULL);}
-        | postfixexpr Tosqbrac expr Tcomma expr Tcsqbrac
-            {$$ = mkexpr($1->line, Oslice, $1, $3, $5, NULL);}
+        | postfixexpr Tosqbrac optexpr Tcomma optexpr Tcsqbrac
+            {$$ = mksliceexpr($1->line, $1, $3, $5);}
         | postfixexpr Toparen arglist Tcparen
             {$$ = mkcall($1->line, $1, $3.nl, $3.nn);}
         | atomicexpr
@@ -601,10 +609,6 @@
         | Tfor decl Tendln optexprln optexprln block
             {$$ = mkloopstmt($1->line, $2, $4, $5, $6);}
         ;
-
-optexprln: exprln {$$ = $1;}
-         | Tendln {$$ = NULL;}
-         ;
 
 whilestmt
         : Twhile exprln block
--- a/parse/node.c
+++ b/parse/node.c
@@ -46,6 +46,15 @@
     return n;
 }
 
+Node *mksliceexpr(int line, Node *sl, Node *base, Node *off)
+{
+    if (!base)
+        base = mkintlit(line, 0);
+    if (!off)
+        off = mkexpr(line, Omemb, sl, mkname(line, "len"), NULL);
+    return mkexpr(line, Oslice, sl, base, off, NULL);
+}
+
 Node *mkexprl(int line, Op op, Node **args, size_t nargs)
 {
     Node *n;
@@ -359,4 +368,3 @@
 {
     return did(a) == did(b);
 }
-
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -363,6 +363,7 @@
 Node *mknode(int line, Ntype nt);
 Node *mkfile(char *name);
 Node *mkuse(int line, char *use, int islocal);
+Node *mksliceexpr(int line, Node *sl, Node *base, Node *off);
 Node *mkexprl(int line, Op op, Node **args, size_t nargs);
 Node *mkexpr(int line, Op op, ...); /* NULL terminated */
 Node *mkcall(int line, Node *fn, Node **args, size_t nargs);
--- a/test/slice.myr
+++ b/test/slice.myr
@@ -2,9 +2,9 @@
 	var a : int[3]
 	var s
 
-	s = a[0,3]
+	s = a[,]
 	s[0] = 3
 	s[1] = 4
-	s[2] = s[0] + s[1]
+	s[2] = s[0] + s[1] + s.len
 	-> s[2]
 }
--- a/test/tests
+++ b/test/tests
@@ -36,7 +36,7 @@
 B arrayaddr	E	42
 B global-arrayvar	E	7
 B arraylen	E	12
-B slice		E	7
+B slice		E	10
 B slicelen	E	5
 B call		E	42
 B voidcall	E	12