summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xcompiler/parser.nim20
-rwxr-xr-xcompiler/renderer.nim11
-rwxr-xr-xlib/core/macros.nim22
3 files changed, 29 insertions, 24 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index c26b54531..b579d20be 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -355,6 +355,24 @@ proc exprColonEqExprList(p: var TParser, kind, elemKind: TNodeKind,
   result = newNodeP(kind, p)
   exprColonEqExprListAux(p, elemKind, endTok, sepTok, result)
 
+proc setOrTableConstr(p: var TParser): PNode =
+  result = newNodeP(nkCurly, p)
+  getTok(p) # skip '{'
+  optInd(p, result)
+  if p.tok.tokType == tkColon:
+    getTok(p) # skip ':'
+    result.kind = nkTableConstr
+  else:
+    while p.tok.tokType notin {tkCurlyRi, tkEof, tkSad, tkInd}: 
+      var a = exprColonEqExpr(p, nkExprColonExpr, tkColon)
+      if a.kind == nkExprColonExpr: result.kind = nkTableConstr
+      addSon(result, a)
+      if p.tok.tokType != tkComma: break 
+      getTok(p)
+      optInd(p, a)
+  optPar(p)
+  eat(p, tkCurlyRi) # skip '}'
+
 proc parseCast(p: var TParser): PNode = 
   result = newNodeP(nkCast, p)
   getTok(p)
@@ -460,7 +478,7 @@ proc identOrLiteral(p: var TParser): PNode =
     result = exprColonEqExprList(p, nkPar, nkExprColonExpr, tkParRi, tkColon)
   of tkCurlyLe: 
     # {} constructor
-    result = exprColonEqExprList(p, nkCurly, nkRange, tkCurlyRi, tkDotDot)
+    result = setOrTableConstr(p)
   of tkBracketLe: 
     # [] constructor
     result = exprColonEqExprList(p, nkBracket, nkExprColonExpr, tkBracketRi, 
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index 5ba24bbfa..476709f8d 100755
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -339,6 +339,8 @@ proc lsub(n: PNode): int =
   of nkCommand: result = lsub(n.sons[0]) + lcomma(n, 1) + 1
   of nkExprEqExpr, nkAsgn, nkFastAsgn: result = lsons(n) + 3
   of nkPar, nkCurly, nkBracket: result = lcomma(n) + 2
+  of nkTableConstr:
+    result = if n.len > 0: lcomma(n) + 2 else: len("{:}")
   of nkSymChoice: result = lsons(n) + len("()") + sonsLen(n) - 1
   of nkTupleTy: result = lcomma(n) + len("tuple[]")
   of nkDotExpr: result = lsons(n) + 1
@@ -750,7 +752,12 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
     put(g, tkCurlyLe, "{")
     gcomma(g, n, c)
     put(g, tkCurlyRi, "}")
-  of nkBracket: 
+  of nkTableConstr:
+    put(g, tkCurlyLe, "{")
+    if n.len > 0: gcomma(g, n, c)
+    else: put(g, tkColon, ":")
+    put(g, tkCurlyRi, "}")
+  of nkBracket:
     put(g, tkBracketLe, "[")
     gcomma(g, n, c)
     put(g, tkBracketRi, "]")
@@ -1059,7 +1066,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
       gcomma(g, n)
       put(g, tkBracketRi, "]")
   else: 
-    #nkNone, nkMetaNode, nkTableConstr, nkExplicitTypeListCall: 
+    #nkNone, nkMetaNode, nkExplicitTypeListCall: 
     InternalError(n.info, "rnimsyn.gsub(" & $n.kind & ')')
 
 proc renderTree(n: PNode, renderFlags: TRenderFlags = {}): string = 
diff --git a/lib/core/macros.nim b/lib/core/macros.nim
index 7f5dda1e5..e262ec012 100755
--- a/lib/core/macros.nim
+++ b/lib/core/macros.nim
@@ -1,7 +1,7 @@
 #

 #

 #            Nimrod's Runtime Library

-#        (c) Copyright 2009 Andreas Rumpf

+#        (c) Copyright 2011 Andreas Rumpf

 #

 #    See the file "copying.txt", included in this

 #    distribution, for details about the copyright.

@@ -13,25 +13,6 @@
 

 ## .. include:: ../doc/astspec.txt

 

-#[[[cog

-#def toEnum(name, elems):

-#  body = ""

-#  counter = 0

-#  for e in elems:

-#    if counter % 4 == 0: p = "\n    "

-#    else: p = ""

-#    body = body + p + 'n' + e + ', '

-#    counter = counter + 1

-#

-#  return ("  TNimrod%s* = enum%s\n  TNim%ss* = set[TNimrod%s]\n" %

-#            (name, body[:-2], name, name))

-#

-#enums = eval(open("data/ast.yml").read())

-#cog.out("type\n")

-#for key, val in enums.items():

-#  if key[-4:] == "Flag": continue

-#  cog.out(toEnum(key, val))

-#]]]

 type
   TNimrodNodeKind* = enum
     nnkNone, nnkEmpty, nnkIdent, nnkSym, 
@@ -86,7 +67,6 @@ type
     nskEnumField, nskForVar, nskModule, nskLabel, 
     nskStub
   TNimSymKinds* = set[TNimrodSymKind]
-#[[[end]]]

 

 type

   TNimrodIdent* = object of TObject