From c2e9107ac74e32479acd2faee4bc346236534620 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Mon, 5 Aug 2019 23:56:37 +0900 Subject: [PATCH] Add arrays of arrays --- parse.c | 5 +++-- test.sh | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/parse.c b/parse.c index 55be052..30dc328 100644 --- a/parse.c +++ b/parse.c @@ -125,7 +125,7 @@ static Type *func_params(Token **rest, Token *tok, Type *ty) { } // type-suffix = "(" func-params -// | "[" num "]" +// | "[" num "]" type-suffix // | ε static Type *type_suffix(Token **rest, Token *tok, Type *ty) { if (equal(tok, "(")) @@ -133,7 +133,8 @@ static Type *type_suffix(Token **rest, Token *tok, Type *ty) { if (equal(tok, "[")) { int sz = get_number(tok->next); - *rest = skip(tok->next->next, "]"); + tok = skip(tok->next->next, "]"); + ty = type_suffix(rest, tok, ty); return array_of(ty, sz); } diff --git a/test.sh b/test.sh index f00f782..27eda79 100755 --- a/test.sh +++ b/test.sh @@ -117,4 +117,11 @@ assert 3 'int main() { int x[3]; *x=3; *(x+1)=4; *(x+2)=5; return *x; }' assert 4 'int main() { int x[3]; *x=3; *(x+1)=4; *(x+2)=5; return *(x+1); }' assert 5 'int main() { int x[3]; *x=3; *(x+1)=4; *(x+2)=5; return *(x+2); }' +assert 0 'int main() { int x[2][3]; int *y=x; *y=0; return **x; }' +assert 1 'int main() { int x[2][3]; int *y=x; *(y+1)=1; return *(*x+1); }' +assert 2 'int main() { int x[2][3]; int *y=x; *(y+2)=2; return *(*x+2); }' +assert 3 'int main() { int x[2][3]; int *y=x; *(y+3)=3; return **(x+1); }' +assert 4 'int main() { int x[2][3]; int *y=x; *(y+4)=4; return *(*(x+1)+1); }' +assert 5 'int main() { int x[2][3]; int *y=x; *(y+5)=5; return *(*(x+1)+2); }' + echo OK -- GitLab