diff options
author | Zahary Karadjov <zahary@gmail.com> | 2012-04-18 14:06:26 +0300 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2012-04-18 19:50:32 +0300 |
commit | 818787457ddff20544323f6c21cd4e8dcc69d0c3 (patch) | |
tree | 5a72b7c5951f882e1dc85e4326287cc5b44dfd99 /compiler | |
parent | 38710b614f4b34b5c1564e9910a8f275d1ddcce9 (diff) | |
download | Nim-818787457ddff20544323f6c21cd4e8dcc69d0c3.tar.gz |
grammar: the built-in type classes are now valid expressions
Diffstat (limited to 'compiler')
-rwxr-xr-x | compiler/parser.nim | 96 |
1 files changed, 34 insertions, 62 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim index 952101455..78e5b2455 100755 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -626,16 +626,17 @@ proc parseIdentColonEquals(p: var TParser, flags: TDeclaredIdentFlags): PNode = proc parseTuple(p: var TParser): PNode = result = newNodeP(nkTupleTy, p) getTok(p) - eat(p, tkBracketLe) - optInd(p, result) - while (p.tok.tokType == tkSymbol) or (p.tok.tokType == tkAccent): - var a = parseIdentColonEquals(p, {}) - addSon(result, a) - if p.tok.tokType != tkComma: break + if p.tok.tokType == tkBracketLe: getTok(p) - optInd(p, a) - optPar(p) - eat(p, tkBracketRi) + optInd(p, result) + while (p.tok.tokType == tkSymbol) or (p.tok.tokType == tkAccent): + var a = parseIdentColonEquals(p, {}) + addSon(result, a) + if p.tok.tokType != tkComma: break + getTok(p) + optInd(p, a) + optPar(p) + eat(p, tkBracketRi) proc parseParamList(p: var TParser, retColon = true): PNode = var a: PNode @@ -711,21 +712,33 @@ proc parseProcExpr(p: var TParser, isExpr: bool): PNode = addSon(result, params) 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 = result = newNodeP(kind, p) getTok(p) optInd(p, result) - addSon(result, parseTypeDesc(p)) + if isExprStart(p): + addSon(result, parseTypeDesc(p)) proc parseExpr(p: var TParser): PNode = # #expr ::= lowestExpr # | 'if' expr ':' expr ('elif' expr ':' expr)* 'else' ':' expr - # | 'var' expr - # | 'ref' expr - # | 'ptr' expr + # | 'var' [expr] + # | 'ref' [expr] + # | 'ptr' [expr] # | 'type' expr - # | 'tuple' tupleDesc + # | 'tuple' [tupleDesc] + # | 'enum' + # | 'object' + # | # | 'proc' paramList [pragma] ['=' stmt] # case p.tok.toktype @@ -737,20 +750,18 @@ proc parseExpr(p: var TParser): PNode = of tkProc: result = parseProcExpr(p, true) of tkIf: result = parseIfExpr(p, nkIfExpr) 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) proc parseTypeDesc(p: var TParser): PNode = if p.tok.toktype == tkProc: result = parseProcExpr(p, false) 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 = var a = lowestExpr(p) if p.tok.tokType == tkEquals: @@ -1042,45 +1053,6 @@ proc parseAsm(p: var TParser): PNode = return 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 = var a: PNode result = newNodeP(nkIdentDefs, p) @@ -1097,7 +1069,7 @@ proc parseGenericParam(p: var TParser): PNode = if p.tok.tokType == tkColon: getTok(p) optInd(p, result) - addSon(result, parseGenericConstraintList(p)) + addSon(result, parseExpr(p)) else: addSon(result, ast.emptyNode) if p.tok.tokType == tkEquals: |