much simpler implementation of constant tuple declarations

This commit is contained in:
Andreas Rumpf 2018-12-19 11:11:33 +01:00
commit 3300c8a500
4 changed files with 33 additions and 55 deletions

View file

@ -222,8 +222,7 @@ type
nkState, # give a label to a code section (for iterators) nkState, # give a label to a code section (for iterators)
nkBreakState, # special break statement for easier code generation nkBreakState, # special break statement for easier code generation
nkFuncDef, # a func nkFuncDef, # a func
nkTupleConstr, # a tuple constructor nkTupleConstr # a tuple constructor
nkConstTuple # a ``const (a, b) = expr`` construct
TNodeKinds* = set[TNodeKind] TNodeKinds* = set[TNodeKind]

View file

@ -1764,43 +1764,6 @@ proc parseSection(p: var TParser, kind: TNodeKind,
else: else:
parMessage(p, errIdentifierExpected, p.tok) parMessage(p, errIdentifierExpected, p.tok)
proc parseConstTuple(p: var TParser): PNode =
result = newNodeP(nkConstTuple, p)
getTok(p) # skip '('
optInd(p, result)
while p.tok.tokType in {tkSymbol, tkAccent}:
addSon(result, identWithPragma(p))
if p.tok.tokType == tkColon:
getTok(p)
optInd(p, result)
addSon(result, parseTypeDesc(p))
if p.tok.tokType != tkComma: break
getTok(p)
addSon(result, p.emptyNode)
eat(p, tkParRi)
eat(p, tkEquals)
optInd(p, result)
addSon(result, parseExpr(p))
indAndComment(p, result)
proc parseConstant(p: var TParser): PNode =
#| constant = identWithPragma (colon typeDesc)? '=' optInd expr indAndComment
if p.tok.tokType == tkParLe: result = parseConstTuple(p)
else:
result = newNodeP(nkConstDef, p)
addSon(result, identWithPragma(p))
if p.tok.tokType == tkColon:
getTok(p)
optInd(p, result)
addSon(result, parseTypeDesc(p))
else:
addSon(result, p.emptyNode)
eat(p, tkEquals)
optInd(p, result)
addSon(result, parseExpr(p))
indAndComment(p, result)
proc parseEnum(p: var TParser): PNode = proc parseEnum(p: var TParser): PNode =
#| enum = 'enum' optInd (symbol optInd ('=' optInd expr COMMENT?)? comma?)+ #| enum = 'enum' optInd (symbol optInd ('=' optInd expr COMMENT?)? comma?)+
result = newNodeP(nkEnumTy, p) result = newNodeP(nkEnumTy, p)
@ -2057,6 +2020,23 @@ proc parseVariable(p: var TParser): PNode =
result[^1] = postExprBlocks(p, result[^1]) result[^1] = postExprBlocks(p, result[^1])
indAndComment(p, result) indAndComment(p, result)
proc parseConstant(p: var TParser): PNode =
#| constant = (parseVarTuple / identWithPragma) (colon typeDesc)? '=' optInd expr indAndComment
if p.tok.tokType == tkParLe: result = parseVarTuple(p)
else:
result = newNodeP(nkConstDef, p)
addSon(result, identWithPragma(p))
if p.tok.tokType == tkColon:
getTok(p)
optInd(p, result)
addSon(result, parseTypeDesc(p))
else:
addSon(result, p.emptyNode)
eat(p, tkEquals)
optInd(p, result)
addSon(result, parseExpr(p))
indAndComment(p, result)
proc parseBind(p: var TParser, k: TNodeKind): PNode = proc parseBind(p: var TParser, k: TNodeKind): PNode =
#| bindStmt = 'bind' optInd qualifiedIdent ^+ comma #| bindStmt = 'bind' optInd qualifiedIdent ^+ comma
#| mixinStmt = 'mixin' optInd qualifiedIdent ^+ comma #| mixinStmt = 'mixin' optInd qualifiedIdent ^+ comma

View file

@ -542,7 +542,7 @@ proc semConst(c: PContext, n: PNode): PNode =
var a = n.sons[i] var a = n.sons[i]
if c.config.cmd == cmdIdeTools: suggestStmt(c, a) if c.config.cmd == cmdIdeTools: suggestStmt(c, a)
if a.kind == nkCommentStmt: continue if a.kind == nkCommentStmt: continue
if a.kind notin {nkConstDef, nkConstTuple}: illFormedAst(a, c.config) if a.kind notin {nkConstDef, nkVarTuple}: illFormedAst(a, c.config)
checkMinSonsLen(a, 3, c.config) checkMinSonsLen(a, 3, c.config)
var length = sonsLen(a) var length = sonsLen(a)
@ -567,12 +567,12 @@ proc semConst(c: PContext, n: PNode): PNode =
continue continue
var b: PNode var b: PNode
if a.kind == nkConstTuple: if a.kind == nkVarTuple:
if typ.kind != tyTuple: if typ.kind != tyTuple:
localError(c.config, a.info, errXExpected, "tuple") localError(c.config, a.info, errXExpected, "tuple")
elif int(length/2) != sonsLen(typ): elif int(length/2) != sonsLen(typ):
localError(c.config, a.info, errWrongNumberOfVariables) localError(c.config, a.info, errWrongNumberOfVariables)
b = newNodeI(nkConstTuple, a.info) b = newNodeI(nkVarTuple, a.info)
newSons(b, length) newSons(b, length)
b.sons[length-2] = a.sons[length-2] b.sons[length-2] = a.sons[length-2]
b.sons[length-1] = def b.sons[length-1] = def
@ -584,7 +584,7 @@ proc semConst(c: PContext, n: PNode): PNode =
styleCheckDef(c.config, v) styleCheckDef(c.config, v)
onDef(a[j].info, v) onDef(a[j].info, v)
if a.kind != nkConstTuple: if a.kind != nkVarTuple:
setVarType(c, v, typ) setVarType(c, v, typ)
v.ast = def # no need to copy v.ast = def # no need to copy
b = newNodeI(nkConstDef, a.info) b = newNodeI(nkConstDef, a.info)

View file

@ -81,8 +81,7 @@ type
nnkState, nnkState,
nnkBreakState, nnkBreakState,
nnkFuncDef, nnkFuncDef,
nnkTupleConstr, nnkTupleConstr
nnkConstTuple
NimNodeKinds* = set[NimNodeKind] NimNodeKinds* = set[NimNodeKind]
NimTypeKind* = enum # some types are no longer used, see ast.nim NimTypeKind* = enum # some types are no longer used, see ast.nim