@@ -34,6 +34,7 @@ static Node *equality(Token **rest, Token *tok);
3434static Node * relational (Token * * rest , Token * tok );
3535static Node * add (Token * * rest , Token * tok );
3636static Node * mul (Token * * rest , Token * tok );
37+ static Node * postfix (Token * * rest , Token * tok );
3738static Node * unary (Token * * rest , Token * tok );
3839static Node * primary (Token * * rest , Token * tok );
3940
@@ -446,7 +447,7 @@ static Node *mul(Token **rest, Token *tok) {
446447}
447448
448449// unary = ("+" | "-" | "*" | "&") unary
449- // | primary
450+ // | postfix
450451static Node * unary (Token * * rest , Token * tok ) {
451452 if (equal (tok , "+" ))
452453 return unary (rest , tok -> next );
@@ -460,7 +461,22 @@ static Node *unary(Token **rest, Token *tok) {
460461 if (equal (tok , "*" ))
461462 return new_unary (ND_DEREF , unary (rest , tok -> next ), tok );
462463
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 ;
464480}
465481
466482// funcall = ident "(" (assign ("," assign)*)? ")"
0 commit comments