summary refs log tree commit diff stats
path: root/compiler/parser.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/parser.nim')
-rwxr-xr-xcompiler/parser.nim29
1 files changed, 15 insertions, 14 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 4623b6eed..daa6f9b7f 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -700,10 +700,12 @@ proc parseDoBlock(p: var TParser): PNode =
   eat(p, tkColon)
   result = newNodeI(nkDo, info)
   addSon(result, ast.emptyNode)       # no name part
+  addSon(result, ast.emptyNode)       # no pattern part
   addSon(result, ast.emptyNode)       # no generic parameters
   addSon(result, params)
   addSon(result, pragmas)
   skipComment(p, result)
+  addSon(result, ast.emptyNode)       # no exception list
   addSon(result, parseStmt(p))
 
 proc parseDoBlocks(p: var TParser, call: PNode) =
@@ -720,14 +722,16 @@ proc parseProcExpr(p: var TParser, isExpr: bool): PNode =
   let hasSignature = p.tok.tokType in {tkParLe, tkColon}
   params = parseParamList(p)
   pragmas = optPragmas(p)
-  if (p.tok.tokType == tkEquals) and isExpr: 
+  if p.tok.tokType == tkEquals and isExpr: 
     result = newNodeI(nkLambda, info)
     addSon(result, ast.emptyNode)       # no name part
+    addSon(result, ast.emptyNode)       # no pattern
     addSon(result, ast.emptyNode)       # no generic parameters
     addSon(result, params)
     addSon(result, pragmas)
     getTok(p)
     skipComment(p, result)
+    addSon(result, ast.emptyNode)       # no exception list
     addSon(result, parseStmt(p))
   else: 
     result = newNodeI(nkProcTy, info)
@@ -961,23 +965,14 @@ proc parseYieldOrDiscard(p: var TParser, kind: TNodeKind): PNode =
   optInd(p, result)
   addSon(result, parseExpr(p))
 
-proc parseBreakOrContinue(p: var TParser, kind: TNodeKind): PNode = 
+proc parseBreakOrContinue(p: var TParser, kind: TNodeKind): PNode =
   result = newNodeP(kind, p)
   getTok(p)
   optInd(p, result)
   case p.tok.tokType
   of tkEof, tkSad, tkDed: addSon(result, ast.emptyNode)
   else: addSon(result, parseSymbol(p))
-  
-proc parseAs(p: var TParser): PNode =
-  result = newNodeP(nkPatternStmt, p)
-  getTok(p)                 # skip `as`
-  if p.tok.tokType == tkColon:
-    eat(p, tkColon)
-    addSon(result, parseStmt(p))
-  else:
-    addSon(result, parseExpr(p))
-  
+
 proc parseIfOrWhen(p: var TParser, kind: TNodeKind): PNode =
   result = newNodeP(kind, p)
   while true:
@@ -1175,17 +1170,24 @@ proc parseGenericParamList(p: var TParser): PNode =
   optPar(p)
   eat(p, tkBracketRi)
 
+proc parsePattern(p: var TParser): PNode =
+  eat(p, tkCurlyLe)
+  result = parseStmt(p)
+  eat(p, tkCurlyRi)
+
 proc parseRoutine(p: var TParser, kind: TNodeKind): PNode = 
   result = newNodeP(kind, p)
   getTok(p)
   optInd(p, result)
   addSon(result, identVis(p))
+  if p.tok.tokType == tkCurlyLe: addSon(result, parsePattern(p))
+  else: addSon(result, ast.emptyNode)
   if p.tok.tokType == tkBracketLe: addSon(result, parseGenericParamList(p))
   else: addSon(result, ast.emptyNode)
   addSon(result, parseParamList(p))
   if p.tok.tokType == tkCurlyDotLe: addSon(result, parsePragma(p))
   else: addSon(result, ast.emptyNode)
-  # empty pattern:
+  # empty exception tracking:
   addSon(result, ast.emptyNode)
   if p.tok.tokType == tkEquals: 
     getTok(p)
@@ -1522,7 +1524,6 @@ proc complexOrSimpleStmt(p: var TParser): PNode =
   of tkWhen: result = parseIfOrWhen(p, nkWhenStmt)
   of tkVar: result = parseSection(p, nkVarSection, parseVariable)
   of tkBind: result = parseBind(p)
-  of tkAs: result = parseAs(p)
   else: result = simpleStmt(p)
   
 proc parseStmt(p: var TParser): PNode =