ref: fb9b1e2de37830ae4e203c9c176b402210c0a1cc
parent: dc95ae0df8f8e050672c1d84a01e2e318000c7ee
author: Ori Bernstein <[email protected]>
date: Sun Nov 13 20:30:35 EST 2011
Actually parse into the file variable
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -78,7 +78,7 @@
fprintf(fd, " (name = %s, islocal = %d)\n", n->use.name, n->use.islocal);
break;
case Nexpr:
- fprintf(fd, " (op = %s, isconst = %d)\n", opstr(n->expr.op), n->expr.isconst);
+ fprintf(fd, " (op = %s, flags = %d)\n", opstr(n->expr.op), n->expr.isconst);
for (i = 0; i < n->expr.nargs; i++)
dumpnode(n->expr.args[i], fd, depth+1);
break;
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -115,8 +115,8 @@
%type <node> exprln retexpr expr atomicexpr literal asnexpr lorexpr landexpr borexpr
%type <node> bandexpr cmpexpr addexpr mulexpr shiftexpr prefixexpr postfixexpr
-%type <node> funclit arraylit name block blockbody stmt label
-%type <node> decl declvariants declbody declcore structelt enumelt unionelt
+%type <node> funclit arraylit name block blockbody stmt label use
+%type <node> decl declbody declcore structelt enumelt unionelt
%type <node> ifstmt forstmt whilestmt elifs optexprln
%type <nodelist> arglist argdefs structbody enumbody unionbody params
@@ -146,18 +146,35 @@
;
toplev
- : decl
- | use
+ : decl
+ {nlappend(&file->file.stmts, &file->file.nstmts, $1);}
+ | use
+ {nlappend(&file->file.uses, &file->file.nuses, $1);}
| package
+ {die("package unimplemented");}
| typedef
+ {die("typedef unimplemented");}
| TEndln
;
-decl : declvariants TEndln {dump($1, stdout);}
+decl : TVar declbody TEndln
+ {$2->decl.flags = 0;
+ $$ = $2;}
+ | TConst declbody TEndln
+ {$2->decl.flags = Dclconst;
+ $$ = $2;}
+ | TExtern TVar declbody TEndln
+ {$3->decl.flags = Dclextern;
+ $$ = $3;}
+ | TExtern TConst declbody TEndln
+ {$3->decl.flags = Dclconst | Dclextern;
+ $$ = $3;}
;
-use : TUse TIdent TEndln
- | TUse TStrlit TEndln
+use : TUse TIdent TEndln
+ {$$ = mkuse($1->line, $2->str, 0);}
+ | TUse TStrlit TEndln
+ {$$ = mkuse($1->line, $2->str, 1);}
;
package : TPkg TIdent TAsn pkgbody TEndblk {}
@@ -178,13 +195,6 @@
| TProtect TColon
;
-
-declvariants
- : TVar declbody {$2->decl.isconst = 0; $$ = $2;}
- | TConst declbody {$2->decl.isconst = 1; $$ = $2;}
- | TExtern TVar declbody {$3->decl.isconst = 0; $$ = $3;}
- | TExtern TConst declbody {$3->decl.isconst = 0; $$ = $3;}
- ;
declbody: declcore TAsn expr {$$ = $1; $1->decl.init = $3;}
| declcore
--- a/parse/main.c
+++ b/parse/main.c
@@ -47,6 +47,7 @@
tokinit(argv[i]);
file = mkfile(argv[i]);
yyparse();
+ dump(file, stdout);
gen();
}
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -31,6 +31,12 @@
#undef Ty
} Ty;
+typedef enum {
+ Dclconst = 1 << 0,
+ Dclextern = 1 << 1,
+} Dclflags;
+
+
struct Tok {
int type;
int line;
@@ -141,7 +147,7 @@
struct {
Sym *sym;
Node *init;
- int isconst;
+ int flags;
} decl;
struct {