comma expr
This commit is contained in:
parent
50969c6bb9
commit
8114d04fb9
@ -122,6 +122,7 @@ $ sh boot.sh
|
|||||||
| `&&` | 逻辑与 | 从左到右 |
|
| `&&` | 逻辑与 | 从左到右 |
|
||||||
| <code>||</code> | 逻辑或 | 从左到右 |
|
| <code>||</code> | 逻辑或 | 从左到右 |
|
||||||
| `=` | 赋值 | 从右到左 |
|
| `=` | 赋值 | 从右到左 |
|
||||||
|
| `,` | 逗号 | 从左到右 |
|
||||||
|
|
||||||
- 同级表达式的求值顺序与结合性一致。
|
- 同级表达式的求值顺序与结合性一致。
|
||||||
- 加减号支持整数之间,指针与整数,指针之间的运算。
|
- 加减号支持整数之间,指针与整数,指针之间的运算。
|
||||||
|
27
boot.c
27
boot.c
@ -22,7 +22,7 @@ const int TOKEN_EOF = 0;
|
|||||||
const int TOKEN_SEMICOLON = 1;
|
const int TOKEN_SEMICOLON = 1;
|
||||||
const int TOKEN_ADD = 2;
|
const int TOKEN_ADD = 2;
|
||||||
const int TOKEN_MINUS = 3;
|
const int TOKEN_MINUS = 3;
|
||||||
const int TOKEN_STAR = 4;
|
const int TOKEN_MUL = 4;
|
||||||
const int TOKEN_DIV = 5;
|
const int TOKEN_DIV = 5;
|
||||||
const int TOKEN_REM = 6;
|
const int TOKEN_REM = 6;
|
||||||
const int TOKEN_ASSIGN = 7;
|
const int TOKEN_ASSIGN = 7;
|
||||||
@ -277,7 +277,7 @@ void next_token() {
|
|||||||
token_type = TOKEN_MINUS;
|
token_type = TOKEN_MINUS;
|
||||||
}
|
}
|
||||||
} else if (ch == '*') {
|
} else if (ch == '*') {
|
||||||
token_type = TOKEN_STAR;
|
token_type = TOKEN_MUL;
|
||||||
} else if (ch == '/') {
|
} else if (ch == '/') {
|
||||||
int ch2 = getchar();
|
int ch2 = getchar();
|
||||||
if (ch2 == '/') {
|
if (ch2 == '/') {
|
||||||
@ -429,7 +429,7 @@ int parse_type() {
|
|||||||
int type = token_type & ~TYPE_TOKEN_MASK;
|
int type = token_type & ~TYPE_TOKEN_MASK;
|
||||||
next_token();
|
next_token();
|
||||||
ignore_const();
|
ignore_const();
|
||||||
if (token_type == TOKEN_STAR) {
|
if (token_type == TOKEN_MUL) {
|
||||||
next_token();
|
next_token();
|
||||||
ignore_const();
|
ignore_const();
|
||||||
type = type | TYPE_PTR_MASK;
|
type = type | TYPE_PTR_MASK;
|
||||||
@ -1011,6 +1011,8 @@ int addressof(int reg) {
|
|||||||
|
|
||||||
int parse_expr();
|
int parse_expr();
|
||||||
|
|
||||||
|
int parse_assign_expr();
|
||||||
|
|
||||||
int parse_function_call(int id) {
|
int parse_function_call(int id) {
|
||||||
const char* name = id_table + id_lut[id];
|
const char* name = id_table + id_lut[id];
|
||||||
if (global_marker[id] != MARKER_FUNCTION) {
|
if (global_marker[id] != MARKER_FUNCTION) {
|
||||||
@ -1029,7 +1031,7 @@ int parse_function_call(int id) {
|
|||||||
eprintf("too many arguments\n");
|
eprintf("too many arguments\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
args[arg++] = parse_expr();
|
args[arg++] = parse_assign_expr();
|
||||||
next_token();
|
next_token();
|
||||||
if (token_type == TOKEN_COMMA) {
|
if (token_type == TOKEN_COMMA) {
|
||||||
// continue;
|
// continue;
|
||||||
@ -1128,7 +1130,7 @@ int parse_prefix_expr() {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
return addressof(reg);
|
return addressof(reg);
|
||||||
} else if (token_type == TOKEN_STAR) {
|
} else if (token_type == TOKEN_MUL) {
|
||||||
int reg = parse_postfix_expr();
|
int reg = parse_postfix_expr();
|
||||||
int type = reg_type[reg];
|
int type = reg_type[reg];
|
||||||
if (!(type & TYPE_PTR_MASK)) {
|
if (!(type & TYPE_PTR_MASK)) {
|
||||||
@ -1167,7 +1169,7 @@ int parse_mul_expr() {
|
|||||||
int lhs = parse_prefix_expr();
|
int lhs = parse_prefix_expr();
|
||||||
while (1) {
|
while (1) {
|
||||||
next_token();
|
next_token();
|
||||||
if (token_type == TOKEN_STAR) {
|
if (token_type == TOKEN_MUL) {
|
||||||
int rhs = parse_prefix_expr();
|
int rhs = parse_prefix_expr();
|
||||||
lhs = asm_rr_arith("mul", lhs, rhs);
|
lhs = asm_rr_arith("mul", lhs, rhs);
|
||||||
} else if (token_type == TOKEN_DIV) {
|
} else if (token_type == TOKEN_DIV) {
|
||||||
@ -1384,7 +1386,18 @@ int parse_assign_expr() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int parse_expr() {
|
int parse_expr() {
|
||||||
return parse_assign_expr();
|
int lhs = parse_assign_expr();
|
||||||
|
while (1) {
|
||||||
|
next_token();
|
||||||
|
if (token_type == TOKEN_COMMA) {
|
||||||
|
int rhs = parse_assign_expr();
|
||||||
|
lhs = rhs;
|
||||||
|
} else {
|
||||||
|
unget_token();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_local_variable(int type) {
|
void parse_local_variable(int type) {
|
||||||
|
@ -12,6 +12,6 @@ int f1() {
|
|||||||
int main() {
|
int main() {
|
||||||
int a[15];
|
int a[15];
|
||||||
p = a;
|
p = a;
|
||||||
for (int i = 0; i < 15; ++i) a[i] = i;
|
for (int i = 0; i < 15; a[i] = i, ++i);
|
||||||
return f1();
|
return f1();
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user