summary refs log tree commit diff stats
path: root/compiler/parser.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-04-21 20:26:56 +0200
committerAraq <rumpf_a@web.de>2011-04-21 20:26:56 +0200
commit1985ac69951932d2882b63b13f9dcd853dd80c43 (patch)
treeee1c7d7344e16c504dee6776cf4c2df6f38b9c63 /compiler/parser.nim
parentf00072fd554cffc2dd38ad57feb67107087c14bb (diff)
downloadNim-1985ac69951932d2882b63b13f9dcd853dd80c43.tar.gz
grammar changes for table constructor: second part
Diffstat (limited to 'compiler/parser.nim')
-rwxr-xr-xcompiler/parser.nim20
1 files changed, 19 insertions, 1 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,