From 80fc13c8281c31c110366e1b4eb61e828fffe8c7 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Sun, 9 Aug 2026 04:25:36 +0900 Subject: [PATCH] wcc: delete parser backtracking remnants --- cmd/wcc/parse.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/cmd/wcc/parse.c b/cmd/wcc/parse.c index 0e31b020..95a34d8c 100644 --- a/cmd/wcc/parse.c +++ b/cmd/wcc/parse.c @@ -660,7 +660,6 @@ parseprimary(Parser *p) advance(p); while (p->cur.kind == TK_DOT && peek(p).kind == TK_IDENT) { advance(p); - n = (Node*)n; Node *mr = newnode(p->a, N_DOT, pp); mr->lhs = n; mr->str = p->cur.text; @@ -896,7 +895,7 @@ parseexpr_top(Parser *p) } static Node * -parselet(Parser *p, int top) +parselet(Parser *p) { Pos pp = p->cur.pos; int is_const = 0; @@ -931,7 +930,6 @@ parselet(Parser *p, int top) m->op = TK_CONST; for (Node *l = head; l; l = l->next) l->op = TK_CONST; } - (void)top; return m; } @@ -961,7 +959,6 @@ parselet(Parser *p, int top) m->op = TK_CONST; for (Node *l = head; l; l = l->next) l->op = TK_CONST; } - (void)top; return m; } @@ -969,7 +966,6 @@ parselet(Parser *p, int top) first->rhs = parseexpr(p); expect(p, TK_SEMI); if (is_const) first->op = TK_CONST; - (void)top; return first; } @@ -1022,11 +1018,7 @@ parsefor(Parser *p) /* First clause may be 'let' init or expr. If 'let' or terminated * by ';', it's a C-for. Otherwise it's just `for (cond)`. */ if (p->cur.kind == TK_LET) { - /* Disambiguate range form: `let IDENT .. expr`. We peek - * for IDENT then DOTDOT before committing to parselet. - * Tuple destructure: `let (a, b) .. expr`. */ - Tok save_cur = p->cur; - (void)save_cur; + /* Range and three-clause forms share the `let` prefix. */ advance(p); if (p->cur.kind == TK_LPAREN) { advance(p); @@ -1051,7 +1043,6 @@ parsefor(Parser *p) return parse_for_else(p, rng); } if (p->cur.kind == TK_IDENT || p->cur.kind == TK_UNDER) { - Pos ip = p->cur.pos; const char *nm = p->cur.text; int isunder = p->cur.kind == TK_UNDER; Tok la = peek(p); @@ -1063,7 +1054,6 @@ parsefor(Parser *p) rng->lhs = parseexpr(p); expect(p, TK_RPAREN); rng->body = parseblock(p); - (void)ip; return parse_for_else(p, rng); } } @@ -1163,7 +1153,7 @@ parsestmt(Parser *p) return b; } case TK_LET: - case TK_CONST: return parselet(p, 0); + case TK_CONST: return parselet(p); case TK_IF: { Node *n = parseif(p); expect(p, TK_SEMI); @@ -1510,7 +1500,7 @@ parsefile(Parser *p) case TK_TYPE: d = parsetypedecl(p, exp); break; case TK_FN: d = parsefn(p, exp, attrs); break; case TK_LET: - case TK_CONST: d = parselet(p, 1); d->export = exp; break; + case TK_CONST: d = parselet(p); d->export = exp; break; default: errorf(p->cur.pos, "expected top-level decl, got %s", tokname(p->cur.kind));