summary refs log tree commit diff stats
path: root/compiler/parser.nim
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2012-05-23 02:27:57 +0300
committerZahary Karadjov <zahary@gmail.com>2012-05-23 02:27:57 +0300
commit4f45097f87bdad0a610636ae0338c32520c72559 (patch)
tree0fd2de82c2430edbda5f7c4ac31ef282fbbd15bd /compiler/parser.nim
parentb1574bb0e00f0d2eeea610a79fb26e60f49f8aef (diff)
downloadNim-4f45097f87bdad0a610636ae0338c32520c72559.tar.gz
optional indentation for case statements
- preliminary support for try expressions  and case expressions
- allow do forms in assignments and return statements
Diffstat (limited to 'compiler/parser.nim')
-rwxr-xr-xcompiler/parser.nim25
1 files changed, 22 insertions, 3 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 13aaec41b..4baee5b43 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -57,6 +57,8 @@ proc optInd*(p: var TParser, n: PNode)
 proc indAndComment*(p: var TParser, n: PNode)
 proc setBaseFlags*(n: PNode, base: TNumericalBase)
 proc parseSymbol*(p: var TParser): PNode
+proc parseTry(p: var TParser): PNode
+proc parseCase(p: var TParser): PNode
 # implementation
 
 proc getTok(p: var TParser) = 
@@ -468,6 +470,11 @@ proc primarySuffix(p: var TParser, r: PNode): PNode =
       addSon(result, a)
       exprColonEqExprListAux(p, nkExprEqExpr, tkParRi, tkEquals, result)
       parseDoBlocks(p, result)
+    of tkDo:
+      var a = result
+      result = newNodeP(nkCall, p)
+      addSon(result, a)
+      parseDoBlocks(p, result)
     of tkDot:
       result = dotExpr(p, result)
       result = parseGStrLit(p, result)
@@ -704,6 +711,8 @@ proc parseExpr(p: var TParser): PNode =
   case p.tok.tokType:
   of tkIf: result = parseIfExpr(p, nkIfExpr)
   of tkWhen: result = parseIfExpr(p, nkWhenExpr)
+  of tkTry: result = parseTry(p)
+  of tkCase: result = parseCase(p)
   else: result = lowestExpr(p)
 
 proc primary(p: var TParser, skipSuffix = false): PNode = 
@@ -944,13 +953,19 @@ proc parseWhile(p: var TParser): PNode =
 proc parseCase(p: var TParser): PNode = 
   var 
     b: PNode
-    inElif: bool
+    inElif= false
+    wasIndented = false
   result = newNodeP(nkCaseStmt, p)
   getTok(p)
   addSon(result, parseExpr(p))
   if p.tok.tokType == tkColon: getTok(p)
   skipComment(p, result)
-  inElif = false
+  
+  if p.tok.tokType == tkInd:
+    pushInd(p.lex, p.tok.indent)
+    getTok(p)
+    wasIndented = true
+  
   while true: 
     if p.tok.tokType == tkSad: getTok(p)
     case p.tok.tokType
@@ -973,8 +988,12 @@ proc parseCase(p: var TParser): PNode =
     skipComment(p, b)
     addSon(b, parseStmt(p))
     addSon(result, b)
-    if b.kind == nkElse: break 
+    if b.kind == nkElse: break
   
+  if wasIndented:
+    eat(p, tkDed)
+    popInd(p.lex)
+
 proc parseTry(p: var TParser): PNode = 
   result = newNodeP(nkTryStmt, p)
   getTok(p)