grammar: the built-in type classes are now valid expressions
This commit is contained in:
parent
38710b614f
commit
818787457d
2 changed files with 35 additions and 63 deletions
|
|
@ -626,7 +626,8 @@ proc parseIdentColonEquals(p: var TParser, flags: TDeclaredIdentFlags): PNode =
|
||||||
proc parseTuple(p: var TParser): PNode =
|
proc parseTuple(p: var TParser): PNode =
|
||||||
result = newNodeP(nkTupleTy, p)
|
result = newNodeP(nkTupleTy, p)
|
||||||
getTok(p)
|
getTok(p)
|
||||||
eat(p, tkBracketLe)
|
if p.tok.tokType == tkBracketLe:
|
||||||
|
getTok(p)
|
||||||
optInd(p, result)
|
optInd(p, result)
|
||||||
while (p.tok.tokType == tkSymbol) or (p.tok.tokType == tkAccent):
|
while (p.tok.tokType == tkSymbol) or (p.tok.tokType == tkAccent):
|
||||||
var a = parseIdentColonEquals(p, {})
|
var a = parseIdentColonEquals(p, {})
|
||||||
|
|
@ -711,21 +712,33 @@ proc parseProcExpr(p: var TParser, isExpr: bool): PNode =
|
||||||
addSon(result, params)
|
addSon(result, params)
|
||||||
addSon(result, pragmas)
|
addSon(result, pragmas)
|
||||||
|
|
||||||
|
proc isExprStart(p: TParser): bool =
|
||||||
|
case p.tok.tokType
|
||||||
|
of tkSymbol, tkAccent, tkOpr, tkNot, tkNil, tkCast, tkIf, tkProc, tkBind,
|
||||||
|
tkParLe, tkBracketLe, tkCurlyLe, tkIntLit..tkCharLit, tkVar, tkRef, tkPtr,
|
||||||
|
tkTuple, tkType, tkWhen:
|
||||||
|
result = true
|
||||||
|
else: result = false
|
||||||
|
|
||||||
proc parseTypeDescKAux(p: var TParser, kind: TNodeKind): PNode =
|
proc parseTypeDescKAux(p: var TParser, kind: TNodeKind): PNode =
|
||||||
result = newNodeP(kind, p)
|
result = newNodeP(kind, p)
|
||||||
getTok(p)
|
getTok(p)
|
||||||
optInd(p, result)
|
optInd(p, result)
|
||||||
|
if isExprStart(p):
|
||||||
addSon(result, parseTypeDesc(p))
|
addSon(result, parseTypeDesc(p))
|
||||||
|
|
||||||
proc parseExpr(p: var TParser): PNode =
|
proc parseExpr(p: var TParser): PNode =
|
||||||
#
|
#
|
||||||
#expr ::= lowestExpr
|
#expr ::= lowestExpr
|
||||||
# | 'if' expr ':' expr ('elif' expr ':' expr)* 'else' ':' expr
|
# | 'if' expr ':' expr ('elif' expr ':' expr)* 'else' ':' expr
|
||||||
# | 'var' expr
|
# | 'var' [expr]
|
||||||
# | 'ref' expr
|
# | 'ref' [expr]
|
||||||
# | 'ptr' expr
|
# | 'ptr' [expr]
|
||||||
# | 'type' expr
|
# | 'type' expr
|
||||||
# | 'tuple' tupleDesc
|
# | 'tuple' [tupleDesc]
|
||||||
|
# | 'enum'
|
||||||
|
# | 'object'
|
||||||
|
# |
|
||||||
# | 'proc' paramList [pragma] ['=' stmt]
|
# | 'proc' paramList [pragma] ['=' stmt]
|
||||||
#
|
#
|
||||||
case p.tok.toktype
|
case p.tok.toktype
|
||||||
|
|
@ -737,20 +750,18 @@ proc parseExpr(p: var TParser): PNode =
|
||||||
of tkProc: result = parseProcExpr(p, true)
|
of tkProc: result = parseProcExpr(p, true)
|
||||||
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 tkEnum:
|
||||||
|
result = newNodeP(nkEnumTy, p)
|
||||||
|
getTok(p)
|
||||||
|
of tkObject:
|
||||||
|
result = newNodeP(nkObjectTy, p)
|
||||||
|
getTok(p)
|
||||||
else: result = lowestExpr(p)
|
else: result = lowestExpr(p)
|
||||||
|
|
||||||
proc parseTypeDesc(p: var TParser): PNode =
|
proc parseTypeDesc(p: var TParser): PNode =
|
||||||
if p.tok.toktype == tkProc: result = parseProcExpr(p, false)
|
if p.tok.toktype == tkProc: result = parseProcExpr(p, false)
|
||||||
else: result = parseExpr(p)
|
else: result = parseExpr(p)
|
||||||
|
|
||||||
proc isExprStart(p: TParser): bool =
|
|
||||||
case p.tok.tokType
|
|
||||||
of tkSymbol, tkAccent, tkOpr, tkNot, tkNil, tkCast, tkIf, tkProc, tkBind,
|
|
||||||
tkParLe, tkBracketLe, tkCurlyLe, tkIntLit..tkCharLit, tkVar, tkRef, tkPtr,
|
|
||||||
tkTuple, tkType, tkWhen:
|
|
||||||
result = true
|
|
||||||
else: result = false
|
|
||||||
|
|
||||||
proc parseExprStmt(p: var TParser): PNode =
|
proc parseExprStmt(p: var TParser): PNode =
|
||||||
var a = lowestExpr(p)
|
var a = lowestExpr(p)
|
||||||
if p.tok.tokType == tkEquals:
|
if p.tok.tokType == tkEquals:
|
||||||
|
|
@ -1042,45 +1053,6 @@ proc parseAsm(p: var TParser): PNode =
|
||||||
return
|
return
|
||||||
getTok(p)
|
getTok(p)
|
||||||
|
|
||||||
proc parseGenericConstraint(p: var TParser): PNode =
|
|
||||||
case p.tok.tokType
|
|
||||||
of tkObject:
|
|
||||||
result = newNodeP(nkObjectTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkTuple:
|
|
||||||
result = newNodeP(nkTupleTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkEnum:
|
|
||||||
result = newNodeP(nkEnumTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkProc:
|
|
||||||
result = newNodeP(nkProcTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkVar:
|
|
||||||
result = newNodeP(nkVarTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkPtr:
|
|
||||||
result = newNodeP(nkPtrTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkRef:
|
|
||||||
result = newNodeP(nkRefTy, p)
|
|
||||||
getTok(p)
|
|
||||||
of tkDistinct:
|
|
||||||
result = newNodeP(nkDistinctTy, p)
|
|
||||||
getTok(p)
|
|
||||||
else: result = primary(p)
|
|
||||||
|
|
||||||
proc parseGenericConstraintList(p: var TParser): PNode =
|
|
||||||
result = parseGenericConstraint(p)
|
|
||||||
while p.tok.tokType == tkOpr:
|
|
||||||
var a = result
|
|
||||||
result = newNodeP(nkInfix, p)
|
|
||||||
addSon(result, newIdentNodeP(p.tok.ident, p))
|
|
||||||
addSon(result, a)
|
|
||||||
getTok(p)
|
|
||||||
optInd(p, result)
|
|
||||||
addSon(result, parseGenericConstraint(p))
|
|
||||||
|
|
||||||
proc parseGenericParam(p: var TParser): PNode =
|
proc parseGenericParam(p: var TParser): PNode =
|
||||||
var a: PNode
|
var a: PNode
|
||||||
result = newNodeP(nkIdentDefs, p)
|
result = newNodeP(nkIdentDefs, p)
|
||||||
|
|
@ -1097,7 +1069,7 @@ proc parseGenericParam(p: var TParser): PNode =
|
||||||
if p.tok.tokType == tkColon:
|
if p.tok.tokType == tkColon:
|
||||||
getTok(p)
|
getTok(p)
|
||||||
optInd(p, result)
|
optInd(p, result)
|
||||||
addSon(result, parseGenericConstraintList(p))
|
addSon(result, parseExpr(p))
|
||||||
else:
|
else:
|
||||||
addSon(result, ast.emptyNode)
|
addSon(result, ast.emptyNode)
|
||||||
if p.tok.tokType == tkEquals:
|
if p.tok.tokType == tkEquals:
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
import uclosures, utemplates, uexpr
|
import uclosures, utemplates
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue