wcc: delete parser backtracking remnants
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user