mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-20 22:35:24 +00:00
post expr blocks colon fix + correct grammar (#21983)
* post expr blocks colon fix + correct grammar fixes #21982 * fix dochelpers * this is remarkably common * use head for unchained * fix atlas * final grammar fix
This commit is contained in:
@@ -679,7 +679,7 @@ proc isNewerVersion(a, b: string): bool =
|
||||
result = (amajor, aminor) > (bmajor, bminor)
|
||||
|
||||
proc isLaterCommit(destDir, version: string): bool =
|
||||
let oldVersion = try: readFile(destDir / ThisVersion).strip: except: "0.0"
|
||||
let oldVersion = try: readFile(destDir / ThisVersion).strip except: "0.0"
|
||||
result = isNewerVersion(version, oldVersion)
|
||||
|
||||
proc traverseLoop(c: var AtlasContext; g: var DepGraph; startIsDep: bool): seq[CfgPath] =
|
||||
|
||||
@@ -436,7 +436,8 @@ proc colonOrEquals(p: var Parser, a: PNode): PNode =
|
||||
result = equals(p, a)
|
||||
|
||||
proc exprColonEqExpr(p: var Parser): PNode =
|
||||
#| exprColonEqExpr = expr (':'|'=' expr)?
|
||||
#| exprColonEqExpr = expr ((':'|'=') expr
|
||||
#| / doBlock extraPostExprBlock*)?
|
||||
var a = parseExpr(p)
|
||||
if p.tok.tokType == tkDo:
|
||||
result = postExprBlocks(p, a)
|
||||
@@ -444,7 +445,8 @@ proc exprColonEqExpr(p: var Parser): PNode =
|
||||
result = colonOrEquals(p, a)
|
||||
|
||||
proc exprEqExpr(p: var Parser): PNode =
|
||||
#| exprEqExpr = expr ('=' expr)?
|
||||
#| exprEqExpr = expr ('=' expr
|
||||
#| / doBlock extraPostExprBlock*)?
|
||||
var a = parseExpr(p)
|
||||
if p.tok.tokType == tkDo:
|
||||
result = postExprBlocks(p, a)
|
||||
@@ -647,7 +649,8 @@ proc parsePar(p: var Parser): PNode =
|
||||
#| ( &parKeyw (ifExpr / complexOrSimpleStmt) ^+ ';'
|
||||
#| | ';' (ifExpr / complexOrSimpleStmt) ^+ ';'
|
||||
#| | pragmaStmt
|
||||
#| | simpleExpr ( ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+ ';' )? )
|
||||
#| | simpleExpr ( (doBlock extraPostExprBlock*)
|
||||
#| | ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+ ';' )? )
|
||||
#| | (':' expr (',' exprColonEqExpr ^+ ',' )? ) ) )
|
||||
#| optPar ')'
|
||||
#
|
||||
@@ -1336,7 +1339,7 @@ proc primary(p: var Parser, mode: PrimaryMode): PNode =
|
||||
#| simplePrimary = SIGILLIKEOP? identOrLiteral primarySuffix*
|
||||
#| commandStart = &('`'|IDENT|literal|'cast'|'addr'|'type'|'var'|'out'|
|
||||
#| 'static'|'enum'|'tuple'|'object'|'proc')
|
||||
#| primary = simplePrimary (commandStart expr)
|
||||
#| primary = simplePrimary (commandStart expr (doBlock extraPostExprBlock*)?)?
|
||||
#| / operatorB primary
|
||||
#| / routineExpr
|
||||
#| / rawTypeDesc
|
||||
@@ -1441,7 +1444,7 @@ proc parseTypeDesc(p: var Parser, fullExpr = false): PNode =
|
||||
proc parseTypeDefValue(p: var Parser): PNode =
|
||||
#| typeDefValue = ((tupleDecl | enumDecl | objectDecl | conceptDecl |
|
||||
#| ('ref' | 'ptr' | 'distinct') (tupleDecl | objectDecl))
|
||||
#| / (simpleExpr (exprEqExpr ^+ comma postExprBlocks)?))
|
||||
#| / (simpleExpr (exprEqExpr ^+ comma postExprBlocks?)?))
|
||||
#| ('not' expr)?
|
||||
case p.tok.tokType
|
||||
of tkTuple: result = parseTuple(p, true)
|
||||
@@ -1478,12 +1481,13 @@ proc makeCall(n: PNode): PNode =
|
||||
result.add n
|
||||
|
||||
proc postExprBlocks(p: var Parser, x: PNode): PNode =
|
||||
#| postExprBlocks = ':' stmt? ( IND{=} doBlock
|
||||
#| | IND{=} 'of' exprList ':' stmt
|
||||
#| | IND{=} 'elif' expr ':' stmt
|
||||
#| | IND{=} 'except' optionalExprList ':' stmt
|
||||
#| | IND{=} 'finally' ':' stmt
|
||||
#| | IND{=} 'else' ':' stmt )*
|
||||
#| extraPostExprBlock = ( IND{=} doBlock
|
||||
#| | IND{=} 'of' exprList ':' stmt
|
||||
#| | IND{=} 'elif' expr ':' stmt
|
||||
#| | IND{=} 'except' optionalExprList ':' stmt
|
||||
#| | IND{=} 'finally' ':' stmt
|
||||
#| | IND{=} 'else' ':' stmt )
|
||||
#| postExprBlocks = (doBlock / ':' (extraPostExprBlock / stmt)) extraPostExprBlock*
|
||||
result = x
|
||||
if p.tok.indent >= 0: return
|
||||
|
||||
@@ -1500,7 +1504,7 @@ proc postExprBlocks(p: var Parser, x: PNode): PNode =
|
||||
result = makeCall(result)
|
||||
getTok(p)
|
||||
skipComment(p, result)
|
||||
if p.tok.tokType notin {tkOf, tkElif, tkElse, tkExcept, tkFinally}:
|
||||
if not (p.tok.tokType in {tkOf, tkElif, tkElse, tkExcept, tkFinally} and sameInd(p)):
|
||||
var stmtList = newNodeP(nkStmtList, p)
|
||||
stmtList.add parseStmt(p)
|
||||
# to keep backwards compatibility (see tests/vm/tstringnil)
|
||||
|
||||
@@ -28,8 +28,10 @@ operatorB = OP0 | OP1 | OP2 | OP3 | OP4 | OP5 | OP6 | OP7 | OP8 | OP9 |
|
||||
symbol = '`' (KEYW|IDENT|literal|(operator|'('|')'|'['|']'|'{'|'}'|'=')+)+ '`'
|
||||
| IDENT | 'addr' | 'type' | 'static'
|
||||
symbolOrKeyword = symbol | KEYW
|
||||
exprColonEqExpr = expr (':'|'=' expr)?
|
||||
exprEqExpr = expr ('=' expr)?
|
||||
exprColonEqExpr = expr ((':'|'=') expr
|
||||
/ doBlock extraPostExprBlock*)?
|
||||
exprEqExpr = expr ('=' expr
|
||||
/ doBlock extraPostExprBlock*)?
|
||||
exprList = expr ^+ comma
|
||||
optionalExprList = expr ^* comma
|
||||
exprColonEqExprList = exprColonEqExpr (comma exprColonEqExpr)* (comma)?
|
||||
@@ -43,7 +45,8 @@ par = '(' optInd
|
||||
( &parKeyw (ifExpr / complexOrSimpleStmt) ^+ ';'
|
||||
| ';' (ifExpr / complexOrSimpleStmt) ^+ ';'
|
||||
| pragmaStmt
|
||||
| simpleExpr ( ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+ ';' )? )
|
||||
| simpleExpr ( (doBlock extraPostExprBlock*)
|
||||
| ('=' expr (';' (ifExpr / complexOrSimpleStmt) ^+ ';' )? )
|
||||
| (':' expr (',' exprColonEqExpr ^+ ',' )? ) ) )
|
||||
optPar ')'
|
||||
literal = | INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT
|
||||
@@ -94,7 +97,7 @@ expr = (blockExpr
|
||||
simplePrimary = SIGILLIKEOP? identOrLiteral primarySuffix*
|
||||
commandStart = &('`'|IDENT|literal|'cast'|'addr'|'type'|'var'|'out'|
|
||||
'static'|'enum'|'tuple'|'object'|'proc')
|
||||
primary = simplePrimary (commandStart expr)
|
||||
primary = simplePrimary (commandStart expr (doBlock extraPostExprBlock*)?)?
|
||||
/ operatorB primary
|
||||
/ routineExpr
|
||||
/ rawTypeDesc
|
||||
@@ -106,14 +109,15 @@ typeDescExpr = (routineType / simpleExpr) ('not' expr)?
|
||||
typeDesc = rawTypeDesc / typeDescExpr
|
||||
typeDefValue = ((tupleDecl | enumDecl | objectDecl | conceptDecl |
|
||||
('ref' | 'ptr' | 'distinct') (tupleDecl | objectDecl))
|
||||
/ (simpleExpr (exprEqExpr ^+ comma postExprBlocks)?))
|
||||
/ (simpleExpr (exprEqExpr ^+ comma postExprBlocks?)?))
|
||||
('not' expr)?
|
||||
postExprBlocks = ':' stmt? ( IND{=} doBlock
|
||||
| IND{=} 'of' exprList ':' stmt
|
||||
| IND{=} 'elif' expr ':' stmt
|
||||
| IND{=} 'except' optionalExprList ':' stmt
|
||||
| IND{=} 'finally' ':' stmt
|
||||
| IND{=} 'else' ':' stmt )*
|
||||
extraPostExprBlock = ( IND{=} doBlock
|
||||
| IND{=} 'of' exprList ':' stmt
|
||||
| IND{=} 'elif' expr ':' stmt
|
||||
| IND{=} 'except' optionalExprList ':' stmt
|
||||
| IND{=} 'finally' ':' stmt
|
||||
| IND{=} 'else' ':' stmt )
|
||||
postExprBlocks = (doBlock / ':' (extraPostExprBlock / stmt)) extraPostExprBlock*
|
||||
exprStmt = simpleExpr postExprBlocks?
|
||||
/ simplePrimary (exprEqExpr ^+ comma) postExprBlocks?
|
||||
/ simpleExpr '=' optInd (expr postExprBlocks?)
|
||||
|
||||
@@ -288,7 +288,7 @@ proc match*(generated: LangSymbol, docLink: LangSymbol): bool =
|
||||
if g.`type` == d.name:
|
||||
onlyType = true # only types, not names, are provided in `docLink`
|
||||
if onlyType:
|
||||
result = g.`type` == d.name:
|
||||
result = g.`type` == d.name
|
||||
else:
|
||||
if d.`type` != "":
|
||||
result = g.`type` == d.`type`
|
||||
|
||||
@@ -1042,7 +1042,7 @@ template eventParser*(pegAst, handlers: untyped): (proc(s: string): int) =
|
||||
# by *mkHandlerTplts*.
|
||||
template mkDoEnter(hdPostf, s, pegNode, start) =
|
||||
when declared(`enter hdPostf`):
|
||||
`enter hdPostf`(s, pegNode, start):
|
||||
`enter hdPostf`(s, pegNode, start)
|
||||
else:
|
||||
discard
|
||||
let hdPostf = ident(substr(strVal(pegKind), 2))
|
||||
@@ -1053,7 +1053,7 @@ template eventParser*(pegAst, handlers: untyped): (proc(s: string): int) =
|
||||
# a grammar element of kind *pegKind*.
|
||||
template mkDoLeave(hdPostf, s, pegNode, start, length) =
|
||||
when declared(`leave hdPostf`):
|
||||
`leave hdPostf`(s, pegNode, start, length):
|
||||
`leave hdPostf`(s, pegNode, start, length)
|
||||
else:
|
||||
discard
|
||||
let hdPostf = ident(substr(strVal(pegKind), 2))
|
||||
|
||||
@@ -91,7 +91,8 @@ pkg "lockfreequeues"
|
||||
pkg "macroutils"
|
||||
pkg "manu"
|
||||
pkg "markdown"
|
||||
pkg "measuremancer", "nimble testDeps; nimble -y test"
|
||||
pkg "measuremancer", "nimble install -y unchained@#HEAD; nimble -y test"
|
||||
# when unchained is version 0.3.7 or higher, use `nimble testDeps;`
|
||||
pkg "memo"
|
||||
pkg "msgpack4nim", "nim c -r tests/test_spec.nim"
|
||||
pkg "nake", "nim c nakefile.nim"
|
||||
|
||||
@@ -40,7 +40,7 @@ when not defined(js) and not defined(nimscript):
|
||||
yield line
|
||||
template isMatch(lhsi, rhsi): bool =
|
||||
if allowPrefixMatch:
|
||||
startsWith(rhsi, lhsi):
|
||||
startsWith(rhsi, lhsi)
|
||||
else:
|
||||
lhsi == rhsi
|
||||
|
||||
|
||||
8
tests/parser/tifextracolon.nim
Normal file
8
tests/parser/tifextracolon.nim
Normal file
@@ -0,0 +1,8 @@
|
||||
# issue #21982
|
||||
|
||||
if true:
|
||||
if true:
|
||||
discard default int:
|
||||
else: #[tt.Error
|
||||
^ invalid indentation]#
|
||||
discard
|
||||
Reference in New Issue
Block a user