Fixed a bug with the 'do notation' consuming statements after it.

This commit is contained in:
Dominik Picheta
2013-01-20 12:47:25 +00:00
parent 9257c29ffd
commit b9d75f8944
2 changed files with 25 additions and 12 deletions

View File

@@ -389,7 +389,7 @@ proc parseGStrLit(p: var TParser, a: PNode): PNode =
else:
result = a
proc identOrLiteral(p: var TParser): PNode =
proc identOrLiteral(p: var TParser): PNode =
case p.tok.tokType
of tkSymbol:
result = newIdentNodeP(p.tok.ident, p)
@@ -494,12 +494,6 @@ proc primarySuffix(p: var TParser, r: PNode): PNode =
result = newNodeP(nkCall, p)
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)
@@ -736,7 +730,7 @@ proc parseProcExpr(p: var TParser, isExpr: bool): PNode =
proc isExprStart(p: TParser): bool =
case p.tok.tokType
of tkSymbol, tkAccent, tkOpr, tkNot, tkNil, tkCast, tkIf,
tkProc, tkIterator, tkBind,
tkProc, tkDo, tkIterator, tkBind,
tkParLe, tkBracketLe, tkCurlyLe, tkIntLit..tkCharLit, tkVar, tkRef, tkPtr,
tkTuple, tkObject, tkType, tkWhen, tkCase, tkShared:
result = true
@@ -832,6 +826,8 @@ proc primary(p: var TParser, mode: TPrimaryMode): PNode =
getTok(p)
optInd(p, result)
addSon(result, primary(p, pmNormal))
of tkDo:
result = parseDoBlock(p)
else:
result = identOrLiteral(p)
if mode != pmSkipSuffix:
@@ -856,7 +852,7 @@ proc parseExprStmt(p: var TParser): PNode =
var call = if a.kind == nkCall: a
else: newNode(nkCommand, a.info, @[a])
while true:
if not isExprStart(p): break
if not isExprStart(p): break
var e = parseExpr(p)
addSon(call, e)
if p.tok.tokType != tkComma: break
@@ -864,7 +860,7 @@ proc parseExprStmt(p: var TParser): PNode =
optInd(p, a)
if p.tok.tokType == tkDo:
parseDoBlocks(p, call)
return
return call
result = if call.sonsLen <= 1: a
else: call
if p.tok.tokType == tkColon:
@@ -1552,14 +1548,14 @@ proc parseAll(p: var TParser): PNode =
proc parseTopLevelStmt(p: var TParser): PNode =
result = ast.emptyNode
while true:
while true:
case p.tok.tokType
of tkSad, tkSemicolon: getTok(p)
of tkDed, tkInd:
parMessage(p, errInvalidIndentation)
getTok(p)
of tkEof: break
else:
else:
result = complexOrSimpleStmt(p)
if result.kind == nkEmpty: parMessage(p, errExprExpected, p.tok)
break

17
tests/run/tdomulttest.nim Normal file
View File

@@ -0,0 +1,17 @@
discard """
file: "tasynciossl.nim"
cmd: "nimrod cc --hints:on --define:ssl $# $#"
output: "555\ntest\nmulti lines\n99999999\nend"
"""
proc foo(bar, baz: proc (x: int): int) =
echo bar(555)
echo baz(99999999)
foo do (x: int) -> int:
return x
do (x: int) -> int:
echo("test")
echo("multi lines")
return x
echo("end")