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:
parent
4c7dda37a2
commit
40a6caeed8
3 changed files with 18 additions and 3 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue