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