summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-11-28 02:02:46 +0100
committerAraq <rumpf_a@web.de>2012-11-28 02:02:46 +0100
commit0d19de18cce2ba62e3c753e7474c29bbe4c47ad7 (patch)
tree655167b51f60c06c1347ebef9a81516f212ab221 /compiler
parentc43bf78000b21001726b31eb4259b90b3c91e03c (diff)
downloadNim-0d19de18cce2ba62e3c753e7474c29bbe4c47ad7.tar.gz
first steps for the 'export' feature
Diffstat (limited to 'compiler')
-rwxr-xr-xcompiler/ast.nim2
-rwxr-xr-xcompiler/parser.nim38
-rwxr-xr-xcompiler/renderer.nim15
3 files changed, 30 insertions, 25 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 027f4d003..77f8723e2 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -173,7 +173,9 @@ type
     nkStmtList,           # a list of statements
     nkImportStmt,         # an import statement
     nkFromStmt,           # a from * import statement
+    nkImportExceptStmt,   # an import x except a statement
     nkIncludeStmt,        # an include statement
+    nkExportStmt,         # an export statement
     nkBindStmt,           # a bind statement
     nkMixinStmt,          # a mixin statement
     nkCommentStmt,        # a comment statement
diff --git a/compiler/parser.nim b/compiler/parser.nim
index d5457fcd8..7ab87804e 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -901,27 +901,30 @@ proc parseExprStmt(p: var TParser): PNode =
         addSon(result, b)
         if b.kind == nkElse: break
     
-proc parseImportOrIncludeStmt(p: var TParser, kind: TNodeKind): PNode = 
+proc parseModuleName(p: var TParser): PNode {.inline.} =
+  result = parseExpr(p)
+
+proc parseImportOrIncludeStmt(p: var TParser, kind: TNodeKind): PNode =
   var a: PNode
   result = newNodeP(kind, p)
   getTok(p)                   # skip `import` or `include`
   optInd(p, result)
-  while true: 
+  while true:
     case p.tok.tokType
-    of tkEof, tkSad, tkDed: 
-      break 
-    of tkSymbol, tkAccent: 
+    of tkEof, tkSad, tkDed:
+      break
+    of tkSymbol, tkAccent:
       a = parseSymbol(p)
-    of tkRStrLit: 
+    of tkRStrLit:
       a = newStrNodeP(nkRStrLit, p.tok.literal, p)
       getTok(p)
-    of tkStrLit: 
+    of tkStrLit:
       a = newStrNodeP(nkStrLit, p.tok.literal, p)
       getTok(p)
-    of tkTripleStrLit: 
+    of tkTripleStrLit:
       a = newStrNodeP(nkTripleStrLit, p.tok.literal, p)
       getTok(p)
-    else: 
+    else:
       parMessage(p, errIdentifierExpected, p.tok)
       break 
     addSon(result, a)
@@ -931,25 +934,10 @@ proc parseImportOrIncludeStmt(p: var TParser, kind: TNodeKind): PNode =
   expectNl(p)
 
 proc parseFromStmt(p: var TParser): PNode = 
-  var a: PNode
   result = newNodeP(nkFromStmt, p)
   getTok(p)                   # skip `from`
   optInd(p, result)
-  case p.tok.tokType
-  of tkSymbol, tkAccent: 
-    a = parseSymbol(p)
-  of tkRStrLit: 
-    a = newStrNodeP(nkRStrLit, p.tok.literal, p)
-    getTok(p)
-  of tkStrLit: 
-    a = newStrNodeP(nkStrLit, p.tok.literal, p)
-    getTok(p)
-  of tkTripleStrLit: 
-    a = newStrNodeP(nkTripleStrLit, p.tok.literal, p)
-    getTok(p)
-  else: 
-    parMessage(p, errIdentifierExpected, p.tok)
-    return 
+  var a = parseModuleName(p)
   addSon(result, a)           #optInd(p, a);
   eat(p, tkImport)
   optInd(p, result)
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index b9d522694..4444f2ab0 100755
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -1148,6 +1148,14 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
     putWithSpace(g, tkImport, "import")
     gcomma(g, n, emptyContext, 1)
     putNL(g)
+  of nkImportExceptStmt:
+    putWithSpace(g, tkImport, "import")
+    gsub(g, n.sons[0])
+    put(g, tkSpaces, Space)
+    putWithSpace(g, tkExcept, "except")
+    gcommaAux(g, n, g.indent, 1)
+    gcoms(g)
+    putNL(g)
   of nkIncludeStmt: 
     putWithSpace(g, tkInclude, "include")
     gcoms(g)
@@ -1155,6 +1163,13 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
     gcommaAux(g, n, g.indent)
     dedent(g)
     putNL(g)
+  of nkExportStmt:
+    putWithSpace(g, tkExport, "export")
+    gcoms(g)
+    indentNL(g)
+    gcommaAux(g, n, g.indent)
+    dedent(g)
+    putNL(g)
   of nkCommentStmt: 
     gcoms(g)
     optNL(g)