grammar fix: allow free-standing expressions such as type(foo) is bar
This commit is contained in:
parent
de64e8ec22
commit
63d93ad1ab
1 changed files with 19 additions and 4 deletions
|
|
@ -713,9 +713,11 @@ proc primarySuffix(p: var TParser, r: PNode): PNode =
|
||||||
break
|
break
|
||||||
|
|
||||||
proc primary(p: var TParser, mode: TPrimaryMode): PNode
|
proc primary(p: var TParser, mode: TPrimaryMode): PNode
|
||||||
|
proc simpleExprAux(p: var TParser, limit: int, mode: TPrimaryMode): PNode
|
||||||
|
|
||||||
proc simpleExprAux(p: var TParser, limit: int, mode: TPrimaryMode): PNode =
|
proc parseOperators(p: var TParser, headNode: PNode,
|
||||||
result = primary(p, mode)
|
limit: int, mode: TPrimaryMode): PNode =
|
||||||
|
result = headNode
|
||||||
# expand while operators have priorities higher than 'limit'
|
# expand while operators have priorities higher than 'limit'
|
||||||
var opPrec = getPrecedence(p.tok, p.strongSpaces)
|
var opPrec = getPrecedence(p.tok, p.strongSpaces)
|
||||||
let modeB = if mode == pmTypeDef: pmTypeDesc else: mode
|
let modeB = if mode == pmTypeDef: pmTypeDesc else: mode
|
||||||
|
|
@ -735,6 +737,10 @@ proc simpleExprAux(p: var TParser, limit: int, mode: TPrimaryMode): PNode =
|
||||||
result = a
|
result = a
|
||||||
opPrec = getPrecedence(p.tok, p.strongSpaces)
|
opPrec = getPrecedence(p.tok, p.strongSpaces)
|
||||||
|
|
||||||
|
proc simpleExprAux(p: var TParser, limit: int, mode: TPrimaryMode): PNode =
|
||||||
|
result = primary(p, mode)
|
||||||
|
result = parseOperators(p, result, limit, mode)
|
||||||
|
|
||||||
proc simpleExpr(p: var TParser, mode = pmNormal): PNode =
|
proc simpleExpr(p: var TParser, mode = pmNormal): PNode =
|
||||||
result = simpleExprAux(p, -1, mode)
|
result = simpleExprAux(p, -1, mode)
|
||||||
|
|
||||||
|
|
@ -1501,7 +1507,7 @@ proc parseSection(p: var TParser, kind: TNodeKind,
|
||||||
defparser: TDefParser): PNode =
|
defparser: TDefParser): PNode =
|
||||||
#| section(p) = COMMENT? p / (IND{>} (p / COMMENT)^+IND{=} DED)
|
#| section(p) = COMMENT? p / (IND{>} (p / COMMENT)^+IND{=} DED)
|
||||||
result = newNodeP(kind, p)
|
result = newNodeP(kind, p)
|
||||||
getTok(p)
|
if kind != nkTypeSection: getTok(p)
|
||||||
skipComment(p, result)
|
skipComment(p, result)
|
||||||
if realInd(p):
|
if realInd(p):
|
||||||
withInd(p):
|
withInd(p):
|
||||||
|
|
@ -1862,7 +1868,16 @@ proc complexOrSimpleStmt(p: var TParser): PNode =
|
||||||
of tkMacro: result = parseRoutine(p, nkMacroDef)
|
of tkMacro: result = parseRoutine(p, nkMacroDef)
|
||||||
of tkTemplate: result = parseRoutine(p, nkTemplateDef)
|
of tkTemplate: result = parseRoutine(p, nkTemplateDef)
|
||||||
of tkConverter: result = parseRoutine(p, nkConverterDef)
|
of tkConverter: result = parseRoutine(p, nkConverterDef)
|
||||||
of tkType: result = parseSection(p, nkTypeSection, parseTypeDef)
|
of tkType:
|
||||||
|
getTok(p)
|
||||||
|
if p.tok.tokType == tkParLe:
|
||||||
|
getTok(p)
|
||||||
|
result = newNodeP(nkTypeOfExpr, p)
|
||||||
|
result.addSon(primary(p, pmTypeDesc))
|
||||||
|
eat(p, tkParRi)
|
||||||
|
result = parseOperators(p, result, -1, pmNormal)
|
||||||
|
else:
|
||||||
|
result = parseSection(p, nkTypeSection, parseTypeDef)
|
||||||
of tkConst: result = parseSection(p, nkConstSection, parseConstant)
|
of tkConst: result = parseSection(p, nkConstSection, parseConstant)
|
||||||
of tkLet: result = parseSection(p, nkLetSection, parseVariable)
|
of tkLet: result = parseSection(p, nkLetSection, parseVariable)
|
||||||
of tkWhen: result = parseIfOrWhen(p, nkWhenStmt)
|
of tkWhen: result = parseIfOrWhen(p, nkWhenStmt)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue