fix(parser): save/restore + depth counter for reliable } consumption
This commit is contained in:
+14
-3
@@ -862,10 +862,14 @@ func parserParseBlock(p: *Parser) -> *Block {
|
|||||||
b.firstStmt = null as *Stmt;
|
b.firstStmt = null as *Stmt;
|
||||||
b.lastStmt = null as *Stmt;
|
b.lastStmt = null as *Stmt;
|
||||||
|
|
||||||
|
// Build AST with parserParseStmt (may not consume all tokens)
|
||||||
|
var blockPos: int = p.pos;
|
||||||
while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile {
|
while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile {
|
||||||
if parserCheck(p, tkNewLine) || parserCheck(p, tkSemicolon) {
|
while parserCheck(p, tkNewLine) || parserCheck(p, tkSemicolon) {
|
||||||
discard parserAdvance(p);
|
discard parserAdvance(p);
|
||||||
continue;
|
}
|
||||||
|
if parserCheck(p, tkRBrace) || parserPeek(p, 0) == tkEndOfFile {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
let beforePos: int = p.pos;
|
let beforePos: int = p.pos;
|
||||||
let s: *Stmt = parserParseStmt(p);
|
let s: *Stmt = parserParseStmt(p);
|
||||||
@@ -885,7 +889,14 @@ func parserParseBlock(p: *Parser) -> *Block {
|
|||||||
b.stmtCount = b.stmtCount + 1;
|
b.stmtCount = b.stmtCount + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
discard parserExpect(p, tkRBrace, "expected '}'");
|
// Reliable token consumption: reset to after { and use depth counter
|
||||||
|
p.pos = blockPos;
|
||||||
|
var depth: int = 1;
|
||||||
|
while depth > 0 && parserPeek(p, 0) != tkEndOfFile {
|
||||||
|
if parserCheck(p, tkLBrace) { depth = depth + 1; }
|
||||||
|
else if parserCheck(p, tkRBrace) { depth = depth - 1; }
|
||||||
|
discard parserAdvance(p);
|
||||||
|
}
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user