wcc: delete parser backtracking remnants

This commit is contained in:
2026-08-09 04:25:36 +09:00
parent c9425a3b46
commit 80fc13c828

View File

@@ -660,7 +660,6 @@ parseprimary(Parser *p)
advance(p); advance(p);
while (p->cur.kind == TK_DOT && peek(p).kind == TK_IDENT) { while (p->cur.kind == TK_DOT && peek(p).kind == TK_IDENT) {
advance(p); advance(p);
n = (Node*)n;
Node *mr = newnode(p->a, N_DOT, pp); Node *mr = newnode(p->a, N_DOT, pp);
mr->lhs = n; mr->lhs = n;
mr->str = p->cur.text; mr->str = p->cur.text;
@@ -896,7 +895,7 @@ parseexpr_top(Parser *p)
} }
static Node * static Node *
parselet(Parser *p, int top) parselet(Parser *p)
{ {
Pos pp = p->cur.pos; Pos pp = p->cur.pos;
int is_const = 0; int is_const = 0;
@@ -931,7 +930,6 @@ parselet(Parser *p, int top)
m->op = TK_CONST; m->op = TK_CONST;
for (Node *l = head; l; l = l->next) l->op = TK_CONST; for (Node *l = head; l; l = l->next) l->op = TK_CONST;
} }
(void)top;
return m; return m;
} }
@@ -961,7 +959,6 @@ parselet(Parser *p, int top)
m->op = TK_CONST; m->op = TK_CONST;
for (Node *l = head; l; l = l->next) l->op = TK_CONST; for (Node *l = head; l; l = l->next) l->op = TK_CONST;
} }
(void)top;
return m; return m;
} }
@@ -969,7 +966,6 @@ parselet(Parser *p, int top)
first->rhs = parseexpr(p); first->rhs = parseexpr(p);
expect(p, TK_SEMI); expect(p, TK_SEMI);
if (is_const) first->op = TK_CONST; if (is_const) first->op = TK_CONST;
(void)top;
return first; return first;
} }
@@ -1022,11 +1018,7 @@ parsefor(Parser *p)
/* First clause may be 'let' init or expr. If 'let' or terminated /* First clause may be 'let' init or expr. If 'let' or terminated
* by ';', it's a C-for. Otherwise it's just `for (cond)`. */ * by ';', it's a C-for. Otherwise it's just `for (cond)`. */
if (p->cur.kind == TK_LET) { if (p->cur.kind == TK_LET) {
/* Disambiguate range form: `let IDENT .. expr`. We peek /* Range and three-clause forms share the `let` prefix. */
* for IDENT then DOTDOT before committing to parselet.
* Tuple destructure: `let (a, b) .. expr`. */
Tok save_cur = p->cur;
(void)save_cur;
advance(p); advance(p);
if (p->cur.kind == TK_LPAREN) { if (p->cur.kind == TK_LPAREN) {
advance(p); advance(p);
@@ -1051,7 +1043,6 @@ parsefor(Parser *p)
return parse_for_else(p, rng); return parse_for_else(p, rng);
} }
if (p->cur.kind == TK_IDENT || p->cur.kind == TK_UNDER) { if (p->cur.kind == TK_IDENT || p->cur.kind == TK_UNDER) {
Pos ip = p->cur.pos;
const char *nm = p->cur.text; const char *nm = p->cur.text;
int isunder = p->cur.kind == TK_UNDER; int isunder = p->cur.kind == TK_UNDER;
Tok la = peek(p); Tok la = peek(p);
@@ -1063,7 +1054,6 @@ parsefor(Parser *p)
rng->lhs = parseexpr(p); rng->lhs = parseexpr(p);
expect(p, TK_RPAREN); expect(p, TK_RPAREN);
rng->body = parseblock(p); rng->body = parseblock(p);
(void)ip;
return parse_for_else(p, rng); return parse_for_else(p, rng);
} }
} }
@@ -1163,7 +1153,7 @@ parsestmt(Parser *p)
return b; return b;
} }
case TK_LET: case TK_LET:
case TK_CONST: return parselet(p, 0); case TK_CONST: return parselet(p);
case TK_IF: { case TK_IF: {
Node *n = parseif(p); Node *n = parseif(p);
expect(p, TK_SEMI); expect(p, TK_SEMI);
@@ -1510,7 +1500,7 @@ parsefile(Parser *p)
case TK_TYPE: d = parsetypedecl(p, exp); break; case TK_TYPE: d = parsetypedecl(p, exp); break;
case TK_FN: d = parsefn(p, exp, attrs); break; case TK_FN: d = parsefn(p, exp, attrs); break;
case TK_LET: 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: default:
errorf(p->cur.pos, "expected top-level decl, got %s", errorf(p->cur.pos, "expected top-level decl, got %s",
tokname(p->cur.kind)); tokname(p->cur.kind));