Support for stmtListExpr in parser after major keywords. Scaled down version. (#10852)
* Support for stmtListExpr in parser after major keywords * fixes #4035
This commit is contained in:
parent
c19cd14fc9
commit
862897dc0f
4 changed files with 54 additions and 12 deletions
|
|
@ -238,6 +238,7 @@ proc newIdentNodeP(ident: PIdent, p: TParser): PNode =
|
|||
|
||||
proc parseExpr(p: var TParser): PNode
|
||||
proc parseStmt(p: var TParser): PNode
|
||||
proc parseStmtListExpr(p: var TParser): PNode
|
||||
proc parseTypeDesc(p: var TParser): PNode
|
||||
proc parseParamList(p: var TParser, retColon = true): PNode
|
||||
|
||||
|
|
@ -806,7 +807,8 @@ proc parseOperators(p: var TParser, headNode: PNode,
|
|||
var a = newNodeP(nkInfix, p)
|
||||
var opNode = newIdentNodeP(p.tok.ident, p) # skip operator:
|
||||
getTok(p)
|
||||
optInd(p, a)
|
||||
flexComment(p, a)
|
||||
optPar(p)
|
||||
# read sub-expression with higher priority:
|
||||
var b = simpleExprAux(p, opPrec + leftAssoc, modeB)
|
||||
addSon(a, opNode)
|
||||
|
|
@ -1479,12 +1481,12 @@ proc parseFromStmt(p: var TParser): PNode =
|
|||
#expectNl(p)
|
||||
|
||||
proc parseReturnOrRaise(p: var TParser, kind: TNodeKind): PNode =
|
||||
#| returnStmt = 'return' optInd expr?
|
||||
#| raiseStmt = 'raise' optInd expr?
|
||||
#| yieldStmt = 'yield' optInd expr?
|
||||
#| discardStmt = 'discard' optInd expr?
|
||||
#| breakStmt = 'break' optInd expr?
|
||||
#| continueStmt = 'break' optInd expr?
|
||||
#| returnStmt = 'return' stmtListExpr?
|
||||
#| raiseStmt = 'raise' stmtListExpr?
|
||||
#| yieldStmt = 'yield' stmtListExpr?
|
||||
#| discardStmt = 'discard' stmtListExpr?
|
||||
#| breakStmt = 'break' stmtListExpr?
|
||||
#| continueStmt = 'break' stmtListExpr?
|
||||
result = newNodeP(kind, p)
|
||||
getTok(p)
|
||||
if p.tok.tokType == tkComment:
|
||||
|
|
@ -1494,9 +1496,7 @@ proc parseReturnOrRaise(p: var TParser, kind: TNodeKind): PNode =
|
|||
# NL terminates:
|
||||
addSon(result, p.emptyNode)
|
||||
else:
|
||||
var e = parseExpr(p)
|
||||
e = postExprBlocks(p, e)
|
||||
addSon(result, e)
|
||||
addSon(result, parseStmtListExpr(p))
|
||||
|
||||
proc parseIfOrWhen(p: var TParser, kind: TNodeKind): PNode =
|
||||
#| condStmt = expr colcom stmt COMMENT?
|
||||
|
|
@ -2249,6 +2249,17 @@ proc parseStmt(p: var TParser): PNode =
|
|||
getTok(p)
|
||||
if err and p.tok.tokType == tkEof: break
|
||||
|
||||
proc parseStmtListExpr(p: var TParser): PNode =
|
||||
#| stmtListExpr = (IND{>} stmt) / expr
|
||||
if p.tok.indent > p.currInd:
|
||||
result = parseStmt(p)
|
||||
result.kind = nkStmtListExpr
|
||||
if result.len == 1:
|
||||
result = result[0]
|
||||
else:
|
||||
result = parseExpr(p)
|
||||
result = postExprBlocks(p, result)
|
||||
|
||||
proc parseAll(p: var TParser): PNode =
|
||||
## Parses the rest of the input stream held by the parser into a PNode.
|
||||
result = newNodeP(nkStmtList, p)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue