Skip to content

Commit 5b2d571

Browse files
committed
Add arrays of arrays
1 parent c123e64 commit 5b2d571

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

parse.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,16 @@ static Type *func_params(Token **rest, Token *tok, Type *ty) {
125125
}
126126

127127
// type-suffix = "(" func-params
128-
// | "[" num "]"
128+
// | "[" num "]" type-suffix
129129
// | ε
130130
static Type *type_suffix(Token **rest, Token *tok, Type *ty) {
131131
if (equal(tok, "("))
132132
return func_params(rest, tok->next, ty);
133133

134134
if (equal(tok, "[")) {
135135
int sz = get_number(tok->next);
136-
*rest = skip(tok->next->next, "]");
136+
tok = skip(tok->next->next, "]");
137+
ty = type_suffix(rest, tok, ty);
137138
return array_of(ty, sz);
138139
}
139140

test.sh

+7
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,11 @@ assert 3 'int main() { int x[3]; *x=3; *(x+1)=4; *(x+2)=5; return *x; }'
118118
assert 4 'int main() { int x[3]; *x=3; *(x+1)=4; *(x+2)=5; return *(x+1); }'
119119
assert 5 'int main() { int x[3]; *x=3; *(x+1)=4; *(x+2)=5; return *(x+2); }'
120120

121+
assert 0 'int main() { int x[2][3]; int *y=x; *y=0; return **x; }'
122+
assert 1 'int main() { int x[2][3]; int *y=x; *(y+1)=1; return *(*x+1); }'
123+
assert 2 'int main() { int x[2][3]; int *y=x; *(y+2)=2; return *(*x+2); }'
124+
assert 3 'int main() { int x[2][3]; int *y=x; *(y+3)=3; return **(x+1); }'
125+
assert 4 'int main() { int x[2][3]; int *y=x; *(y+4)=4; return *(*(x+1)+1); }'
126+
assert 5 'int main() { int x[2][3]; int *y=x; *(y+5)=5; return *(*(x+1)+2); }'
127+
121128
echo OK

0 commit comments

Comments
 (0)