pos array size
This commit is contained in:
parent
5784a90d7e
commit
4e591092db
64
boot.c
64
boot.c
@ -38,27 +38,18 @@ enum {
|
|||||||
// constants
|
// constants
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TOKEN_EOF,
|
TOKEN_EOF = -1,
|
||||||
TOKEN_SEMICOLON,
|
|
||||||
TOKEN_ADD,
|
TOKEN_ADD,
|
||||||
TOKEN_SUB,
|
TOKEN_SUB,
|
||||||
TOKEN_MUL,
|
TOKEN_MUL,
|
||||||
TOKEN_DIV,
|
TOKEN_DIV,
|
||||||
TOKEN_REM,
|
TOKEN_REM,
|
||||||
TOKEN_ASSIGN,
|
|
||||||
TOKEN_COMMA,
|
|
||||||
TOKEN_LSHIFT,
|
|
||||||
TOKEN_RSHIFT,
|
|
||||||
TOKEN_AND,
|
TOKEN_AND,
|
||||||
TOKEN_OR,
|
TOKEN_OR,
|
||||||
TOKEN_XOR,
|
TOKEN_XOR,
|
||||||
TOKEN_COMPL,
|
TOKEN_LSHIFT,
|
||||||
TOKEN_NOT,
|
TOKEN_RSHIFT,
|
||||||
TOKEN_LAND,
|
TOKEN_ASSIGN,
|
||||||
TOKEN_LOR,
|
|
||||||
TOKEN_ELLIPSIS,
|
|
||||||
TOKEN_INC,
|
|
||||||
TOKEN_DEC,
|
|
||||||
TOKEN_ADD_ASSIGN,
|
TOKEN_ADD_ASSIGN,
|
||||||
TOKEN_SUB_ASSIGN,
|
TOKEN_SUB_ASSIGN,
|
||||||
TOKEN_MUL_ASSIGN,
|
TOKEN_MUL_ASSIGN,
|
||||||
@ -69,15 +60,23 @@ enum {
|
|||||||
TOKEN_XOR_ASSIGN,
|
TOKEN_XOR_ASSIGN,
|
||||||
TOKEN_LSHIFT_ASSIGN,
|
TOKEN_LSHIFT_ASSIGN,
|
||||||
TOKEN_RSHIFT_ASSIGN,
|
TOKEN_RSHIFT_ASSIGN,
|
||||||
|
TOKEN_INV,
|
||||||
|
TOKEN_NOT,
|
||||||
|
TOKEN_LAND,
|
||||||
|
TOKEN_LOR,
|
||||||
|
TOKEN_INC,
|
||||||
|
TOKEN_DEC,
|
||||||
TOKEN_QUESTION,
|
TOKEN_QUESTION,
|
||||||
TOKEN_COLON,
|
TOKEN_COLON,
|
||||||
|
TOKEN_SEMICOLON,
|
||||||
|
TOKEN_COMMA,
|
||||||
|
TOKEN_ELLIPSIS,
|
||||||
TOKEN_EQ,
|
TOKEN_EQ,
|
||||||
TOKEN_NE,
|
TOKEN_NE,
|
||||||
TOKEN_LT,
|
TOKEN_LT,
|
||||||
TOKEN_GT,
|
TOKEN_GT,
|
||||||
TOKEN_LE,
|
TOKEN_LE,
|
||||||
TOKEN_GE,
|
TOKEN_GE,
|
||||||
|
|
||||||
TOKEN_PAREN_LEFT = 50,
|
TOKEN_PAREN_LEFT = 50,
|
||||||
TOKEN_PAREN_RIGHT,
|
TOKEN_PAREN_RIGHT,
|
||||||
TOKEN_BRACKET_LEFT,
|
TOKEN_BRACKET_LEFT,
|
||||||
@ -544,7 +543,7 @@ void next_token() {
|
|||||||
token_type = TOKEN_XOR;
|
token_type = TOKEN_XOR;
|
||||||
}
|
}
|
||||||
} else if (ch == '~') {
|
} else if (ch == '~') {
|
||||||
token_type = TOKEN_COMPL;
|
token_type = TOKEN_INV;
|
||||||
} else if (ch == '\'') {
|
} else if (ch == '\'') {
|
||||||
token_type = TOKEN_NUMBER;
|
token_type = TOKEN_NUMBER;
|
||||||
token_data = getchar();
|
token_data = getchar();
|
||||||
@ -641,14 +640,31 @@ char is_const[ID_LUT_SIZE];
|
|||||||
|
|
||||||
int expect_const() {
|
int expect_const() {
|
||||||
next_token();
|
next_token();
|
||||||
|
int value = 1;
|
||||||
|
if (token_type == TOKEN_ADD) {
|
||||||
|
next_token();
|
||||||
|
} else if (token_type == TOKEN_SUB) {
|
||||||
|
value = -1;
|
||||||
|
next_token();
|
||||||
|
}
|
||||||
if (token_type == TOKEN_NUMBER) {
|
if (token_type == TOKEN_NUMBER) {
|
||||||
return token_data;
|
value *= token_data;
|
||||||
|
} else if (token_type == TOKEN_ID && !local_table[token_data] && is_const[token_data]) {
|
||||||
|
value *= const_table[token_data];
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "expecting a constant\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
if (token_type == TOKEN_ID && !local_table[token_data] && is_const[token_data]) {
|
return value;
|
||||||
return const_table[token_data];
|
}
|
||||||
|
|
||||||
|
int expect_array_size() {
|
||||||
|
int size = expect_const();
|
||||||
|
if (size <= 0) {
|
||||||
|
fprintf(stderr, "array size must be positive\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
fprintf(stderr, "expecting a constant\n");
|
return size;
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset_reg() {
|
void reset_reg() {
|
||||||
@ -1272,10 +1288,12 @@ int parse_prefix_expr() {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
return dereference(reg);
|
return dereference(reg);
|
||||||
|
} else if (token_type == TOKEN_ADD) {
|
||||||
|
return parse_prefix_expr();
|
||||||
} else if (token_type == TOKEN_SUB) {
|
} else if (token_type == TOKEN_SUB) {
|
||||||
int reg = parse_prefix_expr();
|
int reg = parse_prefix_expr();
|
||||||
return asm_r_arith("neg", reg);
|
return asm_r_arith("neg", reg);
|
||||||
} else if (token_type == TOKEN_COMPL) {
|
} else if (token_type == TOKEN_INV) {
|
||||||
int reg = parse_prefix_expr();
|
int reg = parse_prefix_expr();
|
||||||
return asm_r_arith("not", reg);
|
return asm_r_arith("not", reg);
|
||||||
} else if (token_type == TOKEN_NOT) {
|
} else if (token_type == TOKEN_NOT) {
|
||||||
@ -1620,7 +1638,7 @@ void parse_local_variable(int type) {
|
|||||||
fprintf(stderr, "array of pointers is not supported\n");
|
fprintf(stderr, "array of pointers is not supported\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
int size = expect_const();
|
int size = expect_array_size();
|
||||||
expect_token(TOKEN_BRACKET_RIGHT);
|
expect_token(TOKEN_BRACKET_RIGHT);
|
||||||
declare_local_array(id, type, size);
|
declare_local_array(id, type, size);
|
||||||
return;
|
return;
|
||||||
@ -1886,7 +1904,7 @@ void parse_global_variable(int id, char* name, int type) {
|
|||||||
fprintf(stderr, "array of pointers is not supported\n");
|
fprintf(stderr, "array of pointers is not supported\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
int size = expect_const();
|
int size = expect_array_size();
|
||||||
expect_token(TOKEN_BRACKET_RIGHT);
|
expect_token(TOKEN_BRACKET_RIGHT);
|
||||||
int array_size = array_size_of(type, size);
|
int array_size = array_size_of(type, size);
|
||||||
printf(" .zero %d\n", array_size);
|
printf(" .zero %d\n", array_size);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
enum {
|
enum {
|
||||||
A, B, C = 1, D, E = A, F,
|
A, B, C = -B, D, E = +1, F,
|
||||||
};
|
};
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
return A + B + C + D + E + F;
|
return A + B + C + D + E + F;
|
||||||
// 0 + 1 + 1 + 2 + 0 + 1 = 5
|
// 0 + 1 + -1 + 0 + 1 + 2 = 3
|
||||||
}
|
}
|
@ -1 +1 @@
|
|||||||
5
|
3
|
||||||
|
@ -37,5 +37,5 @@ int main() {
|
|||||||
char placeholder[4096];
|
char placeholder[4096];
|
||||||
int a = 1;
|
int a = 1;
|
||||||
dummy((a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(! !0))))))))))))))))))))), 3, a, a, a, a, a, a);
|
dummy((a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(! !0))))))))))))))))))))), 3, a, a, a, a, a, a);
|
||||||
return (a=(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(~ ~0)))))))))))))))))))))), (a = a);
|
return (a=(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(~ ~0)))))))))))))))))))))), (a = +a);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user