This commit is contained in:
Araq 2014-07-01 21:47:53 +02:00
commit 212293197f
3 changed files with 47 additions and 11 deletions

View file

@ -63,7 +63,7 @@ proc optInd*(p: var TParser, n: PNode)
proc indAndComment*(p: var TParser, n: PNode) proc indAndComment*(p: var TParser, n: PNode)
proc setBaseFlags*(n: PNode, base: TNumericalBase) proc setBaseFlags*(n: PNode, base: TNumericalBase)
proc parseSymbol*(p: var TParser, allowNil = false): PNode proc parseSymbol*(p: var TParser, allowNil = false): PNode
proc parseTry(p: var TParser): PNode proc parseTry(p: var TParser; isExpr: bool): PNode
proc parseCase(p: var TParser): PNode proc parseCase(p: var TParser): PNode
# implementation # implementation
@ -845,7 +845,7 @@ proc parseIdentColonEquals(p: var TParser, flags: TDeclaredIdentFlags): PNode =
addSon(result, parseTypeDesc(p)) addSon(result, parseTypeDesc(p))
else: else:
addSon(result, ast.emptyNode) addSon(result, ast.emptyNode)
if (p.tok.tokType != tkEquals) and not (withBothOptional in flags): if p.tok.tokType != tkEquals and withBothOptional notin flags:
parMessage(p, errColonOrEqualsExpected, p.tok) parMessage(p, errColonOrEqualsExpected, p.tok)
if p.tok.tokType == tkEquals: if p.tok.tokType == tkEquals:
getTok(p) getTok(p)
@ -1004,13 +1004,13 @@ proc parseExpr(p: var TParser): PNode =
#| expr = (ifExpr #| expr = (ifExpr
#| | whenExpr #| | whenExpr
#| | caseExpr #| | caseExpr
#| | tryStmt) #| | tryExpr)
#| / simpleExpr #| / simpleExpr
case p.tok.tokType: case p.tok.tokType:
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 tkCase: result = parseCase(p) of tkCase: result = parseCase(p)
of tkTry: result = parseTry(p) of tkTry: result = parseTry(p, isExpr=true)
else: result = simpleExpr(p) else: result = simpleExpr(p)
proc parseEnum(p: var TParser): PNode proc parseEnum(p: var TParser): PNode
@ -1363,22 +1363,25 @@ proc parseCase(p: var TParser): PNode =
if wasIndented: if wasIndented:
p.currInd = oldInd p.currInd = oldInd
proc parseTry(p: var TParser): PNode = proc parseTry(p: var TParser; isExpr: bool): PNode =
#| tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally') #| tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')
#| (IND{=}? 'except' exprList colcom stmt)* #| (IND{=}? 'except' exprList colcom stmt)*
#| (IND{=}? 'finally' colcom stmt)? #| (IND{=}? 'finally' colcom stmt)?
#| tryExpr = 'try' colcom stmt &(optInd 'except'|'finally')
#| (optInd 'except' exprList colcom stmt)*
#| (optInd 'finally' colcom stmt)?
result = newNodeP(nkTryStmt, p) result = newNodeP(nkTryStmt, p)
getTok(p) getTok(p)
eat(p, tkColon) eat(p, tkColon)
skipComment(p, result) skipComment(p, result)
addSon(result, parseStmt(p)) addSon(result, parseStmt(p))
var b: PNode = nil var b: PNode = nil
while sameOrNoInd(p): while sameOrNoInd(p) or isExpr:
case p.tok.tokType case p.tok.tokType
of tkExcept: of tkExcept:
b = newNodeP(nkExceptBranch, p) b = newNodeP(nkExceptBranch, p)
exprList(p, tkColon, b) exprList(p, tkColon, b)
of tkFinally: of tkFinally:
b = newNodeP(nkFinally, p) b = newNodeP(nkFinally, p)
getTokNoInd(p) getTokNoInd(p)
eat(p, tkColon) eat(p, tkColon)
@ -1877,7 +1880,7 @@ proc complexOrSimpleStmt(p: var TParser): PNode =
of tkIf: result = parseIfOrWhen(p, nkIfStmt) of tkIf: result = parseIfOrWhen(p, nkIfStmt)
of tkWhile: result = parseWhile(p) of tkWhile: result = parseWhile(p)
of tkCase: result = parseCase(p) of tkCase: result = parseCase(p)
of tkTry: result = parseTry(p) of tkTry: result = parseTry(p, isExpr=false)
of tkFinally: result = parseExceptBlock(p, nkFinally) of tkFinally: result = parseExceptBlock(p, nkFinally)
of tkExcept: result = parseExceptBlock(p, nkExceptBranch) of tkExcept: result = parseExceptBlock(p, nkExceptBranch)
of tkFor: result = parseFor(p) of tkFor: result = parseFor(p)

View file

@ -86,7 +86,7 @@ distinct = 'distinct' optInd typeDesc
expr = (ifExpr expr = (ifExpr
| whenExpr | whenExpr
| caseExpr | caseExpr
| tryStmt) | tryExpr)
/ simpleExpr / simpleExpr
typeKeyw = 'var' | 'ref' | 'ptr' | 'shared' | 'type' | 'tuple' typeKeyw = 'var' | 'ref' | 'ptr' | 'shared' | 'type' | 'tuple'
| 'proc' | 'iterator' | 'distinct' | 'object' | 'enum' | 'proc' | 'iterator' | 'distinct' | 'object' | 'enum'
@ -135,6 +135,9 @@ caseStmt = 'case' expr ':'? COMMENT?
tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally') tryStmt = 'try' colcom stmt &(IND{=}? 'except'|'finally')
(IND{=}? 'except' exprList colcom stmt)* (IND{=}? 'except' exprList colcom stmt)*
(IND{=}? 'finally' colcom stmt)? (IND{=}? 'finally' colcom stmt)?
tryExpr = 'try' colcom stmt &(optInd 'except'|'finally')
(optInd 'except' exprList colcom stmt)*
(optInd 'finally' colcom stmt)?
exceptBlock = 'except' colcom stmt exceptBlock = 'except' colcom stmt
forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt
blockStmt = 'block' symbol? colcom stmt blockStmt = 'block' symbol? colcom stmt

View file

@ -4,7 +4,8 @@ discard """
1244 1244
6 6
abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
145 23''' 145 23
3'''
""" """
import strutils import strutils
@ -92,3 +93,32 @@ proc parseResponse(): PJsonNode =
#bug #992 #bug #992
var se = @[1,2] var se = @[1,2]
let b = (se[1] = 1; 1) let b = (se[1] = 1; 1)
# bug #1161
type
PFooBase = ref object of PObject
field: int
PFoo[T] = ref object of PFooBase
field2: T
var testIf =
if true:
2
else:
3
var testCase =
case 8
of 8: 9
else: 10
var testTry =
try:
PFoo[string](field: 3, field2: "asfasf")
except:
PFooBase(field: 5)
echo(testTry.field)