summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-04-21 19:47:10 +0200
committerAraq <rumpf_a@web.de>2011-04-21 19:47:10 +0200
commitf00072fd554cffc2dd38ad57feb67107087c14bb (patch)
tree759a98f591164dd9b1ad7fee99fa76babd5688fc /compiler
parent36c67455d4d3e5fa5222937b800f90ef811d8e86 (diff)
downloadNim-f00072fd554cffc2dd38ad57feb67107087c14bb.tar.gz
grammar changes for table constructor: first part
Diffstat (limited to 'compiler')
-rwxr-xr-xcompiler/parser.nim41
1 files changed, 24 insertions, 17 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 871f486fc..c26b54531 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -7,7 +7,7 @@
 #    distribution, for details about the copyright.
 #
 
-# This module implements the parser of the standard Nimrod representation.
+# This module implements the parser of the standard Nimrod syntax.
 # The parser strictly reflects the grammar ("doc/grammar.txt"); however
 # it uses several helper routines to keep the parser small. A special
 # efficient algorithm is used for the precedence levels. The parser here can
@@ -259,13 +259,13 @@ proc dotdotExpr(p: var TParser, first: PNode): PNode =
   addSon(result, optExpr(p))
 
 proc indexExpr(p: var TParser): PNode = 
-  # indexExpr ::= '..' [expr] | expr ['=' expr | '..' expr]
-  if p.tok.tokType == tkDotDot: 
+  # indexExpr ::= '..' [expr] | expr ['=' expr]
+  if p.tok.tokType == tkDotDot:
     result = dotdotExpr(p, ast.emptyNode)
   else: 
-    var a = parseExpr(p)
-    case p.tok.tokType
-    of tkEquals: 
+    result = parseExpr(p)
+    if p.tok.tokType == tkEquals: 
+      var a = result
       result = newNodeP(nkExprEqExpr, p)
       addSon(result, a)
       getTok(p)
@@ -275,9 +275,6 @@ proc indexExpr(p: var TParser): PNode =
         var b = parseExpr(p)
         if p.tok.tokType == tkDotDot: b = dotdotExpr(p, b)
         addSon(result, b)
-    of tkDotDot: 
-      result = dotdotExpr(p, a)
-    else: result = a
   
 proc indexExprList(p: var TParser, first: PNode): PNode = 
   result = newNodeP(nkBracketExpr, p)
@@ -304,13 +301,13 @@ proc exprColonEqExpr(p: var TParser, kind: TNodeKind, tok: TTokType): PNode =
     addSon(result, parseExpr(p))
   else: 
     result = a
-  
-proc exprListAux(p: var TParser, elemKind: TNodeKind, endTok, sepTok: TTokType, 
-                 result: PNode) = 
+
+proc exprList(p: var TParser, endTok: TTokType, 
+              result: PNode) = 
   getTok(p)
   optInd(p, result)
   while (p.tok.tokType != endTok) and (p.tok.tokType != tkEof): 
-    var a = exprColonEqExpr(p, elemKind, sepTok)
+    var a = parseExpr(p)
     addSon(result, a)
     if p.tok.tokType != tkComma: break 
     getTok(p)
@@ -538,9 +535,19 @@ proc lowestExprAux(p: var TParser, v: var PNode, limit: int): PToken =
     opPrec = getPrecedence(nextop)
   result = op                 # return first untreated operator
   
-proc lowestExpr(p: var TParser): PNode = 
+proc otherExpr(p: var TParser): PNode = 
   discard lowestExprAux(p, result, - 1)
 
+proc lowestExpr(p: var TParser): PNode = 
+  result = otherExpr(p)
+  while p.tok.tokType == tkDotDot:
+    getTok(p)
+    optInd(p, result)
+    var a = result
+    result = newNodeP(nkRange, p)
+    addSon(result, a)
+    addSon(result, otherExpr(p))
+
 proc parseIfExpr(p: var TParser): PNode = 
   result = newNodeP(nkIfExpr, p)
   while true: 
@@ -769,7 +776,7 @@ proc parseExprStmt(p: var TParser): PNode =
         case p.tok.tokType
         of tkOf: 
           b = newNodeP(nkOfBranch, p)
-          exprListAux(p, nkRange, tkColon, tkDotDot, b)
+          exprList(p, tkColon, b)
         of tkElif: 
           b = newNodeP(nkElifBranch, p)
           getTok(p)
@@ -922,7 +929,7 @@ proc parseCase(p: var TParser): PNode =
     of tkOf: 
       if inElif: break 
       b = newNodeP(nkOfBranch, p)
-      exprListAux(p, nkRange, tkColon, tkDotDot, b)
+      exprList(p, tkColon, b)
     of tkElif: 
       inElif = true
       b = newNodeP(nkElifBranch, p)
@@ -1232,7 +1239,7 @@ proc parseObjectCase(p: var TParser): PNode =
     case p.tok.tokType
     of tkOf: 
       b = newNodeP(nkOfBranch, p)
-      exprListAux(p, nkRange, tkColon, tkDotDot, b)
+      exprList(p, tkColon, b)
     of tkElse: 
       b = newNodeP(nkElse, p)
       getTok(p)