summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2012-04-18 14:06:26 +0300
committerZahary Karadjov <zahary@gmail.com>2012-04-18 19:50:32 +0300
commit818787457ddff20544323f6c21cd4e8dcc69d0c3 (patch)
tree5a72b7c5951f882e1dc85e4326287cc5b44dfd99 /compiler
parent38710b614f4b34b5c1564e9910a8f275d1ddcce9 (diff)
downloadNim-818787457ddff20544323f6c21cd4e8dcc69d0c3.tar.gz
grammar: the built-in type classes are now valid expressions
Diffstat (limited to 'compiler')
-rwxr-xr-xcompiler/parser.nim96
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: