Block expressions (#6695)

* enabled parsing of block expressions
* added test case; closes #3827
* adjusted grammar doc strings
* updated grammar in docs
This commit is contained in:
Fabian Keller 2017-11-06 20:33:01 +01:00 • committed by Andreas Rumpf
commit 40a6caeed8
3 changed files with 18 additions and 3 deletions

View file

@ -72,6 +72,7 @@ proc parseStmtPragma(p: var TParser): PNode
proc parsePragma(p: var TParser): PNode proc parsePragma(p: var TParser): PNode
proc postExprBlocks(p: var TParser, x: PNode): PNode proc postExprBlocks(p: var TParser, x: PNode): PNode
proc parseExprStmt(p: var TParser): PNode proc parseExprStmt(p: var TParser): PNode
proc parseBlock(p: var TParser): PNode
# implementation # implementation
proc getTok(p: var TParser) = proc getTok(p: var TParser) =
@ -1078,12 +1079,14 @@ proc parseTypeDescKAux(p: var TParser, kind: TNodeKind,
parseSymbolList(p, list) parseSymbolList(p, list)
proc parseExpr(p: var TParser): PNode = proc parseExpr(p: var TParser): PNode =
#| expr = (ifExpr #| expr = (blockExpr
#| | ifExpr
#| | whenExpr #| | whenExpr
#| | caseExpr #| | caseExpr
#| | tryExpr) #| | tryExpr)
#| / simpleExpr #| / simpleExpr
case p.tok.tokType: case p.tok.tokType:
of tkBlock: result = parseBlock(p)
of tkIf: result = parseIfExpr(p, nkIfExpr) of tkIf: result = parseIfExpr(p, nkIfExpr)
of tkWhen: result = parseIfExpr(p, nkWhenExpr) of tkWhen: result = parseIfExpr(p, nkWhenExpr)
of tkCase: result = parseCase(p) of tkCase: result = parseCase(p)
@ -1517,6 +1520,7 @@ proc parseFor(p: var TParser): PNode =
proc parseBlock(p: var TParser): PNode = proc parseBlock(p: var TParser): PNode =
#| blockStmt = 'block' symbol? colcom stmt #| blockStmt = 'block' symbol? colcom stmt
#| blockExpr = 'block' symbol? colcom stmt
result = newNodeP(nkBlockStmt, p) result = newNodeP(nkBlockStmt, p)
getTokNoInd(p) getTokNoInd(p)
if p.tok.tokType == tkColon: addSon(result, ast.emptyNode) if p.tok.tokType == tkColon: addSon(result, ast.emptyNode)

View file

@ -83,7 +83,8 @@ paramListColon = paramList? (':' optInd typeDesc)?
doBlock = 'do' paramListArrow pragmas? colcom stmt doBlock = 'do' paramListArrow pragmas? colcom stmt
procExpr = 'proc' paramListColon pragmas? ('=' COMMENT? stmt)? procExpr = 'proc' paramListColon pragmas? ('=' COMMENT? stmt)?
distinct = 'distinct' optInd typeDesc distinct = 'distinct' optInd typeDesc
expr = (ifExpr expr = (blockExpr
| ifExpr
| whenExpr | whenExpr
| caseExpr | caseExpr
| tryExpr) | tryExpr)
@ -141,6 +142,7 @@ tryExpr = 'try' colcom stmt &(optInd 'except'|'finally')
exceptBlock = 'except' colcom stmt exceptBlock = 'except' colcom stmt
forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt
blockStmt = 'block' symbol? colcom stmt blockStmt = 'block' symbol? colcom stmt
blockExpr = 'block' symbol? colcom stmt
staticStmt = 'static' colcom stmt staticStmt = 'static' colcom stmt
deferStmt = 'defer' colcom stmt deferStmt = 'defer' colcom stmt
asmStmt = 'asm' pragma? (STR_LIT | RSTR_LIT | TRIPLE_STR_LIT) asmStmt = 'asm' pragma? (STR_LIT | RSTR_LIT | TRIPLE_STR_LIT)

View file

@ -4,7 +4,8 @@ discard """
44 3 44 3
more body code more body code
yes yes
yes''' yes
block expression works'''
""" """
template x(body): untyped = template x(body): untyped =
@ -50,3 +51,11 @@ let format =
else: else:
echo "Texture Format Unknown, assuming RGB" #This echo causes an error echo "Texture Format Unknown, assuming RGB" #This echo causes an error
TextureInternalFormat.RGB TextureInternalFormat.RGB
# Block as expressions #3827
block:
let x = block:
var y = 2
echo "block expression works"
y*y
doAssert x == 4