ref: b9b381e6f0eb16b144127f1fbb7b4ce17da8e66c
parent: 4c863884833102c4d44d8d52104fd11e48200a55
author: Ori Bernstein <[email protected]>
date: Mon Jul 9 09:18:04 EDT 2012
Parse and store unadorned literal sequences Now, the '[a,b,c]' syntax parses and gets nodes built. It also gets passed down to the type inference code.
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -175,7 +175,8 @@
break;
case Lseq:
fprintf(fd, " Lseq\n");
- outnode(n->lit.arrval, fd, depth+1);
+ for (i = 0; i < n->lit.nelt; i++)
+ outnode(n->lit.seqval[i], fd, depth+1);
break;
default: die("Bad literal type"); break;
}
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -519,7 +519,7 @@
;
seqlit : Tosqbrac seqbody Tcsqbrac
- {$$ = mkarray($1->line, $2.nl, $2.nn);}
+ {$$ = mkseq($1->line, $2.nl, $2.nn);}
;
seqbody : seqelt
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -529,7 +529,7 @@
case Olit: /* <lit>:@a::tyclass -> @a */
switch (args[0]->lit.littype) {
case Lfunc: infernode(args[0]->lit.fnval, NULL, NULL); break;
- case Lseq: die("array types not implemented yet"); break;
+ case Lseq: die("seq lits not implemented yet"); break;
default: break;
}
settype(n, type(args[0]));
@@ -897,7 +897,10 @@
settype(n, tyfix(n, type(n)));
switch (n->lit.littype) {
case Lfunc: typesub(n->lit.fnval); break;
- case Lseq: typesub(n->lit.arrval); break;
+ case Lseq:
+ for (i = 0; i < n->lit.nelt; i++)
+ typesub(n->lit.seqval[i]);
+ break;
default: break;
}
break;
--- a/parse/node.c
+++ b/parse/node.c
@@ -208,12 +208,15 @@
return n;
}
-Node *mkarray(int line, Node **vals, size_t nvals)
+Node *mkseq(int line, Node **vals, size_t nvals)
{
Node *n;
- n = NULL;
- die("Yeah, I need an array repr...");
+ n = mknode(line, Nlit);
+ n->lit.littype = Lseq;
+ n->lit.nelt = nvals;
+ n->lit.seqval = vals;
+
return n;
}
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -169,7 +169,7 @@
char *strval;
int boolval;
Node *fnval;
- Node *arrval;
+ Node **seqval;
};
} lit;
@@ -363,7 +363,7 @@
Node *mkstr(int line, char *s);
Node *mkfloat(int line, double flt);
Node *mkfunc(int line, Node **args, size_t nargs, Type *ret, Node *body);
-Node *mkarray(int line, Node **vals, size_t nvals);
+Node *mkseq(int line, Node **vals, size_t nvals);
Node *mkname(int line, char *name);
Node *mknsname(int line, char *ns, char *name);
Node *mkdecl(int line, Node *name, Type *ty);
--- a/parse/pickle.c
+++ b/parse/pickle.c
@@ -304,6 +304,7 @@
case Nlit:
wrbyte(fd, n->lit.littype);
wrtype(fd, n->lit.type);
+ wrint(fd, n->lit.nelt);
switch (n->lit.littype) {
case Lchr: wrint(fd, n->lit.chrval); break;
case Lint: wrint(fd, n->lit.intval); break;
@@ -311,7 +312,10 @@
case Lstr: wrstr(fd, n->lit.strval); break;
case Lbool: wrbool(fd, n->lit.boolval); break;
case Lfunc: pickle(n->lit.fnval, fd); break;
- case Lseq: pickle(n->lit.arrval, fd); break;
+ case Lseq:
+ for (i = 0; i < n->lit.nelt; i++)
+ pickle(n->lit.seqval[i], fd);
+ break;
}
break;
case Nloopstmt:
@@ -417,6 +421,7 @@
case Nlit:
n->lit.littype = rdbyte(fd);
n->lit.type = rdtype(fd);
+ n->lit.nelt = rdint(fd);
switch (n->lit.littype) {
case Lchr: n->lit.chrval = rdint(fd); break;
case Lint: n->lit.intval = rdint(fd); break;
@@ -424,7 +429,10 @@
case Lstr: n->lit.strval = rdstr(fd); break;
case Lbool: n->lit.boolval = rdbool(fd); break;
case Lfunc: n->lit.fnval = unpickle(fd); break;
- case Lseq: n->lit.arrval = unpickle(fd); break;
+ case Lseq:
+ for (i = 0; i < n->lit.nelt; i++)
+ n->lit.seqval[i] = unpickle(fd);
+ break;
}
break;
case Nloopstmt:
--- a/parse/specialize.c
+++ b/parse/specialize.c
@@ -102,7 +102,10 @@
case Nlit:
switch (n->lit.littype) {
case Lfunc: fixup(n->lit.fnval); break;
- case Lseq: fixup(n->lit.arrval); break;
+ case Lseq:
+ for (i = 0; i < n->lit.nelt; i++)
+ fixup(n->lit.seqval[i]);
+ break;
case Lchr: case Lint: case Lflt: case Lstr: case Lbool:
break;
}
@@ -182,7 +185,10 @@
case Lstr: r->lit.strval = n->lit.strval; break;
case Lbool: r->lit.boolval = n->lit.boolval; break;
case Lfunc: r->lit.fnval = specializenode(n->lit.fnval, tsmap); break;
- case Lseq: r->lit.arrval = specializenode(n->lit.arrval, tsmap); break;
+ case Lseq:
+ for (i = 0; i < n->lit.nelt; i++)
+ r->lit.seqval[i] = specializenode(n->lit.seqval[i], tsmap);
+ break;
}
break;
case Nifstmt: