shithub: mc

Download patch

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 {