mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
parse 'of' branches for macros properly
This commit is contained in:
@@ -1139,9 +1139,11 @@ proc parseMacroColon(p: var TParser, x: PNode): PNode =
|
||||
result = makeCall(result)
|
||||
getTok(p)
|
||||
skipComment(p, result)
|
||||
let stmtList = newNodeP(nkStmtList, p)
|
||||
if p.tok.tokType notin {tkOf, tkElif, tkElse, tkExcept}:
|
||||
let body = parseStmt(p)
|
||||
addSon(result, makeStmtList(body))
|
||||
stmtList.add body
|
||||
#addSon(result, makeStmtList(body))
|
||||
while sameInd(p):
|
||||
var b: PNode
|
||||
case p.tok.tokType
|
||||
@@ -1164,8 +1166,13 @@ proc parseMacroColon(p: var TParser, x: PNode): PNode =
|
||||
eat(p, tkColon)
|
||||
else: break
|
||||
addSon(b, parseStmt(p))
|
||||
addSon(result, b)
|
||||
addSon(stmtList, b)
|
||||
if b.kind == nkElse: break
|
||||
if stmtList.len == 1 and stmtList[0].kind == nkStmtList:
|
||||
# to keep backwards compatibility (see tests/vm/tstringnil)
|
||||
result.add stmtList[0]
|
||||
else:
|
||||
result.add stmtList
|
||||
|
||||
proc parseExprStmt(p: var TParser): PNode =
|
||||
#| exprStmt = simpleExpr
|
||||
|
||||
16
tests/macros/tlexerex.nim
Normal file
16
tests/macros/tlexerex.nim
Normal file
@@ -0,0 +1,16 @@
|
||||
|
||||
import macros
|
||||
|
||||
macro match*(s: cstring|string; pos: int; sections: untyped): untyped =
|
||||
for sec in sections.children:
|
||||
expectKind sec, nnkOfBranch
|
||||
expectLen sec, 2
|
||||
result = newStmtList()
|
||||
|
||||
when isMainModule:
|
||||
var input = "the input"
|
||||
var pos = 0
|
||||
match input, pos:
|
||||
of r"[a-zA-Z_]\w+": echo "an identifier"
|
||||
of r"\d+": echo "an integer"
|
||||
of r".": echo "something else"
|
||||
Reference in New Issue
Block a user