@@ -34,6 +34,7 @@ static Node *equality(Token **rest, Token *tok);
34
34
static Node * relational (Token * * rest , Token * tok );
35
35
static Node * add (Token * * rest , Token * tok );
36
36
static Node * mul (Token * * rest , Token * tok );
37
+ static Node * postfix (Token * * rest , Token * tok );
37
38
static Node * unary (Token * * rest , Token * tok );
38
39
static Node * primary (Token * * rest , Token * tok );
39
40
@@ -446,7 +447,7 @@ static Node *mul(Token **rest, Token *tok) {
446
447
}
447
448
448
449
// unary = ("+" | "-" | "*" | "&") unary
449
- // | primary
450
+ // | postfix
450
451
static Node * unary (Token * * rest , Token * tok ) {
451
452
if (equal (tok , "+" ))
452
453
return unary (rest , tok -> next );
@@ -460,7 +461,22 @@ static Node *unary(Token **rest, Token *tok) {
460
461
if (equal (tok , "*" ))
461
462
return new_unary (ND_DEREF , unary (rest , tok -> next ), tok );
462
463
463
- return primary (rest , tok );
464
+ return postfix (rest , tok );
465
+ }
466
+
467
+ // postfix = primary ("[" expr "]")*
468
+ static Node * postfix (Token * * rest , Token * tok ) {
469
+ Node * node = primary (& tok , tok );
470
+
471
+ while (equal (tok , "[" )) {
472
+ // x[y] is short for *(x+y)
473
+ Token * start = tok ;
474
+ Node * idx = expr (& tok , tok -> next );
475
+ tok = skip (tok , "]" );
476
+ node = new_unary (ND_DEREF , new_add (node , idx , start ), start );
477
+ }
478
+ * rest = tok ;
479
+ return node ;
464
480
}
465
481
466
482
// funcall = ident "(" (assign ("," assign)*)? ")"
0 commit comments